Я пытаюсь уменьшить счетчик для моей системы.
Для этого я создал комбинационную логику для счетчика следующего значения и последовательную логику для синхронизации с часами
Вот форма волны, чтобы показать это.
Форма волны
при 145 нс, неблокирование не работает должным образом.
Следующее значение (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
Iнеобходимо назначить разное максимальное значение этому счетчику в разное время
, поэтому у меня есть сигнал инициализации.
Скажите, пожалуйста, почему?и как это исправить?
Заранее спасибо.