




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数字时钟及闹钟 目录一、实验任务2实验目的2实验要求2二、设计思路2硬件部分2软件部分3三、完成情况6四、总结与收获7具体分工7五、完整程序815一、实验任务实验目的1. 深入了解基于EDA工具的复杂时序逻辑电路的设计。2. 理解并熟练利用EDA工具进行综合设计。3. 熟练掌握芯片烧录的流程及步骤。4. 掌握Verilog HDL 语言的语法规范及时序电路描述方法。5. 掌握多个数码管动态扫描与键盘扫描的显示原理及设计方法。实验要求设计一个带闹钟功能的24 小时数字钟,它包括以下几个组成部分: 显示屏,由4 个七段数码管组成,用于显示当前时间(时:分)或设置的闹钟时间; 数字键 09,用于输入
2、新的时间或新的闹钟时间; TIME(时间)键,用于确定新的时间设置; ALARM(闹钟)键,用于确定新的闹钟时间设置,或显示已设置的闹钟时间; 扬声器,在当前时钟时间与闹钟时间相同时,发出蜂鸣声。基本要求(1) 计时功能:这是本计时器设计的基本功能,每隔一秒计时一次,并在显示屏上显示当前时间。(2) 闹钟功能:如果当前时间与设置的闹钟时间相同,则扬声器发出蜂鸣声。(3) 设置新的计时器时间:用户用数字键09输入新的时间,然后按"TIME"键确认。发挥部分(1) 设置新的闹钟时间:用户用数字键“0”“9”输入新的时间,然后按“ALARM”键确认。(2) 显示所设置的闹钟时间:
3、在正常计时显示状态下,用户直接按下“ALARM”键,则已设置的闹钟时间将显示在显示屏上。二、设计思路硬件部分本次数字时钟的设计主要在NC-EDA-2000C实验箱上完成,应用的芯片为Altara公司的EP1K10TC1003芯片。该芯片具有低内核电压、低功耗的特点。芯片内门电路高达1万门,内部使用RAM作电路结构,速度高达几百MHZ,其输出可用管脚已全部开放,位于芯片的四周,用户可以根据自己的要求和芯片本身的功能自己任意定义管脚。同时为了体现实验箱的可扩展性,在芯片的两边各有一个34脚的IDE插口,可以通过数据排线与其它应用模块相连接。除了主芯片外,主要包括三大部分:八个数码管组成的显示部分、
4、4×4键盘构成的按键输入部分。以及其他输入或输出部分,如:"TIME"键、“ALARM”键、时钟信号、蜂鸣器等。8位7段数码管:采用2个进口共阴高红7段数码管组成,其连接管脚位选信号在数码管的左边由连接孔SEL0、SEL1、SEL2与其它模块连接。数码管显示的设计示意图如下:八位数码管显示设计示意图4×4键盘: 4×4键盘主要是通过编程实现0F的输入,也可以作为一个控制键。在其上方的连接孔R1、R2、R3、R4控制横向4位;C1、C2、C3、C4纵向4位。键盘输入设计示意图如下:4×4键盘输入设计示意图 软件部分软件主要应用软件qua
5、rtus,使用Verilog HDL语言来编写程序。在老师所给的keyscan的基础上加入计时部分、设置部分(时间的设置和闹钟的设置)以及闹铃部分。a) 计时部分always(posedge clkl) /计时过程beginhour<=Hour;minute<=Minute;if(reset) begin hour<=0;minute<=0;second<=0;endelseif(second=59)if(minute=59)if(hour =23) begin second<=0;minute<=0;hour<=0;endelse begin
6、second<=0;minute<=0;hour<=hour+1;endelse begin second<=0;minute<=minute+1;endelse second<=second+1;end其中,clkl为1Hz的时钟信号,当每遇到一个时钟信号的上升沿时,秒钟就加1秒;当加到59时,分钟就加1,秒钟自动回到0重新计时;当分钟加到59时,时钟就加1,然后分钟回到0;当计时到23:59:59时,则回到00:00:00再进入计时。reset为清零信号,高电平有效。b) 设置部分always (posedge clkh)begin if(w=1)/设置
7、时间begin Hour=num1*10+num2; Minute=num3*10+num4; endelse if(p=1) /设置闹钟begin Ahour=num1*10+num2; Aminute=num3*10+num4; end end将按下的键值存在num1、num2、num3、num4中,再通过w和p即所谓的TIME(时间)键与ALARM(闹钟)键将输入的数值赋给初始时间或闹钟时间。c) 闹铃部分 always (posedge clkh)/闹钟响beginif(hour=Ahour)&&(minute=Aminute) ds=1; else ds=0;end当
8、设置的闹钟时间(时:分)与当前的时间(时:分)相等时,则闹铃发出响声;ds信号可以接在蜂鸣器上或者发光二极管上。本次设计的完整程序已附在报告的最后。整体程序编译无误。程序中涉及的变量名称及其对应的变量意义:引脚配置图三、完成情况在这次实验过程中我们完成了24小时数字时钟的设计。时钟的显示屏为七段数码管。显示出的时间格式为小时、分钟、秒钟(如图1)。时钟含有闹钟,可以在程序中设置闹钟时间,在实际时间和闹钟时间相吻合时蜂鸣器响。图2中的二极管亮即可说明,在闹钟时间可以输出高电平,该输出接在蜂鸣器上即可使蜂鸣器响。本次设计的闹钟为响1分钟自动关闭。图3中二极管熄灭。图1 时间显示图2 闹钟响(体现为
9、发光二极管发光)图3 发光二极管熄灭(本次设计的闹钟为响1分钟自动关闭)四、总结与收获在实验设计的过程中,我们首先尝试了树上和老师上课时所讲的例程,在熟悉软件和设计流程后开始了数字时钟的设计。在设计数字时钟时,我们先分设计出来时钟的自动计数显示,实现了24小时时钟。之后实验了4*4键盘,实现了键盘输入值的扫描读取。最后设计了闹钟部分,包括设置闹钟时间和到时间闹铃响。我们通过本次实验深入了解基于EDA工具的复杂时序逻辑电路的设计,理解并熟练利用quartus进行Verilog HDL语言的设计。掌握了建立工程项目,编译调试程序,下载程序的流程和步骤。在应用的过程中掌握了数码管和键盘扫描的原理和方
10、法。并且对Verilog HDL语言的语法规则和几种常用语句有了更深入的理解。实验过程中通过合作的方式,小组成员积极讨论,对不同的语句进行了对比,最终确定了本次实验的完整程序。这次完成的数字时钟只是EDA实验箱中可以实现的众多功能之一,我们也认识到Verilog HDL语言可以实现的设计还有很多,本次实验激发了我们对Verilog HDL语言的兴趣,也让我们认识到课堂的学习是有限的,想更加深入学习Verilog HDL语言,还要在今后的学习中多多自学,勤加练习。五、完整程序module zonghe (clkl,clkh,reset,q,w,p,kr,kc,a,b,c,d,e,f,g,sa,s
11、b,sc,ds); input clkl,clkh,reset; /计数时钟脉冲、扫描频率脉冲与复位信号 input q,w,p; /启动设置的控制信号、设置时间的控制信号及设置闹钟的控制信号 inout 3:0kr; /4*4键盘的行输入/输出信号 inout 3:0kc; /4*4键盘的列输入/输出信号 output a,b,c,d,e,f,g,sa,sb,sc,ds; /LED的7个片选信号与3个位选信号 reg a,b,c,d,e,f,g,sa,sb,sc,ds; reg 3:0kr,kc; reg 6:0 display ; reg 2:0 dcount,kcount; reg 3:
12、0keyr,keyc; reg kflag1,kflag2; reg 6:0 buff7 ; reg 3:0 shiwei1,gewei1,shiwei2,gewei2,shiwei3,gewei3; reg5:0 hour,minute,second,Ahour,Aminute,Hour,Minute; /储存当前时间的时分秒、闹钟的时分及设置的时间的时分 always(posedge clkh) /累加两个计数值 begin dcount<=dcount+1; kcount<=kcount+1; end always (posedge clkh) /扫描键盘 begin if(
13、kcount=0) begin kr<=4'b1111; kc<=4'b0000; end else if(kcount=1) begin keyr<=kr; kr<=4'bZZZZ; end else if(kcount=2) begin kr<=4'b0000; kc<=4'b1111; end else if(kcount=3) begin keyc<=kc;kc<=4'bZZZZ; end end always(posedge clkh) /改变键的标志位 begin if(kcount=4
14、 & keyr=4'b1111) kflag1<=0; else if(kcount=4) kflag1<=1; kflag2<=kflag1; end always(posedge clkh) / 获取相应按键按下的结果begin if(kcount=5) if(keyr=4'b1110) case (keyc) 4'b1110:buff7<=7'b0111111; /在LED上显示0 4'b1101:buff7<=7'b0000110; /在LED上显示1 4'b1011:buff7<=7&
15、#39;b1011011; /在LED上显示2 4'b0111:buff7<=7'b1001111; /在LED上显示3 default :buff7<=buff7; /无变化 endcase else if (keyr=4'b1101) case (keyc) 4'b1110:buff7<=7'b1100110; /在LED上显示4 4'b1101:buff7<=7'b1101101; /在LED上显示5 4'b1011:buff7<=7'b1111101; /在LED上显示6 4'
16、b0111:buff7<=7'b0000111; /在LED上显示7 default :buff7<=buff7; / 无变化 endcase else if(keyr=4'b1011) case (keyc) 4'b1110:buff7<=7'b1111111; / 在LED上显示8 4'b1101:buff7<=7'b1101111; / 在LED上显示9 4'b1011:buff7<=7'b1110111; /在LED上显示a 4'b0111:buff7<=7'b11111
17、00; /在LED上显示b default :buff7<=buff7; / 无变化 endcase else if(keyr=4'b0111) case (keyc) 4'b1110:buff7<=7'b0111001; /在LED上显示c 4'b1101:buff7<=7'b1011110; /在LED上显示d 4'b1011:buff7<=7'b1111001; /在LED上显示e 4'b0111:buff7<=7'b1110001; / 在LED上显示f default:buff7&l
18、t;=buff7; /无变化 endcase end always(posedge clkh) /显示过程 begin sa<=dcount0; /将dcount赋给LED的三个片选信号 sb<=dcount1; sc<=dcount2; shiwei1=hour/10;gewei1=hour%10;shiwei2=minute/10;gewei2=minute%10;shiwei3=second/10;gewei3=second%10;if(dcount=3'b111)/判断位选dcount的值,并将此位上的值输出到数码管case(shiwei1) /在第一数码管上
19、显示时钟的十位 4'b0000: display <= 7'b0111_111;4'b0001: display<= 7'b0000_110;4'b0010: display <= 7'b1011_011;4'b0011: display <= 7'b1001_111;4'b0100: display <= 7'b1100_110;4'b0101: display <= 7'b1101_101;4'b0110: display <= 7'b1
20、111_101;4'b0111: display <= 7'b0000_111;4'b1000: display <= 7'b1111_111;4'b1001: display <= 7'b1101_111; default: display <= 7'b0000_000;endcaseif(dcount=3'b000) /在第二个数码管上显示时钟的个位case(gewei1) 4'b0000: display <= 7'b0111_111;4'b0001: display &
21、lt;= 7'b0000_110;4'b0010: display <= 7'b1011_011;4'b0011: display <= 7'b1001_111;4'b0100: display <= 7'b1100_110;4'b0101: display <= 7'b1101_101;4'b0110: display <= 7'b1111_101;4'b0111: display <= 7'b0000_111;4'b1000: display
22、<= 7'b1111_111;4'b1001: display <= 7'b1101_111; default: display <= 7'b0000_000;endcaseif(dcount=3'b001) /在第三个数码管上显示分钟的十位case(shiwei2) 4'b0000: display <= 7'b0111_111;4'b0001: display <= 7'b0000_110;4'b0010: display <= 7'b1011_011;4'b
23、0011: display <= 7'b1001_111;4'b0100: display <= 7'b1100_110;4'b0101: display <= 7'b1101_101;4'b0110: display <= 7'b1111_101;4'b0111: display <= 7'b0000_111;4'b1000: display <= 7'b1111_111;4'b1001: display <= 7'b1101_111; defau
24、lt: display <= 7'b0000_000;endcaseif(dcount=3'b010) /在第四个数码管上显示分钟的个位case(gewei2) 4'b0000: display <= 7'b0111_111;4'b0001: display <= 7'b0000_110;4'b0010: display <= 7'b1011_011;4'b0011: display <= 7'b1001_111;4'b0100: display <= 7'b11
25、00_110;4'b0101: display <= 7'b1101_101;4'b0110: display <= 7'b1111_101;4'b0111: display <= 7'b0000_111;4'b1000: display <= 7'b1111_111;4'b1001: display <= 7'b1101_111; default: display <= 7'b0000_000;endcase if(dcount=3'b011) /在第五个数码管
26、上显示秒钟的十位case(shiwei3) 4'b0000: display <= 7'b0111_111;4'b0001: display <= 7'b0000_110;4'b0010: display <= 7'b1011_011;4'b0011: display <= 7'b1001_111;4'b0100: display <= 7'b1100_110;4'b0101: display <= 7'b1101_101;4'b0110: display
27、 <= 7'b1111_101;4'b0111: display <= 7'b0000_111;4'b1000: display <= 7'b1111_111;4'b1001: display <= 7'b1101_111; default: display <= 7'b0000_000;endcaseif(dcount=3'b100) /在第六个数码管上显示秒钟的个位case(gewei3) 4'b0000: display <= 7'b0111_111;4'b
28、0001: display <= 7'b0000_110;4'b0010: display <= 7'b1011_011;4'b0011: display <= 7'b1001_111;4'b0100: display <= 7'b1100_110;4'b0101: display <= 7'b1101_101;4'b0110: display <= 7'b1111_101;4'b0111: display <= 7'b0000_111;4'
29、b1000: display <= 7'b1111_111;4'b1001: display <= 7'b1101_111; default: display <= 7'b0000_000;endcase if(dcount=3'b101)display <=7'b1000_000; /在第七个数码管上显示“”if(dcount=3'b110)display <=buff7; /在第八个数码管上显示按下的键值endalways (posedge clkh) /将display中存的值赋给LED的七个片选信号
30、begin a<=display0; b<=display1; c<=display2; d<=display3; e<=display4; f<=display5; g<=display6; end always(posedge clkl) /计时过程 clkl的频率为1Hzbeginhour<=Hour;minute<=Minute; /将设置的时间(时、分)赋给hour和minuteif(reset) begin hour<=0;minute<=0;second<=0; end /当reset为1时,将时间清零即为0
31、0:00:00else /正常计时if(second=59)if(minute=59)if(hour =23) begin second<=0;minute<=0;hour<=0;endelse begin second<=0;minute<=0;hour<=hour+1;endelse begin second<=0;minute<=minute+1;endelse second<=second+1;endinteger i; /记录按键按下的次数reg 3:0num1,num2,num3,num4; /储存按键的键值always (po
32、sedge clkh)/储存按下的键值begin if(q=1)/启动设置 begin i=0; if(keyc!=4'b1111) i=i+1; /当有键按下时,i自动加1 if(i=1) /将第一个按下的按键值存入num1 begin case (keyr,keyc) 4'b1110_1110:num1=0; 4'b1110_1101:num1=1; 4'b1110_1011:num1=2; 4'b1110_0111:num1=3; 4'b1101_1110:num1=4; 4'b1101_1101:num1=5; 4'b11
33、01_1011:num1=6; 4'b1101_0111:num1=7; 4'b1011_1110:num1=8; 4'b1011_1101:num1=9; default:num1=num1; endcase endif(i=2) /将第二个按下的按键值存入num2 begin case (keyr,keyc) 4'b1110_1110:num2=0; 4'b1110_1101:num2=1; 4'b1110_1011:num2=2; 4'b1110_0111:num2=3; 4'b1101_1110:num2=4; 4'b110
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拍卖协议合同
- 喷漆外包协议合同
- 股份分红协议合同
- 建筑法规协议的合同是指
- 纹身学员合同协议书范本
- 店铺投资协议合同
- 挂账协议是合同
- 优信二手车合作协议合同
- 浦东离婚协议合同
- 个人泵车租赁合同协议书
- 查对制度完整版本
- 新教材人教版高中英语必修第二册全册各单元重点单词短语句式
- 2025山东能源集团中级人才库选拔高频重点提升(共500题)附带答案详解
- DB32T 2060-2024 单位能耗限额
- 斜颈康复治疗
- 体育赛事突发事件舆情应对预案
- 生物教案:第二章第节减数分裂和受精作用第课时
- 《跨境电商直播(双语)》课件-4.1跨境直播脚本设计
- 专题25 化学反应原理综合题-平衡主线型-五年(2020-2024)高考化学真题分类汇编(原卷版)
- 风电场场内道路、平台工程施工工程施工组织设计
- 2024年新款灭火器采购协议
评论
0/150
提交评论