Question

je besoin d'une bascule qui réagit sur les bords des deux signaux différents. Quelque chose comme ceci:

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

Est-ce qu'un tel bascule existe ou est-il une autre technique que je pourrais utiliser? J'ai besoin que ce soit sur un synthétisable Virtex-5 de Xilinx FPGA. Merci

Était-ce utile?

La solution

Qu'est-ce que je généralement faire dans ce cas est de garder une version retardée des deux signaux de commande et générer une impulsion d'une horloge large sur le front montant de chaque signal. Je puis utiliser ces impulsions pour conduire un petit EFM pour générer le signal « bit ». Voici quelques VHDL ci-dessous.

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

Je suis beaucoup plus à l'aise dans Verilog, alors vérifiez cette VHDL (tout commentaire apprécié).

formes d'ondes http://img33.imageshack.us/img33/893/stackoverflowvhdlq. PNG

Ce code suppose que l'horloge est assez rapide pour capturer toutes les impulsions de signal de commande. Si les signaux de commande ne sont pas synchrones avec l'horloge, je garderais un plus (par exemple sig_d2) version retardée du signal de commande retardé puis effectuez les drapeaux de sig_d1 et sig_d2.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top