1、1、课程设计目标 1. 熟悉并掌握 verilog 硬件描述语言2. 熟悉 quartus 软件开发环境3. 学会设计大中规模的数字电路,并领会其中的设计思想二、课程设计实现的功能(1)设计一个数码管实时显示时、分、秒的数字时钟(24 小时显示模式) ;(2)可以调节小时,分钟。(3)能够进行 24 小时和 12 小时的显示切换。(4)可以设置任意时刻闹钟,并且有开关闹钟功能。(5)有整点报时功能,几点钟 LED 灯闪亮几下。(6)有复位按键,复位后时间从零开始计时,但闹钟设置时间不变。3、 设计原理:1、总原理框图:是是计数模块译码显示模块分频模块设置闹钟小时分钟校正小时校正模式选择模块设置
2、闹钟分钟复位是否到闹钟时间切换 12 进制显示输出闹钟信号到达整点 输出整点报时信号附全部代码:总模块:module clock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao_signal,nao_signal); input clk;/50MHzinput reset,MODE,Alarm_ctr,BT2,H12_24;/复位键,模式选择按钮,闹钟开关档,调节按 钮 ,1224 小时切换档output 7:0DMH,DML,DHH,DHL; /4 个数码管显示输入信号output dian,bao_s
3、ignal,nao_signal; /时分间隔点,报时信号,闹钟信号output 3:0DSH,DSL; /秒钟输出信号wire 3:0 SH,SL,MH,ML,HH,HL;wire 3:0 LED_mode;wire 3:0 HH12,HL12,HH24,HL24,MH24,ML24,SH24,SL24;wire 3:0 set_HH,set_HL,set_MH,set_ML; wire _1HZ,_10ms,_250ms,_500ms;wire Keydone1;wire Keydone2;wire co1,co11,co111,co2,co22,co222,set_co2;wire 3:
4、0mode_flag;assign dian=1b0;devide_f u1(_1HZ,_10ms,_250ms,_500ms,reset,clk); /分频,得到 4 种不同频率的时钟信号key_press u2(_10ms,MODE,Keydone1); /模式档按钮去抖动key_press u20(_10ms,BT2,Keydone2); /调节按钮去除抖动mode u3(Keydone1,mode_flag); /通过模式按钮产生不同模式second u4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1); /秒计时minute u5(co11,
5、reset,MH24,ML24,co2); /分计时hour u6(co22,reset,HH24,HL24); /小时计时 SEG7_LUT u7(DML,ML); /4 个数码管显示SEG7_LUT u8(DMH,MH);SEG7_LUT u9(DHL,HL);SEG7_LUT u10(DHH,HH);display_LED u11(DSL,SL); /LED 灯显示秒或模式灯display_LED u12(DSH,SH);mode_choose u13(mode_flag,Keydone2,_250ms,co1,co2,set_co2,co11,co22,co111,co222); /选
6、择模式进行不同操作 hour12_24 u14(HH24,HL24,HH12,HL12); /12-24 小时切换boshi u15(HH,HL,MH,ML,SH,SL,_1HZ,bao_signal); /整点报时set_naozhong u16(co111,co222,set_HH,set_HL,set_MH,set_ML,set_co2); /设置闹钟时间Naozhong u17(Alarm_ctr,_500ms,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal); /任意闹钟响应LUT_mode u18(mode_fl
7、ag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,set_ML,MH,ML,HH,HL);/通过模式选择数码管显示LED_mode u19(mode_flag,SH24,SL24,SH,SL); 模式选择 LED 灯显示Endmodule分频模块 :分频模块的作用主要是要获得各种频率的时钟信号。输入信号为 50MHZ 的信号,要想获得 1HZ 的信号作为秒脉冲计时,则要对 50MHZ 信号分频。通过计数的方式,当计数从 0 开始到 24 999999 时,1HZ 信号取反一次,计数又从 0 开始,如此循环,就可以得到 1H
8、Z 脉冲信号。对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。module devide_f(_1HZ,_10ms,_250ms,_500ms,nCR,_50MHZ);input _50MHZ,nCR; output _1HZ,_10ms,_250ms,_500ms;reg _1HZ,_10ms,_250ms,_500ms;reg31:0Q1,Q2,Q3,Q4;always(posedge _50MHZ or negedge nCR)beginif(nCR)beginQ1=32d24999999)beginQ1=32d249999)beginQ2=32d6299999)beginQ
9、4=32d12499999)beginQ3=8d720)beginQ=13)HL12=HL24+4d8;endelsebeginHH12=HH24-4d1;HL12=HL24-4d2;endendendmodule 整点报时模块:module boshi(HH,HL,MH,ML,SH,SL,_500ms,bao_signal);input3:0 HH,HL,MH,ML,SH,SL;input _500ms;output bao_signal;reg bao_signal;reg 7:0Q1,Q2;reg bao;always(posedge _500ms)beginif(SH*10+SL)=8
10、d59)bao=1b1;endelse if(Q110*HH+HL)Q1=Q1+bao_signal;endelse if(Q1=(10*HH+HL)bao=1b0;else begin bao_signal=1b0;endendendmodule 译码显示模块:一、数码管显示:通过传入响应的 4 位十进制数,运用 case 语句转换输出相应的8 位二进制显示码,送入数码管显示。二、LED 显示 :module display_LED(s_out,s_int);input3:0s_int;output3:0s_out;reg3:0s_out;wire 3:0s_out1;always (s_i
11、nt)begincase(s_int)4h0:s_out=4b0000;4h1:s_out=4b0001;4h2:s_out=4b0010;4h3:s_out=4b0011;4h4:s_out=4b0100;4h5:s_out=4b0101;4h6:s_out=4b0110;4h7:s_out=4b0111;4h8:s_out=4b1000;4h9:s_out=4b1001;endcaseendassign s_out1=s_out;Endmodulemodule SEG7_LUT(oSEG1,iDIG);input3:0iDIG;output7:0oSEG1;reg7:0oSEG;wire
12、7:0oSEG1;always (iDIG)begincase(iDIG) 4h0: oSEG = 8b00111111;4h1: oSEG = 8b00000110;4h2: oSEG = 8b01011011; 4h3: oSEG = 8b01001111; 4h4: oSEG = 8b01100110;4h5: oSEG = 8b01101101;4h6: oSEG = 8b01111101; 4h7: oSEG = 8b00000111;4h8: oSEG = 8b01111111;4h9: oSEG = 8b01101111;4ha: oSEG = 8b01110111;4hb: o
13、SEG = 8b01111100;4hc: oSEG = 8b00111001;4hd: oSEG = 8b01011110;4he: oSEG = 8b01111001;4hf: oSEG = 8b01110001;endcaseendassign oSEG1=oSEG;endmodulemodule display_LED(s_out,s_int);input3:0s_int;output3:0s_out;reg3:0s_out;wire 3:0s_out1;always (s_int)begincase(s_int)4h0:s_out=4b0000;4h1:s_out=4b0001;4h
14、2:s_out=4b0010;4h3:s_out=4b0011;4h4:s_out=4b0100;4h5:s_out=4b0101;4h6:s_out=4b0110;4h7:s_out=4b0111;4h8:s_out=4b1000;4h9:s_out=4b1001;endcaseendassign s_out1=s_out;endmodule设计过程常见问题:(1)要注意编写程序的过程中 begin 和 end 配对问题,类似于 C 语言中的括号匹配问题,在编写计数模块时编译不通过,最后检查出是缺少一个 end 结束符号,经修改后编译通过。(2)Verilog HDL 语言编写时的语法问题。
15、在最初的计时模块的程序设计中,将小时、分钟的调节信号放在了另外的一个 always 语句块中,编译无法通过,经查阅资料,在Verilog HDL 语言的编写中应该注意不同的 always 语句块不可以对同一个变量进行操作,即一个变量不可以经过两个 always 语句块操作。将对小时和分钟调节信号的操作与计时放在同一个语句块中,编译通过。(3)数码管刚开始时显示于实际计数不一样,主要是由译码错误造成的原因。数码管一开始不变化,说明计数没有进行,是由于分钟的输入脉冲信号错误引起。心得体会这次的课程设计结束了,在这次的设计中我学会了很多东西。首先是对 Verilog HDL语言的设计思想有了深入理解
16、,将这种自顶向下的设计理念运用于实践中,设计多功能数字钟,突出了 Verilog HDL 作为硬件描述语言的良好可读性和可移植性,对上学期所学的而理论知识有了深刻的理解。其次是对 Verilog HDL 语言的语法熟悉,在这次的课程设计中,我学习到很多 Verilog HDL 语言的语法知识,比如在两个不同的语句块中不能对同一个变量进行操作,比如在用Verilog HDL 语言中编写程序时要注意 begin 和 end 语句的匹配问题,在使用 Verilog HDL语言时不可以使用中文注释等等。对于这种语言的学习也有了很大的帮助。最后是设计作品时的设计逻辑和设计思想,在选择不同的系统方案时要综合考虑,选择最优方案。各个模块的实现也要考虑综合情况而制定出最符合实际情况的实现方案,方案间要进行对比、实践,最终确定。在这次的课程设计中我不仅学习到有关程序编写以及设计方面的逻辑思维,对系统功能的实现也有了较为深入的了解,对各模块的调试等也学习到不少东西,总之,从这次设计中学到很多东西,也巩固了我的理论学习。