Pregunta

Necesito un flip flop que reacciona en los bordes de dos señales diferentes. Algo como esto:

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

¿Existe un fracaso tal flip o hay alguna otra técnica que pueda usar? Necesito que esto es sintetizable en una Xilinx Virtex-5 FPGA. Gracias

¿Fue útil?

Solución

Lo que normalmente haría en este caso es mantener una versión retardada tanto de las señales de control y generar un reloj de pulso de un ancho en el borde ascendente de cada señal. Entonces haría uso de estos pulsos para conducir un pequeño FSM para generar la señal de 'bit'. He aquí algunos VHDL a continuación.

--                                         -*-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;

Soy mucho más cómodo en Verilog, por lo que comprobar esto VHDL (cualquier comentario apreciado).

formas de onda http://img33.imageshack.us/img33/893/stackoverflowvhdlq. png

Este código asume que el reloj es lo suficientemente rápido para capturar todos los pulsos de la señal de control. Si las señales de control no están sincronizados con el reloj, me gustaría mantener un más versión retardada de la señal de control de retraso (por ejemplo sig_d2) a continuación, hacer las banderas de sig_d1 y sig_d2.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top