如何解决Verilog HDL 的可合成行为模型,用于计数信号变化的计数器?
我们有一个随时间变化的信号(名称 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。