我正在尝试为我的系统做倒计时。
为此,我对计数器的下一个值进行了组合逻辑 和与时钟同步的顺序逻辑
这是显示此波形的波形。
Waveform
在145ns时,非阻塞无法正常工作。
将下一个值(代码中的cnt_next)直接分配(没有一个时钟延迟)到该值,并使用应该阻塞一个时钟的非阻塞语句(代码中的cnt_reg)分配
我无法理解这种情况。
为什么会这样?以及我该如何解决?
这是我的代码
-counter.v
`timescale 1ns / 1ps
module counter
#(
parameter WIDTH = 6
)
(
input aclk,
input aresetn,
input en,
input[WIDTH-1:0] max,
input init,
output[WIDTH-1:0] cnt
);
wire res_cnt;
reg[WIDTH-1:0] cnt_reg;
reg[WIDTH-1:0] cnt_next;
assign res_cnt = (cnt_reg==0);
assign cnt = cnt_reg;
always @(posedge aclk, negedge aresetn)
begin
if (!aresetn)
cnt_reg <= 'd0;
else
cnt_reg <= cnt_next;
end
always @*
begin
cnt_next = cnt_reg;
if( res_cnt || init)
cnt_next = max;
else if(en)
cnt_next = cnt_reg - 1;
end
endmodule
-testbench.v
`include "simul.vh"
module tb_counter();
reg reset;
reg clk;
reg en;
reg [31:0]max;
wire [31:0] cnt;
reg init;
localparam num_iter = 80;
integer i=0;
integer num_clk = 0;
always #(`clock_period/2) clk = ~clk;
initial begin
reset = 0;
en = 1;
clk = 0;
max = 32;
init = 0;
#(`clock_period/2)
#`clock_period
reset = 1;
#(`clock_period*10)
reset = 0;
#(`clock_period * 3)
reset =1;
en=0;
max=63;
init=1;
#(`clock_period)
init=0;
en=1;
max=2;
#(`clock_period*5)
$finish;
end
counter #(
.WIDTH(32)
) u_cnt
(
.aclk(clk),
.aresetn(reset),
.en(en),
.max(max),
.init(init),
.cnt(cnt)
);
endmodule
我需要在不同的时间为此计数器分配不同的最大值
这就是为什么我有初始化信号。
请告诉我为什么?以及如何解决?
先谢谢您。