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 + -
显示快捷键?