欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    基于verilog数字钟设计报告.docx

    • 资源ID:3385042       资源大小:44.36KB        全文页数:23页
    • 资源格式: DOCX        下载积分:6.99金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要6.99金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于verilog数字钟设计报告.docx

    基于verilog数字钟设计报告一、课程设计目标 1. 熟悉并掌握verilog 硬件描述语言 2. 熟悉quartus 软件开发环境 3. 学会设计大中规模的数字电路,并领会其中的设计思想 二、课程设计实现的功能 设计一个数码管实时显示时、分、秒的数字时钟; 可以调节小时,分钟。 能够进行24小时和12小时的显示切换。 可以设置任意时刻闹钟,并且有开关闹钟功能。 有整点报时功能,几点钟LED灯闪亮几下。 有复位按键,复位后时间从零开始计时,但闹钟设置时间不变。 三、设计原理: 1、总原理框图: 分 频模块 小时校正 分钟校正 复位 是 译码显示模块 切换12进制显示 计数模块 模式选择模块 到达整点 是 输出整点报时信号 是否到闹钟时间 输出闹钟信号 设置闹钟分钟 设置闹钟小时 2、各个子模块设计: 、分频模块 : 分频模块的作用主要是要获得各种频率的时钟信号。输入信号为50MHZ的信号,要想获得1HZ的信号作为秒脉冲计时,则要对50MHZ信号分频。通过计数的方式,当计数从0开始到24 999999时,1HZ信号取反一次,计数又从0开始,如此循环,就可以得到1HZ脉冲信号。对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。 部分代码如下: always(posedge _50MHZ or negedge nCR)begin if(nCR) begin Q1<=32'd0; end else if(Q1>=32'd24999999) begin Q1<=32'd0; _1HZ=_1HZ; end else begin Q1<=Q1+1'd1; end 、计数模块 : 秒计数:在1HZ脉冲下进行秒计时,当计时达到59秒后,在下一个脉冲来临变0,并发出一个脉冲信号,可供下面分钟计数作为输入脉冲信号计时。 分钟计数:在输入脉冲下,分钟开始计时,当计时达到59后,在下一个脉冲来临变0,并发出一个脉冲,供小时计数的输入脉冲新号。 小时计数:脉冲信号来临时,计数加1,达到23后在下一个脉冲的作用下清零,从新计时。 如果有复位信号,则时分秒全部清零。 部分代码如下: module second(cp,reset,mode_flag,BT2,SH,SL,co); input cp,reset,BT2; input3:0mode_flag; output co=1'b0; /输出脉冲信号 reg co; output 3:0SL,SH; /输出秒计时的十位、各位 reg3:0SH,SL; reg7:0cnt; always(posedge cp or negedge reset ) begin if(!reset) begin /有复位,清零 cnt<=8'd0; SH<=4'd0; SL<=4'd0;end else if(mode_flag=4'b0010)&&(!BT2) begin/ 如果分钟调节,秒清零 cnt<=8'd0; SH<=4'd0; SL<=4'd0;end if(cnt=8'd59) /计时达到59,下一个脉冲下从新计时 begin cnt<=8'd0; SH<=4'd0; SL<=4'd0; co<=1'b1; end else begin co=1'b0; cnt=cnt+8'd1; SL<=cnt%10; /秒十位 SH<=cnt/10; /秒各位 end end end endmodule 分计时和小时计时代码和上述类似,不再举出。 second u4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1); minute u5(co11,reset,MH24,ML24,co2); hour u6(co22,reset,HH24,HL24); 、模式选择模块 : 同过一个模式档按键MODE,按一下产生对应一种模式mode_flag,并且可以循环。在不同的模式下可以进行不同的操作。其中mode_flag=4'0000为正常显示计时,mode_flag=4'0001为小时调钟模式,mode_flag=4'00010为分钟调钟模,mode_flag=4'0011为闹钟小时设置模式,mode_flag=4'0100为闹钟分钟设置模式。 模式产生: module mode (MODE,mode_flag); input MODE ; output 3:0mode_flag; reg 3:0mode_flag; always (negedge MODE )begin /如果检测到有按键按下 mode_flag = mode_flag+ 4'b1; /模式值加1 if(mode_flag = 4'b0101) /到最后一个模式后返回第一的模式 mode_flag = 2'b0; nd Endmodule 模式选择: module mode_choose(mode_flag,BT2,_250ms,co1,co2,set_co2,co11,co22,co111,co222); input 3:0mode_flag; /输入模式方式,响应对应操作 input BT2,_250ms,co1,co2,set_co2; /调节按钮,时钟信号,正常计时分钟脉冲信号, 正常计时小时脉冲信号,闹钟设置分钟进位信号。 output co11,co22,co111,co222; / 分钟脉冲信号,小时脉冲信号,闹钟设置分钟脉冲信号,闹钟设置小时脉冲信号; supply1 Vdd; reg co11,co22,co111,co222; always(mode_flag)begin case (mode_flag) 4'b0001: begin if(BT2) co22<=_250ms; /小时调钟模式,有按键,则脉冲为250ms else begin co22<=co2; /没有按键,正常计时 co11<=co1; end end 4'b0010: begin if(BT2) begin co11<=_250ms; /小时调钟模式,有按键,则脉冲为250ms co22<=co2;end else begin co11<=co1; /没有按键,正常计时 co22<=co2; end end 4'b0011: begin co22<=co2; co11<=co1; if(BT2) co222<=_250ms; / 闹钟小时设置信号 else co222<=set_co2;end 4'b0100: begin co22<=co2; co11<=co1; if(BT2) co111<=_250ms; /闹钟分钟设置信号 else co111<=Vdd; end default :begin co11<=co1; co22<=co2; end endcase end endmodule 、任意闹钟模块 : 一、设置闹钟:当对应于闹钟设置模式mode_flag=4'0011和4'b0100时,有设置信号输入时,则开始设置。 对应代码: module set_naozhong(co111,co222,set_HH,set_HL,set_MH,set_ML,co2); input co111,co222; / 闹钟分钟,小时设置信号 output 3:0set_HH,set_HL,set_MH,set_ML; /输出相应的闹钟设置时间 supply1 Vdd; output co2; minute (co111,Vdd,set_MH,set_ML,co2); hour (co222,Vdd,set_HH,set_HL); endmodule 二、闹钟响应:当正常计时达到闹钟设置得时间后,通过比较二者之间的时间,相等,则产生一个闹钟允许响应信号,在闹钟开关打开和闹钟允许响应信号同时满足的情况下,则产生闹钟响应信号,并送到相应的闹钟设备LED灯。如果闹钟档处于关闭状态,则不会产生闹钟响应信号。 响应代码如下: module naozhong (Alarm_ctr,_1HZ,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal); input Alarm_ctr,_1HZ; input 3:0 set_HH,set_HL,set_MH,set_ML; input 3:0 HH24,HL24,MH24,ML24; output nao_signal; reg signal; reg nao_signal; reg 16:0 Q; /计数,调节闹钟响应时间长度 always(posedge _1HZ)begin if(signal)&&(Alarm_ctr)begin if(set_HH=HH24)&&(set_HL=HL24)&&(set_MH=MH24)&&(set_ML=ML24)signal<=1'b1 /达到闹钟设置时间,产生闹钟允许响应信号 else signal<=1'b0;end /未达到,不产生 else if(signal)&&(Alarm_ctr)begin /闹钟开关打开和闹钟允许响应信号同时满足 nao_signal<=nao_signal; /产生闹钟响应信号 Q=Q+nao_signal; if(Q>=8'd720)begin /响应时间完毕,关闭闹钟允许响应信号 Q<=16'b0; signal<=1'b0;end end else begin signal<=1'b0; nao_signal<=1'b0;end end endmodule 、整点报时模块 :检测分钟和秒钟计数是否都达到了59,然后再下一个秒脉冲的作用下发出整点报时信号,送到LED。并开始计数,计数达到报时信号响应次数后,终止报时信号。 部分代码如下: always(posedge _500ms)begin if(SH*10+SL)=8'd59)&&(MH*10+ML)=8'd59)begin Q1<=7'b0; bao<=1'b1;end /允许报时 else if(Q1<10*HH+HL)&&(bao) begin bao_signal<=bao_signal; / 产生报时信号 Q1<=Q1+bao_signal; /响一次计数加一 end else if(Q1=(10*HH+HL) /报时次数达到整点时数,终止信号 bao<=1'b0; else begin bao_signal<=1'b0; end End 、1224小时切换模块:将24小时切换成12小时,并存入相应的寄存器。如果拨上切换显示档,则切换显示。 相应代码如下: module hour12_24(HH24,HL24,HH12,HL12); input 3:0 HH24,HL24; output 3:0 HH12,HL12; reg 3:0 HH12,HL12; always(HH24 or HL24)begin if(HH24*10+HL24)<=12) begin HH12<=HH24; HL12<=HL24; end else if(HH24*10+HL24)>=13)&&(HH24*10+HL24)<=19) begin HH12<=4'd0; HL12<=HL24-4'd2; end else if(HH24*10+HL24)>=19)&&(HH24*10+HL24)<=21) begin HH12<=4'd0; HL12<=HL24+4'd8; end else begin HH12<=HH24-4'd1; HL12<=HL24-4'd2; end end endmodule 、译码显示模块: 一、数码管显示:通过传入响应的4位十进制数,运用case语句转换输出相应的8位二进制显示码,送入数码管显示。 代码如下: module SEG7_LUT(oSEG1,iDIG); input3:0iDIG; /输入要显示的数 output7:0oSEG1; reg7:0oSEG; wire 7:0oSEG1; always (iDIG) begin case(iDIG) 4'h0: oSEG = 8'b00111111; 4'h1: oSEG = 8'b00000110; 4'h2: oSEG = 8'b01011011; 4'h3: oSEG = 8'b01001111; 4'h4: oSEG = 8'b01100110; 4'h5: oSEG = 8'b01101101; 4'h6: oSEG = 8'b01111101; 4'h7: oSEG = 8'b00000111; 4'h8: oSEG = 8'b01111111; 4'h9: oSEG = 8'b01101111; endcase end assign oSEG1=oSEG; /由于是共阴极数码管,低电平显示,所以取反 Endmodule 二、LED显示 : module display_LED(s_out,s_int); input3:0s_int; output3:0s_out; reg3:0s_out; wire 3:0s_out1; always (s_int) begin case(s_int) 4'h0:s_out=4'b0000; 4'h1:s_out=4'b0001; 4'h2:s_out=4'b0010; 4'h3:s_out=4'b0011; 4'h4:s_out=4'b0100; 4'h5:s_out=4'b0101; 4'h6:s_out=4'b0110; 4'h7:s_out=4'b0111; 4'h8:s_out=4'b1000; 4'h9:s_out=4'b1001; endcase end assign s_out1=s_out; Endmodule 设计过程常见问题: 要注意编写程序的过程中begin和end配对问题,类似于C语言中的括号匹配问题,在编写计数模块时编译不通过,最后检查出是缺少一个end结束符号,经修改后编译通过。Verilog HDL语言编写时的语法问题。在最初的计时模块的程序设计中,将小时、分钟的调节信号放在了另外的一个always语句块中,编译无法通过,经查阅资料,在Verilog HDL语言的编写中应该注意不同的always语句块不可以对同一个变量进行操作,即一个变量不可以经过两个always语句块操作。将对小时和分钟调节信号的操作与计时放在同一个语句块中,编译通过。 数码管刚开始时显示于实际计数不一样,主要是由译码错误造成的原因。数码管一开始不变化,说明计数没有进行,是由于分钟的输入脉冲信号错误引起。 心得体会 这次的课程设计结束了,在这次的设计中我学会了很多东西。首先是对Verilog HDL语言的设计思想有了深入理解,将这种自顶向下的设计理念运用于实践中,设计多功能数字钟,突出了Verilog HDL作为硬件描述语言的良好可读性和可移植性,对上学期所学的而理论知识有了深刻的理解。 其次是对Verilog HDL语言的语法熟悉,在这次的课程设计中,我学习到很多Verilog HDL语言的语法知识,比如在两个不同的语句块中不能对同一个变量进行操作,比如在用Verilog HDL语言中编写程序时要注意begin和end语句的匹配问题,在使用Verilog HDL语言时不可以使用中文注释等等。对于这种语言的学习也有了很大的帮助。 最后是设计作品时的设计逻辑和设计思想,在选择不同的系统方案时要综合考虑,选择最优方案。各个模块的实现也要考虑综合情况而制定出最符合实际情况的实现方案,方案间要进行对比、实践,最终确定。 在这次的课程设计中我不仅学习到有关程序编写以及设计方面的逻辑思维,对系统功能的实现也有了较为深入的了解,对各模块的调试等也学习到不少东西,总之,从这次设计中学到很多东西,也巩固了我的理论学习。 附代码: 总模块: module clock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao_signal,nao_signal); input clk;/50MHz input reset,MODE,Alarm_ctr,BT2,H12_24;/复位键,模式选择按钮,闹钟开关档,调节按 钮 ,1224小时切换档 output 7:0DMH,DML,DHH,DHL; /4个数码管显示输入信号 output dian,bao_signal,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:0mode_flag; assign dian=1'b0; 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,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); /选择模式进行不同操作 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_flag,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 分频模块: 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)begin if(nCR) begin Q1<=32'd0; Q2<=32'd0; Q3<=32'd0; Q4<=32'd0; end else if(Q1>=32'd24999999) begin Q1<=32'd0; _1HZ=_1HZ; end else if(Q2>=32'd249999) begin Q2<=32'd0; _10ms=_10ms; end else if(Q4>=32'd6299999) begin Q4<=32'd0; _250ms=_250ms; end else if(Q3>=32'd12499999) begin Q3<=32'd0; _500ms=_500ms; end else begin Q1<=Q1+1'd1; Q2<=Q2+1'd1; Q3<=Q3+1'd1; Q4<=Q4+1'd1; end end endmodule 计时模块: module second(cp,reset,mode_flag,BT2,SH,SL,co); input cp,reset,BT2; input3:0mode_flag; output co=1'b0; reg co; output 3:0SL,SH; reg3:0SH,SL; reg7:0cnt; always(posedge cp or negedge reset ) begin if(!reset) begin SL=4'b0; SH=4'b0; cnt<=8'b0; end else if(mode_flag=4'b0010)&&(!BT2) begin SL=4'b0; SH=4'b0; cnt<=8'b0; end else begin if(cnt=8'd59) begin cnt<=8'd0; SH<=4'd0; SL<=4'd0; co<=1'b1; end else begin co=1'b0; cnt=cnt+8'd1; SL<=cnt%10; SH<=cnt/10; end end end endmodule module minute (cp,reset,MH,ML,co); input cp ,reset; output co=1'b0; output 3:0ML,MH; reg3:0MH,ML; reg7:0cnt; reg co; always(posedge cp or negedge reset) begin if(!reset) begin ML=4'b0; MH=4'b0; cnt<=8'b0; end else begin if(cnt=8'd59) begin cnt<=8'd0; MH<=4'd0; ML<=4'd0; co<=1'b1; end else begin co=1'b0; cnt=cnt+8'd1; ML<=cnt%10; MH<=cnt/10; end end end endmodule module hour (cp,reset,HH,HL); input cp,reset; output 3:0HL,HH; reg3:0HH,HL; reg7:0cnt; always(posedge cp or negedge reset) begin if(!reset) begin HL=4'b0; HH=4'b0; cnt<=8'b0; end else begin if(cnt=8'd23) begin cnt<=8'd0; HH<=4'd0; HL<=4'd0; end else begin cnt=cnt+8'd1; HL<=cnt%10; HH<=cnt/10; end end end Endmodule 模式选择模块: module key_press(_10ms,KEY,Keydone); input KEY,_10ms; output Keydone; reg dout1,dout2,dout3; always (posedge _10ms) begin dout1 <= KEY; dout2 <= dout1; dout3 <= dout2; end assign Keydone = (dout1 | dout2 | dout3); endmodule module mode (MODE,mode_flag); input MODE ; output 3:0mode_flag; reg 3:0mode_flag; always (negedge MODE ) begin mode_flag = mode_flag+ 4'b1; if(mode_flag = 4'b0101) mode_flag = 2'b0; end endmodule module LED_mode (mode_flag,SH24,SL24,SH,SL); input 3:0 mode_flag; input 3:0 SH24,SL24; output 3:0SH,SL; reg 3:0SH,SL; always(mode_flag )begin case (mode_flag) 4'b0000:begin SH<=SH24; SL<=SL24;end 4'b0001: begin SH<=4'b0000; SL<=4'b0001;end 4'b0010: begin SH<=4'b0000; SL<=4'b0010;end 4'b0011: begin SH<=4'b0000; SL<=4'b0100;end 4'b0100: begin SH<=4'b0000; SL<=4'b1000;end default : begin SH<=SH24; SL<=SL24;end endcase end endmodule Module LUT_mode (mode_flag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,set_ML,MH,ML,HH,HL); input 3:0 HH12

    注意事项

    本文(基于verilog数字钟设计报告.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开