gpt4 book ai didi

hardware - 在verilog中增加计数器变量: combinational or sequential

转载 作者:行者123 更新时间:2023-12-02 19:15:31 25 4
gpt4 key购买 nike

我正在为数据路径电路实现 FSM Controller 。 Controller 在内部递增计数器。当我模拟下面的程序时,计数器从未更新。

reg[3:0] counter;

//incrementing counter in combinational block
counter = counter + 4'b1;

但是,在创建额外变量 counter_next 时,如 Verilog Best Practice - Incrementing a variable 中所述并且仅在顺序 block 中递增计数器,计数器就会递增。

reg[3:0] counter, counter_next;

//sequential block
always @(posedge clk)
counter <= counter_next;

//combinational block
counter_next = counter + 4'b1;

为什么在前面的情况下计数器没有增加?我还缺少什么吗?

最佳答案

好的。我假设您在第一个示例中遗漏了一些代码,因为它们甚至不应该编译。不过,我想我还是可以为你解释一下这个问题。

在如下所示的 block 中:

always @(*) begin // or always @(counter)
counter = counter + 4'b1;
end

有两个问题。

1) 计数器从未初始化。所有“reg”类型变量在模拟时间开始时都是 X,因此 X 加 1 就是 X。

2) 这就是组合循环。该 block 对“计数器”的变化很敏感,因此即使假设“计数器”初始化为 0,模拟器也会永远循环更新“计数器”,并且模拟时间永远不会提前。即

always block executes -> counter = 1
counter has changed
always block executes -> counter = 2
counter has changed
and so on...

如果您在其中放置 $display 语句,您可以看到此循环的发生。否则,只会出现模拟器挂起并且不会写入任何波形的情况。

第二个示例起作用的原因是您有一个触发器破坏了组合循环。在每个时钟沿,“计数器”都会更新为“counter_next”的当前值。然后组合 block 执行一次(且仅一次)来计算新版本的“counter_next”。

为了完整性,您仍然缺少通过重置子句或初始语句来初始化“计数器”。

reg [3:0] counter;
reg [3:0] counter_next;

always @(*) begin
counter_next = counter + 1;
end

always @(posedge clk or negedge rst_l) begin
if (!rst_l)
counter <= 4'b0;
else
counter <= counter_next;
end

关于hardware - 在verilog中增加计数器变量: combinational or sequential,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14083475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com