我试图在verilog中创建一个计数器,我想知道如何将顺序部分从组合部分中分离出来。
我有这个模块,它工作正常,但我不知道如何分割它?
module counter4bits(
input clk_i,
input rst_n_i,
input enable_i,
input up_down_i,
output reg[3:0] val_o);
always@(posedge clk_i) begin
if (rst_n_i == 1)
val_o <= 0;
else if(enable_i == 1)
val_o <= val_o + 1;
end
endmodule
答案 0 :(得分:4)
一种方法是使用阻塞分配(always @(*)
)为组合部分创建=
块,并使用非阻塞分配使always @(posedge clk_i)
块用于连续部分({{1简单的注册。
组合中的阻止分配(<=
)可以提供更快的模拟和可预测的行为,即使使用明确的敏感性列表行=
而不是@(rst_n_i or enable_i or ...)
。顺序逻辑中的非阻塞赋值(@(*)
)给出了预期的触发器行为,其中下一个值取决于先前的值。
然后代码如下:
<=
答案 1 :(得分:0)
为什么要拆分组合逻辑和顺序逻辑。 您编写的代码是优化功能的好方法。 根据您的代码风格,工具可以理解,触发器值将在enable_i上发生变化,因此工具足够智能,可以使用enable_i为触发器设置时钟门,从而降低功耗。