ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:290.16KB ,
资源ID:30559054      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30559054.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx

1、08课程设计多功能数字钟 verilog语言暑期实习石油大学20092010学年第二学期数字电子技术课程设计报告 专业班级 自动化082班 姓 名 学 号 开课系室 电工电子学教学中心 设计日期 2010年8月23日27日 设计题目:多功能数字钟电路设计一、设计任务及要求:本次课程设计任务是设计一个多功能数字钟。具体要求是:1.钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,但是需要注意的是,小时的范围是从023时。2.小时分钟秒钟。3.整点报时,在整点前

2、5秒LED开始按照1HZ频率闪烁,过整点后,停止闪烁。4.调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。另外用S8按键作为系统时钟复位,复位后全部显示000000。二、设计原理与方案:(一)、顶层设计方案:(包括原理框图及其工作原理说明等内容)图1 原理框图工作原理说明:clk用于输入50MHZ时钟,s1用于给小时加1,s2用于给分钟加1,s8用于复位。分频器分出三个频率的时钟,clkout1输出1HZ,clkout2输出1千HZ,clkout1输出2HZ。控制器输入端口t1用于控制灯闪烁,输出端口led接小灯,ss

3、1、ss2、reset分别储存s1、s2、s8的值并将其传给计数器。计数器输出端口shis表示小时的十位,shig表示小时的各位,mins表示分钟的十位,ming表示分钟的个位。secs表示秒的十位,secg表示秒的个位。显示器输出端口leds接七段数码管,wei接数码管的控制端。当clkout1出现上升沿时,秒执行加1或进位操作,若秒进位,则分钟执行加1或进位操作,若分秒都进位,则小时进行加1或进位操作。小时进位前5秒,灯开始以1HZ频率闪烁。按下s1时小时加1或进位,按下s2时分钟加1或进位,若分钟进位,小时同时进行加1或进位操作。整体仿真源文件:图2整体仿真源文件说明:s1、s2、s8按

4、下时为0,不按下时为1。当s8按下时,全部归0。当s1按下时,小时假1,当s2按下时,分钟加1。输入波形中刚开始s8为0,归0。然后让其运行一段时间,再让s1为0,再过一段时间让s2为0,再过一段时间让s8为0。clk为脉冲信号,10ps一周期。输出放大截图:图3 输出仿真波形放大截图第一部分图4 输出仿真波形放大截图第二部分(灯的闪烁)说明:仿真时计数器控制器都是12分频,灯闪烁是6分频,显示器是2分频,因此能看到输出的6个数码管的值。并对其进行初步判断。由于数码管数值不易分辨,所以不用全部看到,只看一部分即可。(二)、各个电路子模块:1.分频器设计方案设计思路:设计计数变量 cout1、c

5、out2、cout3,每来一个脉冲加1。cout1加到50000000时归0,同时clkout1加1,否则clkout1归0。cout2到25000000时归0,同时clkout2加1,否则clkout2归0。cout3到25000000时归0,同时clkout3加1,否则clkout3归0。源程序:module fenpin(clk,clkout1,clkout2,clkout3);input clk; /下载时clk为50MHzoutput clkout1,clkout2,clkout3; /clkout1输出1赫兹,clkout2为1千赫兹,clkout3为2赫兹reg clkout1,

6、clkout2,clkout3;integer cout1,cout2,cout3; /cout1,cout2,cout3均为计数变量always (posedge clk ) begin cout1 = (cout1 = 32d50000000) ? 32d0 : (cout1 + 32d1); clkout1= (cout1 = 32d5*) ? 1d1 : 1d0; /50000000分频 cout3 = (cout3 = 32d25000000) ? 32d0 : (cout3 + 32d1); clkout3= (cout3 = 32d2*) ? 1d1 : 1d0; /250000

7、00分频 cout2 = (cout2 = 32d50000) ? 32d0 : (cout2 + 32d1); clkout2= (cout2 = 32d50000) ? 1d1 : 1d0; /50000分频 endendmodule/仿真时,改clkout1为12分频,clkout2为2频,clkout1为6分频/下载时,由于clk为50MHz,改clkout1为50000000分频,输出1赫兹,clkout2为50000分频,输出1千赫兹,clkout3为5000000分频,输出2赫兹分频器仿真源文件:图5 分频器仿真源文件仿真输出文件:图6 频器仿真输出文件2.控制器设计方案控制器输

8、入端口t1用于控制灯闪烁,输出端口led接小灯,ss1、ss2、reset分别储存s1、s2、s8的值并将其传给计数器设计思路: ss1、ss2、reset储存s1、s2、s8的值传给计数器执行其他功能。这一部分由1赫兹进行驱动。led是灯,t1为1时led闪烁。这一部分由2赫兹进行驱动。源程序:module kongzhi(clkout1,clkout3,s1,s2,s8,t1,led,ss1,ss2,reset);input clkout1,clkout3,s1,s2,s8,t1; / clkout1输入1赫兹,clkout3输入2赫兹,t1控制闪烁output led,ss1,ss2,r

9、eset; /led是灯,ss1、ss2、reset储存s1、s2、s8的值传给计数器reg led,ss1,ss2,reset;always(posedge clkout1)begin reset=s8;ss1=s1;ss2=s2; endalways(posedge clkout3)begin if(t1=1) led=led;else if(t1=0) led=0;/当t1=1时闪烁,否则不闪 endendmodule控制器仿真源文件:图7控制器仿真源文件说明:clkout1的周期是clkout3的一倍。s1、s2、s3均有0和1出现,t1之后为1控制器仿真输出文件:图8控制器仿真输出文

10、件说明:从图中可以看出s1、s2、s3的值分别赋给了ss1、ss2、reset。Led在t1为1时闪烁。3.计时器设计方案计数器输出端口shis表示小时的十位,shig表示小时的各位,mins表示分钟的十位,ming表示分钟的个位。secs表示秒的十位,secg表示秒的个位。设计思路:判断ss1是否为0,若为0,小时加1或归0。同时判断ss2是否为0,若为0,则分钟加1或归0并进1。同时判断reset是否 为0,若为0,全部归0。若不为 0则嵌套if语句判断sec、min、shi的值并进行加1或归0操作。当59分54秒到59秒时让t1为1,灯闪烁。其他时候t1为0,灯灭。module jish

11、u(clkout1,ss1,ss2,reset,shis,shig,mins,ming,secs,secg,t1);input clkout1,ss1,ss2,reset;/ clkout1为1赫兹,ss1、ss2、reset是储存的s1、s2、s8的值output1:0 shis;/小时的十位output3:0 shig;/小时的个位output2:0 mins;/分钟的十位output3:0 ming;/分钟的个位output2:0 secs;/秒的十位output3:0 secg;/秒的个位output t1;/返回闪烁的控制变量reg t1;reg5:0 shi;/小时reg5:0 m

12、in, sec; /分钟,秒always(posedge clkout1)begin if(ss1=0&shi24) shi=shi+1;/s1为0和shi小于23时,小时加1 if(ss1=0&shi=24) shi=0; / s1为0和shi等于24时,小时变0 if(ss2=0&min 22 min=min+5;t1=0; if(shi22) shi=0;/若等于22,归0 else shi=shi+1;/若不等,shi加1 end else begin min=min+1;end/若min不等于59,min加1 end else begin sec=sec+1;t1=0;end/若se

13、c不为59,sec加1,令t1为0 if(min=59&sec54&sec60) t1=1;若整点前5秒,令t1为1,灯闪烁endassign shis=shi/10;/将小时的十位赋给shisassign shig=shi%10;/ 将小时的个位赋给shigassign mins=min/10;/将分钟的十位赋给minsassign ming=min%10;/ 将分钟的个位赋给mingassign secs=sec/10;/将秒的十位赋给secsassign secg=sec%10;/ 将秒的个位赋给secgendmodule计时器仿真源文件:图9计时器仿真源文件说明:reset先为0,令其

14、复位。运行一段时间之后先让ss1加1,再让ss2加1,clkout1始终有输入。整体仿真图:图10 整体仿真图说明:从图中可以看出灯闪烁变量t1的变化,也可以看出小时shi加1的变化,其他的在下面有放大图。秒进位:图11秒进位仿真截图说明:从图中可以看出秒十位secs为5,个位secg为9时,秒归0,分钟个位ming加1。分钟进位:图12分钟进位仿真截图说明:从图中可以看出,分钟59时(ming为9,mins为5时),分钟归0,小时加1S1起作用图13 s1起作用仿真截图说明:从图中可以看出ss1为0时,每过一个上升沿,小时加1(shig加1或进位)S2起作用:图14 s2起作用仿真截图说明:

15、从图中可以看出ss2为0后,分钟开始加1或进位。(ming加1或进位)S8起作用:图15 s8起作用仿真截图说明:s8为0时,reset为0,其余均为0(除输入外)。4.显示器设计方案:(包括设计思路及其工作原理)设计思路:1千赫兹输入,用wei来确定数码管的位置,分别给不同的数码管赋不同的值。使数码管从左到右依次显示小时分钟秒。module xianshi(clkout2,shis,shig,mins,ming,secs,secg,leds1,wei);input clkout2;/clkout2为1千赫兹input1:0 shis; /小时的十位input3:0 shig; /小时的个位i

16、nput2:0 mins; /分钟的十位input3:0 ming; /分钟的个位input2:0 secs; /秒的十位input3:0 secg; /秒的个位output6:0 leds1;/leds1为数码管reg6:0 leds1;output 2:0 wei; /wei表示数码管的位置reg2:0 wei; reg3:0 a; /中间变量always(posedge clkout2)beginif(wei=6) begin a=shis;/当wei为6时,加1,第7号数码管显示小时的十位 case(a) 4d0:leds1=7b0111111; 4d1:leds1=7b0000110

17、; 4d2:leds1=7b1011011; default:leds1=7b1111110; endcase wei=wei+1;endelse if(wei=5) begin a=shig; /当wei为5时,加1,第6号数码管显示小时的个位case(a) 4d0:leds1=7b0111111; 4d1:leds1=7b0000110; 4d2:leds1=7b1011011; 4d3:leds1=7b1001111; 4d4:leds1=7b1100110; 4d5:leds1=7b1101101; 4d6:leds1=7b1111101; 4d7:leds1=7b0000111; 4

18、d8:leds1=7b1111111; 4d9:leds1=7b1101111; default:leds1=7b1111110; endcase wei=wei+1;endelse if(wei=4) begin leds1=7b1000000;wei=wei+1; /当wei为4时,加1,第5号数码管显示横杠endelse if(wei=3) begin a=mins; /当wei为3时,加1,第4号数码管显示分钟的十位case(a) 4d0:leds1=7b0111111; 4d1:leds1=7b0000110; 4d2:leds1=7b1011011; 4d3:leds1=7b100

19、1111; 4d4:leds1=7b1100110; 4d5:leds1=7b1101101; default:leds1=7b1111110; endcase wei=wei+1;endelse if(wei=2) begin a=ming; /当wei为2时,加1,第3号数码管显示分钟的个位case(a) 4d0:leds1=7b0111111; 4d1:leds1=7b0000110; 4d2:leds1=7b1011011; 4d3:leds1=7b1001111; 4d4:leds1=7b1100110; 4d5:leds1=7b1101101; 4d6:leds1=7b111110

20、1; 4d7:leds1=7b0000111; 4d8:leds1=7b1111111; 4d9:leds1=7b1101111; default:leds1=7b1111110; endcase wei=wei+1;endelse if(wei=1) begin leds1=7b1000000;wei=wei+1; /当wei为1时,加1,第2号数码管显示横杠endelse if(wei=0) begin a=secs; /当wei为0时,加1,第1号数码管显示秒的十位case(a) 4d0:leds1=7b0111111; 4d1:leds1=7b0000110; 4d2:leds1=7b

21、1011011; 4d3:leds1=7b1001111; 4d4:leds1=7b1100110; 4d5:leds1=7b1101101; default:leds1=7b1111110; endcase wei=wei+1;endelse if(wei=7) begin a=secg; /当wei为7时,加1,第0号数码管显示秒的个位 case(a) 4d0:leds1=7b0111111; 4d1:leds1=7b0000110; 4d2:leds1=7b1011011; 4d3:leds1=7b1001111; 4d4:leds1=7b1100110; 4d5:leds1=7b110

22、1101; 4d6:leds1=7b1111101; 4d7:leds1=7b0000111; 4d8:leds1=7b1111111; 4d9:leds1=7b1101111; default:leds1=7b1111110; endcasewei=wei+1; end endendmodule数码管仿真源文件:图16数码管仿真源文件说明:只输入了一组值13时43分12秒仿真输出文件:图17数码管仿真文件说明:从图中可以看出八个数码管对应的值。wei=000时0号数码管输出1011011对应秒的个位为2;wei=001时1号数码管输出0000110对应秒的十位为1;wei=010时2号数码管

23、输出1000000对应输出“”;wei=011时3号数码管输出1001111对应输出分钟的个位为3;wei=100时4号数码管输出1100110对应输出分钟的十位为4;wei=101时5号数码管输出1000000对应输出“”;wei=110时6号数码管输出1001111对应输出小时的个位为3;wei=111时7号数码管输出0000110对应输出小时的十位为1;即输出为“134312”三、分析与讨论:(一)课程设计综述:本次课程设计我总共进行了两天,感觉整个程序就是一个精密的机器,由很多简单的部件构成,而我的任务就是仔细的设计部件组成机器,否则就很容易出错。 第一天上午我编写了分频程序和控制器程

24、序,这两个程序是最简单的。分频程序一个是输出1赫兹,一个是输出1千赫兹,另一个是输出2赫兹。控制器三个变量就是用来存储三个按键的值,还有就是控制闪烁。这一部分没出现什么问题,就是出现了一些警告。警告1.Verilog HDL assignment warning at : truncated with size to match size of target ( 原因:在HDL设计中对目标的位数进行了设定,如:reg4:0 a;而默认为32位, 要将位数裁定到合适的大小。 解决方案:如果结果正确,无须加以修正,如果不想看到这个警告,可以改变设定的位数 。2.Following 9 pins h

25、ave nothing, GND, or VCC driving datain port - changes to this connectivity may change fitting results 原因:第9脚,空或接地或接上了电源。 解决方案:有时候定义了输出端口,但输出端直接赋0,便会被接地,赋1接电源。如果你的设计中这些端口就是这样用的,那便可以不理会这些warning 3.Found pins as undefined clocks and/or memory enables 原因:是你作为时钟的PIN没有约束信息.可以对相应的PIN做一下设定就行了。主要是指你的某些管脚在电路

26、当中起到了时钟管脚的作用,比如flip-flop的clk 管脚,而此管脚没有时钟约束,因此QuartusII把“clk”作为未定义的时钟。解决方案:clk应该是时钟,如果不是,最好改一个名字。4.Design contains input pin(s) that do not drive logic 原因:输入引脚没有驱动逻辑(驱动其他引脚),所有的输入引脚需要有输入逻辑。 解决方案:如果这种情况是故意的,无须理会,如果非故意,输入逻辑驱动。最好是输入时钟作为驱动逻辑。5.Cant analyze file - file E:/quartusii/*/*.v is missing 原因:试图编

27、译一个不存在的文件,该文件可能被改名或者删除了。 解决方案:不管他,没什么影响。6.Warning (10268): Verilog HDL information at lcd7106.v(63): Always Construct contains both blocking and non-blocking assignments 原因: 一个always模块中同时有阻塞和非阻塞的赋值 解决方案:最好是全部用阻塞赋值,或者全是非阻塞赋值。当混合使用时,对同一变量必须全部用同一种赋值方式。 第一天下午编写计数器。计数器是最难编的一个程序,因为计数器才是真正起作用的部分。计数器的逻辑驱动是1

28、赫兹。它的工作原理应为: 1.每过一秒,如果秒数小于59,秒数加1。如果是59秒,就让秒数归0并判断分钟。 2.此时,如果分钟数小于59,分钟数加1。如果分钟是59,就把分钟归0并判断小时。 3.此时,如果小时小于23, 小时进1。如果小时是23,就让小时归0。 4.如果s1按下,小时加1。如果s2按下,分钟加1。如果s8按下,全部归0。 5如果是59分,在秒数为55到59之间让灯以1Hz闪烁。 前三步的实现是采用嵌套if语句,最后一个功能是并列if语句。需要注意的是按按键时小时加1不能超过23,分钟加1不能超过59,复位时秒数不能走。这样,复位优先级要高于走秒的优先级,判断按键s1s2按下时

29、加1的方式,还要判断其他条件。 第三部分编写好之后,就还差一个显示模块。这时候就可以进行仿真了,我把分频器、控制器、计数器在顶层文件连接好进行仿真。这样,程序的输出变为灯led、小时十位、小时个位、分钟十位、分钟个位、秒数十位、秒数个位,看波形就可以看到小时、分钟、秒数、小灯的运行过程。经过对波形的分析我发现两个问题,第一是秒数、分钟和小时会越过他们的界限。原因是我给它们赋了6位的值,如果不加限制,它们在运行时都可以达到63。增加了限制条件后一切正常。第二是灯闪烁时间太早,我把时间调整后,波形正常。 下面就是显示模块。显示模块采用扫描方式给数码管输出,因此是1千赫兹驱动。位置控制的变量从0开始每运行1次加1到7,再加1到0,数码管输出相应的值。这一部分也还可以

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1