Verilog中模块的仿真&模为60的BCD码计数器的设计与验证

421 阅读1分钟

​​本文已参与「新人创作礼」活动,一起开启掘金创作之路。

    在学习Verilog硬件编程语言时,写完一个module,仍需要进行仿真下看是否运算结果正确,像高级语言中可以打印在Windows上,单片机编程时可以用串口打出来数据一样,我们仍需要验证我们写的对不对。

      如果你对你的硬件水平非常自信,那可以编程完后直接弄出RTL电路来,看是否真确。

      如果电路看不懂,那就可以用波形图进行仿真。

准备工具:

       一个正确无误的module(最好别有Warnning)、工程下建立一个.vwf文件(that‘s all)。

下面我们拿例子说话:

这是一个8-3优先编码器,最高位优先级最高。

然后打开我们的.vwf

然后:

咱看下结果:

符合代码吧,从左到右第四位数是0,那么编码为3.

我们再看一个时序图的仿真案例:

模为60的BCD码计数器的设计与验证

 step1:实现module:

module DigitalCountBCD60(clk_50M,rst_n,time_cnt);
input clk_50M;
input rst_n;
output [7:0]time_cnt;
reg [7:0]time_cnt;
reg [7:0]time_cnt_n;
always@(posedge clk_50M or negedge rst_n)
begin 
	if(!rst_n)
		time_cnt_n=7'b0;
	else begin
		if(time_cnt_n[3:0] == 9)begin
			time_cnt_n[3:0] = 4'b0000;
			if(time_cnt_n[7:4] == 5)
				time_cnt_n[7:4] = 0;
			else
				time_cnt_n[7:4] = time_cnt_n[7:4]+4'b0001;
		end
		else
			time_cnt_n[3:0] = time_cnt_n[3:0]+4'b0001;
	end
	time_cnt = time_cnt_n/16*10 +  time_cnt_n%16;
end

endmodule

step2:编写testbench:

【notice】在写tb文件时,输入参量一定要有个初值。

//输入参量需要有一个变化的过程。。
initial begin
     clk_50M=0;
	  rst_n=0;
	  #10 rst_n=1;
     forever #5 clk_50M=~clk_50M;
     end
DigitalCountBCD60 u1(clk_50M,rst_n,time_cnt);


initial $monitor($time,,,"clk_50M = %b rst_n = %b time_cnt = %d ",clk_50M,rst_n,time_cnt);

endmodule

step3:仿真

打印出来的结果

\