Flip-Flop attivato sul bordo di due segnali
Domanda
Ho bisogno di un flip flop che reagisce sui bordi di due segnali diversi.Qualcosa di simile a questo:
if(rising_edge(sig1)) then
bit <= '0';
elsif(rising_edge(sig2)) then
bit <= '1';
end if;
Fa un flip flop esiste o c'è qualche altra tecnica potrei usare?Ho bisogno di questo per essere synthesizable su un Xilinx Virtex-5 FPGA.Grazie
Soluzione
Quello che ero solito fare in questo caso è quello di mantenere un ritardo versione di entrambi i segnali di controllo e di generare un impulso di un orologio ampia al fronte di salita del segnale.Vorrei quindi utilizzare questi impulsi per auto un piccolo FSM per generare il 'bit' di segnale.Ecco alcune VHDL di seguito.
-- -*-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 stackoverflow_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 stackoverflow_edges;
architecture rtl of stackoverflow_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;
Io sto molto più comodo in verilog, quindi fare doppio controllare questo VHDL (eventuali commenti apprezzato).
le forme d'onda http://img33.imageshack.us/img33/893/stackoverflowvhdlq.png
Questo codice si presuppone che l'orologio è abbastanza veloce per catturare tutti i segnali di controllo degli impulsi.Se i segnali di controllo non sono in sincrono con il clock, mi piacerebbe tenere un ulteriori in ritardo versione del ritardo del segnale di controllo (es. sig_d2
) poi le bandiere da sig_d1
e sig_d2
.