Verilog HDL 的可合成行为模型,用于计数信号变化的计数器?

问题描述

我们有一个随时间变化的信号(名称 In)和一个时钟来同步电路。与在 Counter Schematic 中一样,我们应该计算 t0t1 之间 In 的 7 次变化。

问题是我们应该只在时钟滴答时计算 In 的变化(我认为就像设置时间)。它是 如果我们在一个时钟周期的周期内有两次 In 变化,则无法正常工作。

最后,我应该如何实现它的 Verilog HDL 代码,它是 可合成的 顺便说一下。

我的尝试:

reg [63:0] counter = 0;
reg changed;

always @(posedge clk) begin
   changed = 0;

   always @(In) begin
      if (changed) begin
         $display(error)
         counter <= 0;
         changed <= 0;
      end
      else begin
         counter <= counter + 1;
         changed <= 1;
      end
   end

end

这段代码在现实世界中是否有效和可合成?

解决方法

$error 是不可合成的,而且您正在使用两个 always 块驱动“已更改”信号,这将在合成期间导致多驱动器错误。 试试下面的代码。

reg [2:0]in_cntr;   //Counts the changes in "in" signal
reg [2:0]nxt_in_cntr; 

wire [2:0] number_of_times_changed;

reg in_d; //Holds previous "in" value
wire in_changed;

always@(posedge clk or negedge rst_n)
begin
 if(!rst_n)
  in_d <= 'd0;
 else
  in_d <= in;
end

assign in_changed = (~in & in_d) | (in & ~in_d); //Triggers if 0->1 or 1->0 happens

always@(posedge clk or negedge rst_n)
begin
 if(!rst_n)
  in_cntr <= 'd0;
else 
  in_cntr <= nxt_in_cntr;
end

always@(*)
begin
 nxt_in_cntr = (in_changed) ? (nxt_in_cntr + 3'd1) : (in_cntr);
end

assign number_of_times_changed = in_cntr;  //Tells number of times in changed

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...