爵士
我使用verilog做了一个4位向上的计数器。但是在模拟过程中没有增加。分频器电路用于为计数器提供必要的时钟。请帮我解决这个问题。代码如下:
module my_upcount(
input clk,
input clr,
output [3:0] y
);
reg [26:0] temp1;
wire clk_1;
always @(posedge clk or posedge clr)
begin
temp1 <= ( (clr) ? 4'b0 : temp1 + 1'b1 );
end
assign clk_1 = temp1[26];
reg [3:0] temp;
always @(posedge clk_1 or posedge clr)
begin
temp <= ( (clr) ? 4'b0 : temp + 1'b1 );
end
assign y = temp;
endmodule
答案 0 :(得分:1)
您是否至少在(2^27) / 2 + 1
次迭代中运行了模拟?如果没有,那么你的clk_1
信号永远不会升至1,你的计数器永远不会增加。尝试使用4位作为除数计数器,这样您就不必长时间运行模拟。此外,clk_1
信号应在除数计数器达到其最大值时激活,而不是在MSB位为1时激活。
除此之外,您的代码还有其他几个问题:
这是根据我的建议重写的例子:
module my_counter
(
input wire clk, clr,
output [3:0] y
);
reg [3:0] dvsr_reg, counter_reg;
wire [3:0] dvsr_next, counter_next;
wire dvsr_tick;
always @(posedge clk, posedge clr)
if (clr)
begin
counter_reg <= 4'b0000;
dvsr_reg <= 4'b0000;
end
else
begin
counter_reg <= counter_next;
dvsr_reg <= dvsr_next;
end
/// Combinational next-state logic
assign dvsr_next = dvsr_reg + 4'b0001;
assign counter_next = (dvsr_reg == 4'b1111) ? counter_reg + 4'b0001 : counter_reg;
/// Set the output signals
assign y = counter_reg;
endmodule
这是验证其操作的简单测试平台:
module my_counter_tb;
localparam
T = 20;
reg clk, clr;
wire [3:0] y;
my_counter uut(.clk(clk), .clr(clr), .y(y));
always
begin
clk = 1'b1;
#(T/2);
clk = 1'b0;
#(T/2);
end
initial
begin
clr = 1'b1;
@(negedge clk);
clr = 1'b0;
repeat(50) @(negedge clk);
$stop;
end
endmodule