最新华中科技大学电子线路设计测试实验FPGA数字钟设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华中科技大学电子线路设计与测试实验
数
字
钟
设
计
实
验
报
告
2017年5月
一、实验目的
1、掌握数字钟电路的设计与调试方法
2、熟悉使用VERILOG HDL语言描述时序逻辑电路的方法,以及EDA仿真技术
二、实验内容
1、以数字形式显示时、分、秒的时间;
2、小时计数器为同步24进制;
3、要求手动校时、校分;
4、任意时刻闹钟;
5、小时显示(12/24)切换电路;
6、仿广播电台正点报时。
三、模块化,层次化设计(框图设计)
四、代码实现
1、顶层模块
module clock(decoder_h_m,decoder_s,alarm,_50mhz,
choose_h_m_de,hour_12_24,adj_min_key,adj_hour_key,
set_min_key,set_hr_key,ctrl_bell,mode,vdd);
input _50mhz; //DE0
实验板上的晶振频率
wire _1khzin,_1hz,_2hz,_500hz;
//分频器的输出信号,1khz 通过不同位权的二进制数字获得1hz,2hz,500hz 的输出信号
input vdd; //用于提供整个数字钟的异步清零端或者高电平电压,0时清零
wire [7:0]hour,minute,second; //计时器的输出信号,作为中间变量存储和传输时间信号
12/24进制小时 计时并存储 60进制分钟 计时并存储 60进制秒
计时并存储
wire [7:0]hour_12,hour_all;
//12进制的小时计数器的变量,hour_all表示把12进制和24进制用一个变量统一,便于译码
input adj_min_key,adj_hour_key; //校正计时器小时分钟的输入按键,为1时校正时间,为0时正常计时
//计时器的中间使能控制信号,用于计时器的扩展,比如分进位用于控制小时的计数,实现模拟数字钟计时功能wire minl_en,minh_en,hour_en;
input hour_12_24;
//12进制与24进制的显示切换,也就是选择hou还是hour_12当为1时12进制,为0时是24进制表达
reg alarm_radio; //仿电台的报时信号输出,当此信号为1时报时信号输出,当此信号为0时不输出
wire alarm_clock; //闹钟的信号输出,同仿电台报时的功能,当此信号为1时,闹钟信号输出
input ctrl_bell; //控制闹钟的声音是否输出的按键
output alarm; //仿电台报时或者闹钟声音信号的输出,集成在一个输出端口,采用或运算使之输出在一起
wire [7:0]set_hr,set_min;//设定的闹钟时间输出信号,用于用户设置闹钟定时和用于和当前计时器的时间比较
input set_hr_key,set_min_key;
//设定闹钟小时和分钟的输入按键,作为小时计数器和分钟计数器的使能信号
//如果按下,使能有效,正常递增,当松开时,使能无效,不再递增,保存当前的值为闹钟所设定的时间。
//闹钟设定时间和计时器比较器的结果输出,分别为小时的十位比较结果
//小时个位比较结果,分钟十位比较结果,分钟个位比较结果
wire hr_h_equ,hr_l_equ,min__h_equ,min_l_equ;
input choose_h_m_de; //因4个数码管显示限制,用于控制显示小时还是分钟信号,1表示小时,0表示分钟output [13:0]decoder_h_m,decoder_s; //译码器的输出,也就是小时、分、秒的译码,用于控制七段译码管的亮灭
wire [7:0]led_hr,led_min,led_sec;
//输出8421BCD码给显示器,时分秒都是两位十进制数表示,需要八位二进制的BCD二进制码来表示
wire [7:0]led_min,led_sec; //说明变量的类型
wire [7:0]led_h_min; //由于译码管数量限制,所以把计时的时分集中在一个变量里便于译码
input mode;//设定显示器的显示模式,MODE=1时,显示闹钟所设定的时间,反之则显示计时器的时间
//50MHZ分频器调用模块,50mhz为DE0实验板上的晶振频率
divided50mhz de1(_1khzin,vdd,_50mhz);
//1khz分频器的模块调用,vdd,作为使能信号和清零信号,都处于高电平状态。前三种频率的信号为分频输出divided_frequency u0(_1hz,_2hz,_500hz,vdd,vdd,_1khzin);
//60进制秒计数器:调用10进制和6进制底层模块构成
counter10 u1(second[3:0],vdd,vdd,_1hz);
//秒个位计数器,为十进制,使能信号接电源高电平,一直有效,即一直计数,符合秒的概念
counter6 u2(second[7:4],vdd,(second[3:0]==4'h9),_1hz);
//秒计数器十位计数器,以秒个位是否达到九作为使能控制信号
//也就是个位是否产生进位,也就实现了60进制的扩展
assign minl_en=adj_min_key?vdd:(second==8'h59);
//分钟的个位使能信号产生,adj_min_key为1时校正分钟信号,所以无需等待秒的进位
//而为0时,则是正常计时状态,虚等待秒的进位来充当使能信号,产生正常的分钟计数
assign minh_en=(adj_min_key&&(minute[3:0]==4'h59))||(mintue[3:0]==4'h9) &&(second==8'h59);
//分钟的十位使能信号产生,adj_min_key为1时校正分钟信号
//但此时即便在校正状态,也需等待分钟信号的个位进位信号
//当其为0时,分钟是正常即使状态,需同时满足秒的进位与分钟的个位进位
//60进制分钟计数器,也是调用十进制计数器与6进制计数器完成,与秒计数器所不同的是使能信号的不同counter10 u3(mintue[3:0],vdd,minl_en,_1hz); //分计数器的个位计数
counter6 u4(mintue[7:4],vdd,minh_en,_1hz); //分计数器的十位计数
//产生小时计数器使能信号
//为1时校正小时,为0时正常计时,由于小时直接采用底层的24进制计数器
//所以只有一个使能信号,无需十位与个位的使能信号相区分
//正常计数时,需同时满足秒的进位与分的进位
assign hour_en=adj_hour_key?vdd:((mintue==8'h59)&&(second==8'h59));