Flip-Flop ausgelöst am Rande von zwei Signalen
Frage
Ich brauche ein Flip-Flop, das an den Rändern zweier unterschiedlicher Signale reagiert. So etwas wie folgt aus:
if(rising_edge(sig1)) then
bit <= '0';
elsif(rising_edge(sig2)) then
bit <= '1';
end if;
Gibt es eine solche Flip-Flop vorhanden ist oder gibt es eine andere Technik, die ich verwenden könnte? Ich brauche diese synthetisierbaren auf einem Xilinx Virtex-5-FPGA zu sein. Dank
Lösung
Was würde ich in der Regel in diesem Fall zu tun ist eine verzögerte Version der beiden Steuersignale zu halten und einen Impuls eines Takt breit an der ansteigenden Flanke jedes Signal zu erzeugen. Ich würde dann diese Impulse verwenden, um eine winzige FSM zum Antrieb des ‚Bit‘ Signal zu erzeugen. Hier einige VHDL unten.
-- -*-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;
Ich bin viel wohler in Verilog, so überprüfen Sie diese VHDL (keine Kommentare geschätzt).
Wellenformen http://img33.imageshack.us/img33/893/stackoverflowvhdlq. png
Dieser Code geht davon aus, dass die Uhr schnell genug ist, um alle Steuersignalimpulse zu erfassen. Wenn die Steuersignale nicht mit dem Takt synchron sind, würde ich halte eine weiter verzögerte Version des verzögerten Steuersignals (zB sig_d2
) dann die Fahnen macht aus sig_d1
und sig_d2
.