Vhdl 在两个信号边缘触发的触发器

Vhdl 在两个信号边缘触发的触发器,vhdl,xilinx,virtex,Vhdl,Xilinx,Virtex,我需要一个对两个不同信号的边缘做出反应的触发器。大概是这样的: if(rising_edge(sig1)) then bit <= '0'; elsif(rising_edge(sig2)) then bit <= '1'; end if; if(上升沿(sig1))则 bit在这种情况下,我通常要做的是保持两个控制信号的延迟版本,并在每个信号的上升沿产生一个时钟宽的脉冲。然后我会用这些脉冲驱动一个微小的FSM来产生“位”信号。下面是一些VHDL --

我需要一个对两个不同信号的边缘做出反应的触发器。大概是这样的:

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

bit在这种情况下,我通常要做的是保持两个控制信号的延迟版本,并在每个信号的上升沿产生一个时钟宽的脉冲。然后我会用这些脉冲驱动一个微小的FSM来产生“位”信号。下面是一些VHDL

--                                         -*-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;
-*-vhdl-*-
--查找控制信号的边缘并使用
--控制输出变量状态的边
--
图书馆ieee;
使用ieee.std_logic_1164.all;
实体stackoverflow_边为
港口(时钟:标准逻辑;
rst:标准逻辑;
sig1:标准逻辑;
sig2:标准逻辑;
bito:输出标准(逻辑);
末端实体堆叠U边;
stackoverflow_Edge的体系结构rtl是
信号sig1_d1、sig2_d1:标准逻辑;
信号sig1_上升,sig2_上升:标准逻辑;
开始
--触发器以存储控制信号的延迟版本
--如果控制信号与时钟不同步,
--考虑使用2个延迟银行并使用这些输出
--生成边缘标志的步骤
延迟注册:进程(clk)为
开始
如果上升沿(clk),则
如果rst='1',则

嗯,这听起来不太合适。你真正想要实现什么?这两个时钟是如何相互关联的?您想如何使用“bit”?你能用ASCII艺术画出波形吗?信号实际上不是时钟。它的两个控制信号和第三个信号必须在一个的下降沿和另一个的上升沿上响应。这两个信号标志着开始和结束。我意识到这不是最好的方法,但这超出了我的控制范围,我一直在努力。酷。正如我提到的,但要小心-我不是100%确定它是可合成的。如果输入信号与时钟异步,还要添加亚稳态强化。Oops-如果与您的代码进行比较,看起来我切换了sig1和sig2。正如您要求的评论,进程输出\u ctrl和delay_regs在灵敏度列表中应该有'rst',为了描述一个寄存器,您通常希望它有一个异步重置,因此我会写(请用新行删除):\n如果rst='1',那么\n bito='0'\n如果信号上升沿(clk),则\n如果信号上升…\n endif;