fla*_*ama 0 counter verilog clock
我正在尝试在 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
Run Code Online (Sandbox Code Playgroud)
一种方法是always @(*)
使用阻塞赋值 ( =
)为组合部分创建always @(posedge clk_i)
块,并使用<=
简单 reg的非阻塞赋值 ( ) 为连续部分创建块。
阻塞分配(=
)的组合提供了更快的仿真和可预测的行为,即使明确灵敏度名单线@(rst_n_i or enable_i or ...)
来代替@(*)
。<=
顺序逻辑中的非阻塞赋值 ( ) 给出了预期的触发器行为,其中下一个值取决于前一个值。
代码将如下所示:
module counter4bits(
... input/output with no change
reg [3:0] val_nxt; // Not flip-flop but used in always @(*) thus reg
always @(*) begin
if (rst_n_i == 1)
val_nxt = 0;
else if(enable_i == 1)
val_nxt = val_o + 1;
end
always @(posedge clk_i)
val_o <= val_nxt;
endmodule
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1023 次 |
最近记录: |