4 Stimmen

Flip-Flop, ausgelöst durch die Flanke von zwei Signalen

Ich benötige ein Flip-Flop, das auf die Flanken von zwei verschiedenen Signalen reagiert. Etwas wie dies:

if(rising_edge(sig1)) then
    bit <= '0';
elsif(rising_edge(sig2)) then
    bit <= '1';
end if;

Gibt es ein solches Flip-Flop oder gibt es eine andere Technik, die ich verwenden könnte? Ich brauche dies, um auf einem Xilinx Virtex-5 FPGA synthetisierbar zu sein. Danke

4voto

Marty Punkte 6234

Normalerweise würde ich in diesem Fall eine verzögerte Version der beiden Steuersignale behalten und bei der steigenden Flanke jedes Signals einen Impuls mit einer Taktbreite erzeugen. Ich würde dann diese Impulse verwenden, um eine winzige FSM zu steuern, um das "Bit"-Signal zu erzeugen. Hier ist etwas 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 besser mit Verilog zurechtgekommen, also überprüfen Sie diese VHDL (Kommentare sind willkommen).

Wellenformen http://img33.imageshack.us/img33/893/stackoverflowvhdlq.png

Dieser Code setzt voraus, dass der Takt schnell genug ist, um alle Steuersignalimpulse zu erfassen. Wenn die Steuersignale nicht synchron mit dem Takt sind, würde ich eine weiter verzögerte Version des verzögerten Steuersignals (z. B. sig_d2 ), dann machen Sie die Flaggen aus sig_d1 y sig_d2 .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X