Триггер срабатывает на грани двух сигналов
Мне нужен триггер, который реагирует на края двух разных сигналов. Что-то вроде этого:
if(rising_edge(sig1)) then
bit <= '0';
elsif(rising_edge(sig2)) then
bit <= '1';
end if;
Существует ли такой триггер или есть какая-то другая техника, которую я мог бы использовать? Мне нужно, чтобы это можно было синтезировать на ПЛИС Xilinx Virtex-5. Спасибо
1 ответ
В этом случае я бы обычно использовал задержанную версию обоих сигналов управления и генерировал импульс шириной в один такт на переднем фронте каждого сигнала. Затем я использовал бы эти импульсы для управления крошечным автоматом управления двигателем для генерации "битового" сигнала. Вот некоторые VHDL ниже.
-- -*-vhdl-*-
-- Finding edges of control signals and using the
-- edges to control the state of an output variable
--
library ieee;
use ieee.std_logic_1164.all;
entity stackru_edges is
port ( clk : in std_ulogic;
rst : in std_ulogic;
sig1 : in std_ulogic;
sig2 : in std_ulogic;
bito : out std_ulogic );
end entity stackru_edges;
architecture rtl of stackru_edges is
signal sig1_d1 , sig2_d1 : std_ulogic;
signal sig1_rise, sig2_rise : std_ulogic;
begin
-- Flops to store a delayed version of the control signals
-- If the contorl signals are not synchronous with clk,
-- consider using a bank of 2 delays and using those outputs
-- to generate the edge flags
delay_regs: process ( clk ) is
begin
if rising_edge(clk) then
if rst = '1' then
sig1_d1 <= '0';
sig2_d1 <= '0';
else
sig1_d1 <= sig1;
sig2_d1 <= sig2;
end if;
end if;
end process delay_regs;
-- Edge flags
edge_flags: process (sig1, sig1_d1, sig2, sig2_d1) is
begin
sig1_rise <= sig1 and not sig1_d1;
sig2_rise <= sig2 and not sig2_d1;
end process edge_flags;
-- Output control bit
output_ctrl: process (clk) is
begin
if rst = '1' then
bito <= '0';
elsif sig1_rise = '1' then
bito <= '1';
elsif sig2_rise = '1' then
bito <= '0';
end if;
end process output_ctrl;
end rtl;
Мне гораздо удобнее в verilog, так что дважды проверьте этот VHDL (любые комментарии приветствуются).
http://img33.imageshack.us/img33/893/stackruvhdlq.png
Этот код предполагает, что часы достаточно быстрые, чтобы захватить все импульсы управляющего сигнала. Если сигналы управления не синхронизированы с часами, я бы сохранил более позднюю версию отложенного сигнала управления (например, sig_d2
) затем сделайте флаги из sig_d1
а также sig_d2
,