题解 | #可置位计数器#
可置位计数器
https://www.nowcoder.com/practice/b96def986e29475e8100c213178b73a8
我一开始还纳闷以为自己学的有问题,直到我写完全一样的TB文件,用他们代码跑了一下明显不对,只能说牛客的verilog在线仿真程序做的有BUG,不如Mosim.
这个代码num本来就是reg型,上升沿跳变后需要一个周期0才能更新为1,按他们要求再打一拍0又被延迟一个周期了,最明显的错误就是他们打拍,set=1,从代码中能明显看出num更新需要一个周期,number也需要一个周期,因此共两个周期,完全不符合题意啊。
always@((487950916)posedge clk or negedge rst_n) begin
if(~rst_n)
num <= 0;
else
num <= set? set_num: num+1;
end
正确解答:
module count_module(
input clk,
input rst_n,
input set,
input [3:0] set_num,
output reg [3:0]number,
output reg zero
);
always@((487950916)posedge clk or negedge rst_n) begin
if(~rst_n)
number <= 4'd0;
else
number <= set? set_num: number+1'd1;
end
always@((487950916)*) begin
if(~rst_n)
zero <= 0;
else
zero <= number==4'd0;
end
endmodule
`timescale 1ns/1ps
module tb;
reg clk,rst_n,set;
reg [3:0] set_num;
wire [3:0] number;
wire zero;
initial begin
clk = 1'b1;
forever #5 clk = ~clk;
end
initial begin
rst_n <= 1'b0;
set_num <= 4'd0;
set <= 1'b0;
#10 rst_n <= 1'b1;
#200 set <= 1'b1;set_num <= 4'd10;
#10 set <= 1'b0;
#200;
end
count_module U1(
.clk(clk),
.rst_n(rst_n),
.set(set),
.set_num(set_num),
.number(number),
.zero(zero)
);
endmodule