【问题标题】:gate control clock generation门控时钟产生
【发布时间】:2013-03-31 14:53:10
【问题描述】:

这是代码首先...

always@(posedge clk)
begin
if(cstate==idle)    rclk<=1;
else rclk<=0;
end

always@(negedge clk)
rclk<=0;

我想要实现的是:每次在时钟信号的上升沿,如果信号 cstate 等于 idle(4'b0000),则 rclk 变为 1,否则变为 0,同时,每个时间 clk 的下降沿会将 rclk 设置为零。此代码不可合成,因为编译器给出错误“rclk 信号由多个驱动程序驱动”。

如何通过其他技术实现相同的功能?

【问题讨论】:

    标签: verilog clock fpga


    【解决方案1】:

    看起来你想要一个时钟门单元。基于 1 个周期宽的使能信号生成一个与输入时钟具有相同高电平时间的时钟脉冲。

    这样做的一种天真的方式可能是:

    assign rclk = (cstate==idle) ? clk : 1'b0 ;
    

    这很容易合成assign rclk = (cstate==idle) &amp; clk ;
    cstate == idle 会出现故障,这就是为什么它通常会被触发器使用,允许答案在使用前稳定。

    使用时钟门单元可以防止您在 (rclk) 时钟线上产生毛刺。为此,在 rtl 中实例化您的库时钟门单元是很常见的。在 RTL 中,它可能类似于:

    reg result;
    always @(posedge clk or negedge rst_n) begin
      if (~rst_n) begin
        result <= 1'b0;
      end
      else begin
        result <= (cstate == idle);
      end
    end
    
    assign rclk = (result) ? clk : 1'b0 ;
    

    这意味着每个时钟周期的结果都是稳定的,不允许来自比较器的毛刺。

    扩展答案

    我在下面再次用波形包含了我的示例,我已将您的状态比较替换为一个简单的计数器,该计数器会溢出以自行复位。不是比较匹配到 2'b10;这意味着时钟出现在以下计数(2'b11)上。如果时钟出现在您的比较匹配的完全相同的时间,那么您的时钟上没有故障抑制,并且可能会产生不可靠的硬件。

    reg [1:0] counter = 0;
    
    always @(posedge clk) 
      counter <= counter+1;
    
    reg  result;
    wire result_a = (counter == 2'b10 );
    
    always @(posedge clk or negedge rst_n) begin
      if (~rst_n) begin
        result <= 1'b0;
      end
      else begin
        result <= result_a;
      end
    end
    
    assign rclk = (result) ? clk : 1'b0 ;
    

    【讨论】:

    • 感谢您的帮助!我试过组合方式,就像你发布的那样,它不能正常工作。我猜原因是clk的EDGE触发的rclk意味着它受到了clk posedge之前的信号的影响。以组合方式,您将不会有这种效果。
    • 我通过以下方式修改了代码:我将敏感列表从posedge clk更改为clk,我认为这会变成一个组合电路。它在模拟中效果很好,但我想知道它是否可以实现?谢谢你的时间!
    • always @ clk,实际上是一个组合电路,不会为您提供时钟控制真正需要的毛刺抑制。
    • @vitocarlos 我已经扩展了答案并添加了一个波形来显示我希望看到的内容。
    • 你给的代码有这个问题:假设下一个状态会使使能信号为0,但使能信号只有在posedge clk之后才为零,这意味着在时钟上升的时候,使能信号仍然很高,并且会在 rclk 中产生一个上升沿(至少在模拟中......),一旦 clk 设置为 1,使能信号就会下降,rclk 也会下降。我认为这在模拟中将提供一个“隐藏的上升边缘”......我后来的设计使用了你介绍的方式,但我真的很想学习如何处理这些问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多