摘要
本设计为一个可调数字钟,具有时、分、秒计数功能,以24小时循环计数。
本设计采用FPGA技术,以硬件描述语言VreilogHDL为系统逻辑描述手段设计文件,在QUARTUS2工具软件环境下,采用自顶向下的设计方法,由各个模块共同构建一个基于CPLD的数字钟。
系统芯片采用6块74160实现了60进制(分、秒)、24进制(小时)的编译,由时钟模块、控制模块、计时模块、数据译码模块、显示模块组成。
最终经过编译和仿真所涉及的程序,在可编程逻辑器件上下载验证,本系统能够完成时、分、秒的分别显示,可以在程序中直接改变初始值。
关键词:数字钟硬件描述语言VerilogHDL FPGA
1.实验目的
本实验主要内容涉及数字逻辑电路的设计、数字电路仿真软件Quartus Ⅱ以及VHDL 设计语言的学习与应用。
实验目的在于让实验者掌握数字逻辑电路的设计方法和过程,并且能够熟练准确地设计出具有特定功能的较复杂数字逻辑电路,此外,实验者还应熟练掌握Quartus Ⅱ软件的设计、仿真以及编译下载的使用方法。
2 .课程要求
用Verilog 硬件描述语言设计数字钟,实现:
1.具有时、分、秒计数显示功能,以二十四小时循环计时。
2.具有调节小时、分钟功能。
3.具有整点报时功能。
3.系统设计总体方案
秒模块 时模块
4.各模块电路具体实现
4.1 时钟分频模块
module div_clk(clk_50MHz,clk_1Hz,clk_1KHz,clk_500Hz);
input clk_50MHz;
output clk_1Hz,clk_500Hz,clk_1KHz;
reg clk_1Hz,clk_500Hz,clk_1KHz;
reg [24:0] cnt1;
reg [24:0] cnt2;
reg [24:0] cnt3;
always @(posedge clk_50MHz)
begin if(cnt1 == 24999999)
begin cnt1<=0;
clk_1Hz=~clk_1Hz;
end
else cnt1<=cnt1+1'b1;
end
always @(posedge clk_50MHz)
begin if(cnt2 == 24999)
begin cnt2<=0;
clk_1KHz=~clk_1KHz;
end
else cnt2<=cnt2+1'b1;
end
always @(posedge clk_50MHz)
begin if(cnt3 == 49999)
begin cnt3<=0;
clk_500Hz=~clk_500Hz;
end
else cnt3<=cnt3+1'b1;
end
endmodule
4.2计数器模块的设计与实现
4.2.1秒显示模块的实现
图4.2.1 秒钟显示模块4.2.2分钟显示模块的实现
图4.2.2 分钟显示模块4.2.3小时显示模块的实现
图4.2.3 时钟显示模块
4.3 数码管显示及译码模块
module decode(clk_1KHz,hour_ten,hour_one,min_ten,min_one,sec_ten,sec _one,dig,seg);
input clk_1KHz;
input [3:0] hour_ten,hour_one,min_ten,min_one,sec_ten,sec_one; output [7:0] dig;
output [7:0] seg;
reg[7:0] seg_reg;
reg[7:0] dig_reg;
reg[3:0] dat_reg;
reg[2:0] count;
always @(posedge clk_1KHz)
begin
if(count ==5)count<=0;
else count<=count+1'b1;
end
always @(posedge clk_1KHz)
begin
case(count)
3'd0 : begin dat_reg<=hour_ten[3:0];dig_reg<=8'b01111111;end 3'd1 : begin dat_reg<=hour_one[3:0];dig_reg<=8'b10111111;end 3'd2 : begin dat_reg<=min_ten[3:0]; dig_reg<=8'b11011111;end 3'd3 : begin dat_reg<=min_one[3:0]; dig_reg<=8'b11101111;end 3'd4 : begin dat_reg<=sec_ten[3:0]; dig_reg<=8'b11110111;end 3'd5 : begin dat_reg<=sec_one[3:0]; dig_reg<=8'b11111011;end default : begin dat_reg<=0;dig_reg<=6'b000000;end
endcase
end
always @(dat_reg)
begin
case(dat_reg)
4'h0 : seg_reg<=8'hc0;
4'h1 : seg_reg<=8'hf9;
4'h2 : seg_reg<=8'ha4;
4'h3 : seg_reg<=8'hb0;
4'h4 : seg_reg<=8'h99;
4'h5 : seg_reg<=8'h92;
4'h6 : seg_reg<=8'h82;
4'h7 : seg_reg<=8'hf8;
4'h8 : seg_reg<=8'h80;
4'h9 : seg_reg<=8'h90;
default : seg_reg<=8'hff;
endcase
end
assign dig=dig_reg;
assign seg=seg_reg;
endmodule
4.4 数字钟电路模块
图4.4.1 数字钟整体模块5 . 系统仿真及硬件下载
5.1系统仿真
图5.1.1 秒钟仿真结果
图5.1.2 分频仿真结果
5.2硬件下载
经下载后,能实现课程设计要求。
但因设计时间匆忙,并未拍摄照片。
6 . 课程总结
通过本次EDA设计,掌握了较为复杂逻辑电路的设计方法,了解了用VHDL语言编程设计电路的一般方法。
同时锻炼了自己的分析理解能力和动手能力,并且加深了对数电相关知识的理解。
实验时需要十分细心,一不小心就容易出错,一旦出现错误,就要马上耐心地检查线路,分析出错原因,找到错误,并加以更正。
如果不是接线问题,那再去思考一下,是不是设计的原理图有问题。
虽然这不是一个容易的过程,但在这个过程中,锻炼了自己的各项能力,令我受益匪浅。
其实,实验的过程也是锻炼耐力的过程。
在添加闹钟功能时,我们曾遇到过困难。
本来我们的报时电路是对的,可加上闹钟功能后,非但闹钟到时刻不响,就连原本的整点报时也不响了,经过一番仔细的盘查,我们发现原来是我们错用了或门,用高电平和发声频率相或,所以才会没有声音。
另外,在给闹钟增加音乐功能时也花了不少力气,刚开始在网上找的相关资料都不能用,最后终于找到了一个可以播放音乐的资料,我们将找到的VHDL源程序输入到自己的工程,终于成功让闹钟播放音乐闹铃了,那一刻,我们相当开心,因为这是我们通过努力才得到的收获。
这次EDA设计锻炼了我很多方面的能力,为将来的继续学习和工作都积累了宝贵的经验。
希望学校能增加这种实践环节来培养我们的动手能力、分析能力,这些都是在理论课上不曾学到的。
参考文献:
〔1〕康华光.电子数字基础:数字部分.4版.北京:高等教育出版社,2000.
〔2〕蒋立平.数字电路.北京:兵器工业出版社,2001.3.
〔3〕康华光,陈大钦.电子技术基础—数字部分(第五版)[M]. 北京:高等教育出版社,2005.
〔4〕谢自美.电子线路设计·实验·测试(第三版)[M].武汉:华中科技大学出版社, 2006.
〔5〕赵保经.中国集成电路大全.国防工业出版社, 1985.
附录:
附录1 分频仿真图
附录2 电路全图。