问题描述
我们有一个随时间变化的信号(名称 In
)和一个时钟来同步电路。与在 Counter Schematic 中一样,我们应该计算 t0 和 t1 之间 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