my_clock_tb.v

来自「一个电子中的verilog实验源代码。适合verilog初学者学习参考」· Verilog 代码 · 共 184 行

V
184
字号
// **********************************************************************************
// FileName		:my_clock_tb.v
//
// Discription	:顶层测试模块
//
// Date			:
//
// Author		: dandan
// **********************************************************************************

//由于仿真,把30000分频改为30分频,把30ns改为30fs,这样就是用1ns代替实际的1s,当set键按住1ns时数值连续增加

//仿真过程:初始时间为05年12月31日23点59分57秒,经过4s后,显示时间为00:00:01,显示日期为06年1月1日,

//此时开始设置闹钟,当前设置值部分以每秒一次的频率闪烁,将闹钟时间设置在00:07:00,然后开启闹钟和整点报时,

//此时闹钟设置显示为11:07:00,长按set1秒以上时设置值以每0。2秒一次的频率递增,

//此时设置时间,将时间设置为07:00:00,闹钟响,按keyin键后停止,同时整点报时,5秒后停止,

//此时设置日期,将日期设置为06年3月1日,然后进入秒表状态,首先开启秒表,经过6秒后暂停并清零,

//切换回正常显示时间状态,察看日期及闹钟显示是否正确。

`timescale 1ps/1fs
`define timeslice 0.016

module my_clock_tb;
parameter	led_out_0=7'b1111110,
            led_out_1=7'b0110000,
            led_out_2=7'b1101101,
            led_out_3=7'b1111001,
            led_out_4=7'b0110011,
            led_out_5=7'b1011011,
            led_out_6=7'b1011111,
            led_out_7=7'b1110000,
            led_out_8=7'b1111111,
            led_out_9=7'b1111011;
reg glbclk;
wire clk_1000,clk_100,clk_5,clk_1;
wire reset;
reg shift,select,set,keyin;
reg [59:0] pressed;
wire [5:0]	led_scan;
wire [7:0] led_out;
reg [39:0] number;
wire o_light;
wire alm_light;

initial
	begin
		glbclk=1;
		shift=0;
		select=0;
		set=0;
		keyin=0;
		pressed="none";
		number="none";
		
//仿真过程:初始时间为05年12月31日23点59分57秒,经过4s后,显示时间为00:00:01,显示日期为06年1月1日,

//此时开始设置闹钟,当前设置值部分以每秒一次的频率闪烁,将闹钟时间设置在00:07:00,然后开启闹钟和整点报时,

//此时闹钟设置显示为11:07:00,长按set1秒以上时设置值以每0。2秒一次的频率递增,

//此时设置时间,将时间设置为07:00:00,闹钟响,按keyin键后停止,同时整点报时,5秒后停止,

//此时设置日期,将日期设置为06年3月1日,然后进入秒表状态,首先开启秒表,经过6秒后暂停并清零,

//切换回正常显示时间状态,察看日期及闹钟显示是否正确。

		#4000    	select=1;	//显示日期
		#300		select=0;
		#500		shift=1;	//设置时间
		#300		shift=0;
		#500		shift=1;	//设置日期
		#300 		shift=0;	
		#500		shift=1;	//设置闹钟
		#300		shift=0;
		#500		select=1;	//设置闹钟小时
		#300		select=0;
		#500		set=1;		//长按set2.2秒,将闹钟小时设置为7点
		#2200		set=0;
		repeat(2)				//设置闹钟开关
			begin
				#300 select=1;
				#300 select=0;
			end
		#500		set=1;		//闹钟开启
		#300		set=0;		
		#500		shift=1;	//秒表
		#300		shift=0;
		#500		shift=1;	//整点报时开关
		#300		shift=0;
		#500		set=1;		//整点报时开启
		#300		set=0;	
		#500		shift=1;	//时间正常显示
		#300		shift=0;
		#500		shift=1;	//设置时间
		#300		shift=0;
		repeat(7)				//按set7次,设置到7点,此时闹钟开始响
			begin
				#300 set=1;
				#300 set=0;
			end
		repeat(2)				//设置秒
			begin
				#300 select=1;
				#300 select=0;
			end
		#500		set=1;		//秒清零,整点报时
		#300		set=0;
		#100		shift=1;	//设置日期
		#300		shift=0;
		#10000		keyin=1;	//停止闹钟
		#500		select=1;	//设置月
		#300		select=0;
		repeat(2)				//设置到3月
			begin
				#300 set=1;
				#300 set=0;
			end
		repeat(2)				//秒表状态
			begin
				#300 shift=1;
				#300 shift=0;
			end
		#500		select=1;	//开启秒表
		#300		select=0;
		#6000		select=1;	//6s后暂停
		#300		select=0;
		#500		set=1;		//秒表清零
		#300		set=0;
		repeat(2)				//时间正常显示状态
			begin
				#300 shift=1;
				#300 shift=0;
			end
		#500	select=1;		//显示日期06:03:01
		#500	select=0;		
		#500	set=1;			//显示闹钟设置11:07:00(11表示闹钟和整点报时均开启)
		#500	set=0;
		#500	$stop;			
	end
	
always #`timeslice glbclk<=~glbclk;

//将显示的数字在波形图中用ASC码表示,变量为number
always@(led_out[6:0])
    begin 
        case(led_out[6:0])
        led_out_0: number="0";
        led_out_1: number="1";
        led_out_2: number="2";
        led_out_3: number="3";
        led_out_4: number="4";
        led_out_5: number="5";
        led_out_6: number="6";
        led_out_7: number="7";
        led_out_8: number="8";
        led_out_9: number="9";
        default:	 number="none";
        endcase
    end
//将按键在波形图中用ASC码表示,变量为pressed
always@(select or shift or keyin or set)
	begin
		if(select)	pressed="select";
		else if(shift)	pressed="shift";
		else if(set)	pressed="set";
		else if(keyin)	pressed="keyin";
		else	pressed="none";
	end
			
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

top t(glbclk,shift,select,set,keyin,led_scan,led_out,o_light,alm_light,reset);

my_division md(.glbclk(glbclk),.reset(reset),.clk_1000(clk_1000),.clk_100(clk_100),.clk_5(clk_5),.clk_1(clk_1));

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

endmodule  
        

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?