Verilog 中的条目总是敏感度列表

Entries in Verilog always sensitivity list

在此找不到任何内容,它与关键字不匹配。我在某处遇到一个声明,将某些内容放在始终阻止的敏感列表中是不好的做法。根据声明,除 clk 和设备内的其他相关内部信号外,其他因素可能会导致路由效率低下。

我发现在编写相对较慢的应用程序时生成细分时钟信号并在 always 块中使用这些信号很方便。

例如:

reg Counter [12:0]    ;
reg SlowClk   ;

always @ (posedge clk)
    begin
    Counter <= Counter + 13'h1   ;
    SlowClk <= Counter[12]    ;
    end

always @ (posedge SlowClk)

注意:我的文本条目每行一个语句,如果最后几行连接在一起post,那是网站的原因。

这有什么问题吗?

这没有错。如果设计需要分频时钟,我们必须这样做。 但最佳做法是将 en 信号用于时钟分频器,以便您可以在每个 always 块中使用相同的时钟。是的,在 clcok 潜水器中使用重置很好 (任何顺序的 ckt 都需要重置)。

reg Counter [12:0]    ;
reg SlowClk   ;
reg div_clk ;
wire en;

always @ (posedge clk)
begin
if(!reset)
Counter <=  13'h0;
else
Counter <= Counter + 13'h1; 
end

assign  en  = (Counter ==13'h0)? 1'b1 : 1'b0;

always @ (posedge clk)
begin
if(!reset)
  div_clk = 1'b0;
else(en)
  div_clk <= ~div_clk;
end

是的,这确实是一种不好的做法。所以你可以做一些不同的事情来获得 SlowClk 优势。

你可以拿一根线来检测SlowClk上升沿。

wire got_SlowClk_posedge; 

现在要检测,SlowClk,上升沿,你需要有它的当前和下一个时钟值(当前时钟值应该是 0,下一个时钟值应该是 1) 但幸运的是,在你的例子中,SlowClk,下一个时钟值是 Counter[12] 的当前值。所以你可以使用它。

assign got_SlowClk_posedge = Counter[12] & ~SlowClk;

所以现在你的第二个 always 块可能看起来像这样:

// Instead of @(posedge SlowClk)
always @(posedge clk)
begin
  if(got_SlowClk_posedge)
  begin
    // Your code for positive edge of SlowClk
  end
end