【问题标题】:Set and reset on rising and falling edge在上升沿和下降沿置位和复位
【发布时间】:2025-12-04 05:10:02
【问题描述】:

如何在时钟信号的上升沿设置位并在时钟信号的下降沿重置该位? 我想知道我怎样才能做到这一点。根据我想在上升沿设置并在下降沿重置的条件。这就像在输出端获得时钟脉冲一样。

我实现了两个不同的时钟脉冲,但我遇到了这样的故障。

我的代码是这样的

process(clk)
begin 
   if rising_edge(clk) then
      d0 <= new_data;
   end if;
end process;

process(clk)
begin 
   if falling_edge(clk) then
      d1 <= new_data;
   end if;
end process;

out <= d0 when clk = '1' else d1;

【问题讨论】:

  • 冷你发布你的代码?看起来您在 3 号信号上有多个驱动程序。
  • 见我添加了代码部分。您对多个驱动程序的看法是正确的,我现在更正了
  • 好的,我有一个解决方法。我没有使用 d0 和 d1 作为信号,而是将它们定义为共享变量并且故障消失了。

标签: vhdl


【解决方案1】:

如果您想要 DDR 数据,这是我唯一能看到您真正想要这样做的时候,有多种建模方法。如果您想要综合,请实例化适当的供应商原语

但是,对于模型:

process(clk)
begin
   -- you could use this
   if clock'event = '1' then
      bit <= new_data;
   end if;
   -- or this
   if rising_edge(clk) ot falling_edge(clk) then
     bit <= new_data;
   end if;
end process;

您也可以将其建模为 2 个进程和一个多路复用器

process(clk)
begin 
   if rising_edge(clk) then
      d0 <= new_data;
   end if;
end process;

process(clk)
begin 
   if falling_edge(clk) then
      d1 <= new_data;
   end if;
end process;

out <= d0 when clk = '1' else d1;

【讨论】:

  • 为什么是“上升沿(clk)和下降沿(clk)”?你确定“ot”不应该是“or”吗?此外,我在同一进程中多次检查信号无法合成。
  • 完整阅读答案
【解决方案2】:

现在已经看到了您的波形,您可以执行以下操作来获得无故障的脉冲序列

process(clk)
begin
    if falling_edge(clk) then
       if pass_next_clock = '1' then
          mask <= '1';
       else
          mask <= '0';
       end if;
    end if;
end process;

pulse <= clk and mask;

这需要您有一个名为 pass_next_clock 的信号,该信号可以与任一时钟沿对齐,以表明您希望输出下一个时钟高脉冲。

【讨论】:

    【解决方案3】:

    好的,我成功了。我的最终代码看起来像

    shared variables d0 ,d1 : std_logic;
    process(clk)
    begin 
       if rising_edge(clk) then
          d0 := new_data;
       end if;
    end process;
    
    process(clk)
    begin 
       if falling_edge(clk) then
          d1 := new_data;
       end if;
    end process;
    
    out <= d0 when clk = '1' else d1;
    

    【讨论】:

    • 共享变量是个坏主意 - 更新的调度是完全不可预测的。