基于FPGA的多功能时钟设计.docx_第1页
基于FPGA的多功能时钟设计.docx_第2页
基于FPGA的多功能时钟设计.docx_第3页
基于FPGA的多功能时钟设计.docx_第4页
基于FPGA的多功能时钟设计.docx_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于FPGA的多功能时钟设计报告专业:空间信息与数字技术班级:学号:姓名:通 信 工 程 学 院2013年11月目录摘要.3设计内容及要求.3设计(代码)分析.4实验过程及步骤.5实验结果的测试及仿真13实验总结与感想16参考文献.17附录(原代码).17 1 摘要在学习了专用集成电路和verilog语言及数电的相关知识后,运用所学知识及查阅资料完成对多功能时钟的设计,以巩固以前所学知识,提高解决和分析问题的能力以及掌握稍复杂逻辑电路的设计方法;深刻理解verilog语言的思路,并进一步掌握操作BASYS2板的使用;掌握计数器的设计方法,模块之间的协调方式,了解电路设计层次。2 设计内容及要求 多功能时钟设计分为基本电路部分和拓展功能部分和特色部分。 基本电路部分l 以数字形式显示时、分、秒的时间;(要求可切换显示)l 小时计数器为同步24进制;(同步计数器)l 可精确手动校时,包括小时,分钟,秒;设有按钮,每按一次相应按钮可使对应的时间循环改变,以校时用 手动校时时,长按按钮可加速校时速度。 拓展部分l 可设定24小时任意时刻闹钟(精确到秒),设定按钮与校时按钮共用。设有闹钟开关键l 整点报时 59分51秒 59分53秒 59分55秒59分57秒 led7:4流水灯式依次点亮以模仿电台播音(频率为1HZ)59分59秒时 led灯led3点亮 频率为10HZ 特色部分 stopwatch可储存记忆10组59分59秒99内时间数据的秒表。可显示记录的数据个数和对应顺序精确到1/100秒设有 swo(秒表模式开启键) K3 swp(暂停键) L3scrl(数据控制键)B4 Ncr(清零复位键) A7 counter(记录数据键) M4 - (数据加键) C11 + (数据减键)G12 Switch (显示切换键)-P113代码分析 top_clock 总共分为顶层和底层l 顶层 top.v计时部分:调用底层模块10位计数器 6位计数器 3位计器 4*6=24位寄存器 cnt23:0Cnt3:0 second0 cnt7:4 second1Cnt11:8 minute0 cnt15:12 minute1Cnt19:16 hour0 cnt23:20 hour1校时部分:设计为信号选择器 ad=1时为计时模式,信号为校时信号 ad =0时 为正常计时模式数据显示部分: 设有切换switch端 数码管扫描自动扫描 1KHZ4*8=32位寄存器Temp31:0 分为校时模式显示 ad=1 set=0 swo=0 - cnt闹钟设置模式显示 ad=0 set=1 swo=0- cnt1秒表计时模式显示 ad=0 set=0 swo=1- cnt2正常走时模式显示 其余- cntl 底层部分 计数器 counter10.v counter6.v counter3.v/ counter10.v(09)module counter10(en,ncr,clk,q); input en,ncr,clk;output 3:0 q;reg 3:0 q;always(posedge clk )beginif(ncr) q=4d0;/ncr=0时,异步清零else if(en) q=q;/ EN=0,暂停计数else if (q=4b1001) q=4b0000; else q闹铃(led灯 )开关 闹铃响时 M11 M5亮灯以10MHZ 闪烁 闹铃设定 ad=0 set=1 swo=0 设置方法和校时方法共用键(A7 M4 C11 G12) 方法相同4,秒表模式 ad=0 set=0 swo=1(swp) 暂停键 低电平有效A7 清零键 (包括数据清零)M4 记录数据键 每按一次 记录一个时间数据(59分59秒99以内)可记录10组数据 并可显示当前数据的序号Switch=0时 显示C 数据序号 分 分 Switch=1时 秒 秒 0.1秒 0.01秒 (5) 实验结果的测试和仿真 仿真波形如下:Counter10Counter6Counter3BellRadio 实验结果及说明: (1) 正常走时模式Switch=1 时显示 分分:秒秒Switch=0时显示 时时:分分;(2) 手动校时模式 ad=1 set=0 swo=0使ad=1,每按一下 switch=1,每按一下循环加一(分分秒秒) A7 M4 C11 G12 A7 M4 C11 G12 switch=0,每按一下循环加一(时时分分) A7 M4 C11 G12例如设定为20:12:08(3) 闹钟设定和开关模式 (brcl) N3 -闹铃(led灯 )开关 闹铃响时 M11 M5亮灯以10MHZ 闪烁 闹铃设定 ad=0 set=1 swo=0 设置方法和校时方法共用键(A7 M4 C11 G12) 方法相同(4) 秒表模式 ad=0 set=0 swo=1(swp) 暂停键 低电平有效A7 清零键 (包括数据清零)M4 记录数据键 每按一次 记录一个时间数据(59分59秒99以内)可记录10组数据 并可显示当前数据的序号Switch=0时 显示C 数据序号 分 分 Switch=1时 秒 秒 0.1秒 0.01秒 C11 () 数据减键 序号循环减一 最小为1G12(+) 数据加键 序号循环加一 最大为9 序号即为数据记录 的顺序(5) 其他按法 皆为正常走时模式6实验总结与感想通过多功能时钟的设计过程,我深刻的感觉到复杂电路设计的思路和方法特别重要,好的方法不仅省时省力,也可使程序运行更稳定快速高效。此次的多功能时钟分为好几个大的模块,怎样能恰当好处的连接这些模块是需要经验的,通过这次试验我也初步积累到了一些经验:端口尽量不要太多,能调用模块尽量调用,可省时省力,模块与模块之间尽量独立,但又要设置好端口之间的连接,中间变量不宜过多,但适当的中间变量省下不好麻烦。例如我就设置啦显示的中间变量temp【31:0】 通过不同的模式转换将不同的值赋给temp变量,这样显示的代码就可重复使用。与此同时,在设计中也还有值得改进的地方,就是按钮使用过多,操作方法显得有些复杂,可以进一步优化改进。 遇到的最主要的问题:秒表设计模块中的1/100秒在数码管上无法正常快速显示(由于led灯的余辉效应造成)记录数据时的准确度也就下降 ,人们正常按键时间或大于0.01秒 所以秒表的十分位为准确位 百分位不准确7参考文献【1】 Verilog hdl与数字asic设计基础8.4 和8.5(罗杰主编)(8)附录(源代码) module top(set,ad,swo,swp,switch,bcrl,rcrl,scrl,clk,adj,segs,a,led); input ad,set,swo,bcrl,rcrl,scrl,swp,switch,clk;/定义输入端口 input 3:0 adj; output 6:0 segs;/数码管 output 3:0 a;/扫描输出 output 7:0 led;/led灯 reg 3:0 a; reg 6:0 segs;/shu ma guan reg 31:0 temp; wire 23:0 cnt;/走时模式和校时模式临时变量 wire 23:0 cnt1;/闹钟模式临时变量 wire 31:0 cnt2;/ 秒表模式临时变量 /使能信号 initial begin a=4b1110; end /chu shi hua wire eno,enp1,enp2,enp3,enp4,enp5; in50MHz_out1Hz u0(clk,cp1);/输出频率1HZ in50MHz_out1kHz u7(clk,cp2);/输出频率1kHZ扫描信号 in50MHz_out10Hz u8(clk,cp3);/输出频率10HZ in50MHz_out100Hz u12(clk,cp4);/100Hz counter10 u1(en0,0,cp,cnt3:0); /second个位计数 counter6 u2(enp1,0,cp,cnt7:4);/second十位计数 counter10 u3(enp2,0,cp,cnt11:8);/minutes个位计数 counter6 u4(enp3,0,cp,cnt15:12);/minutes十位计数 counter10 u5(enp4,0,cp,cnt19:16);/hours个位计数 counter3 u6(enp5,0,cp,cnt23:20); /hours十位计数 bell u9(switch,set,bcrl,adj,cp3,cnt,cnt1,led1:0);/闹钟模块 radio u10(rcrl,cnt15:0,cp1,cp3,led7:3);/仿真报时模块 stopwatch u11(swo,scrl,swp,adj,cp4,cp3,cnt2);/秒表模块 assign cp= ad?cp3:cp1, en0=(ad)|(switch&adj0), enp1=ad?(cnt3:0=4h9):(adj1&switch),/产生second十位计数使能信号 enp2=ad?(cnt7:4=4d5)&(cnt3:0=4d9):(adj0&switch=0),/产生minutes个位计数使能信号 enp3=ad?(enp2&(cnt11:8=4d9):(adj1&switch=0),/产生minutes十位计数使能信号 enp4=ad?(enp3&(cnt15:12=4d5):(adj2&switch=0),/产生hours个位计数使能信号 enp5=ad?(enp4&cnt19:16=4d9):(adj3&switch=0),/产生hours十位计数使能信号led2=0; always(ad or set or swo) /显示模式选择 if(ad)&set&(swo) begin temp15:0=cnt115:0;temp31:16=cnt123:8;end else if( (ad)&(set)&swo) temp=cnt2; else begin temp15:0=cnt;temp31:16=cnt23:8;end always(posedge cp2) / 扫描信号循环变化 if(a=4b1110) a=4b1101;/J12 else if(a=4b1101) a=4b1011;/M13 else if(a=4b1011) a=4b0111;/k14 else a=4b1110;/F12 always(posedge cp2) /数码管显示译码 if(switch=1b0) begin if(a=4b1110) begin case(temp19:16) 4d0: segs = 7b1000000; 4d1: segs = 7b1111001;4d2: segs = 7b0100100;4d3: segs = 7b0110000;4d4: segs = 7b0011001;4d5: segs = 7b0010010;4d6: segs = 7b0000010;4d7: segs = 7b1111000;4d8: segs = 7b0000000;4d9: segs = 7b0010000;default segs = 7b1111111; endcase end else if(a=4b1101) begin case(temp23:20) 4d0: segs = 7b1000000; 4d1: segs = 7b1111001;4d2: segs = 7b0100100;4d3: segs = 7b0110000;4d4: segs = 7b0011001;4d5: segs = 7b0010010;default segs = 7b1111111; endcase end else if(a=4b1011) begin case(temp27:24)/hours个位 4h0: segs = 7b1000000;4h1: segs = 7b1111001;4h2: segs = 7b0100100;4h3: segs = 7b0110000;4h4: segs = 7b0011001;4h5: segs = 7b0010010;4h6: segs = 7b0000010;4h7: segs = 7b1111000;4h8: segs = 7b0000000;4h9: segs = 7b0010000;4ha: segs = 7b0001000;default segs = 7b1111111; endcase end else begin case(temp31:28)/hours十位 4h0: segs = 7b1000000;4h1: segs = 7b1111001;4h2: segs = 7b0100100;4h3: segs = 7b0110000;4h4: segs = 7b0011001;4h5: segs = 7b0010010;4h6: segs = 7b0000010;4h7: segs = 7b1111000;4h8: segs = 7b0000000;4h9: segs = 7b0010000;4ha: segs = 7b0001000;4hb: segs = 7b0000011;4hc: segs = 7b1000110;default segs = 7b1111111; endcase end end else if(switch=1) begin if(a=4b1110) case(temp3:0) 4d0: segs = 7b1000000; 4d1: segs = 7b1111001;4d2: segs = 7b0100100;4d3: segs = 7b0110000;4d4: segs = 7b0011001;4d5: segs = 7b0010010;4d6: segs = 7b0000010;4d7: segs = 7b1111000;4d8: segs = 7b0000000;4d9: segs = 7b0010000;default segs = 7b1111111; endcase else if(a=4b1101) case(temp7:4) 4d0: segs = 7b1000000; 4d1: segs = 7b1111001;4d2: segs = 7b0100100;4d3: segs = 7b0110000;4d4: segs = 7b0011001;4d5: segs = 7b0010010;4d6: segs = 7b0000010;4d7: segs = 7b1111000;4d8: segs = 7b0000000;4d9: segs = 7b0010000; default segs = 7b1111111; endcase else if(a=4b1011) case(temp11:8) 4d0: segs = 7b1000000; 4d1: segs = 7b1111001;4d2: segs = 7b0100100;4d3: segs = 7b0110000;4d4: segs = 7b0011001;4d5: segs = 7b0010010;4d6: segs = 7b0000010;4d7: segs = 7b1111000;4d8: segs = 7b0000000;4d9: segs = 7b0010000; default segs = 7b1111111; endcase else case(temp15:12) 4d0: segs = 7b1000000; 4d1: segs = 7b1111001;4d2: segs = 7b0100100;4d3: segs = 7b0110000;4d4: segs = 7b0011001;4d5: segs = 7b0010010;default segs = 7b1111111; endcase endendmodule / counter10.v(09) module counter10(en,ncr,clk,q); input en,ncr,clk;output 3:0 q;reg 3:0 q;always(posedge clk )beginif(ncr) q=4d0;/ncr=0时,同步清零else if(en) q=q;/ EN=0,暂停计数else if (q=4b1001) q=4b0000; else q=q+1;/计数器加1endendmodule/ counter6.v(05)module counter6(en,ncr,clk,q); input en,ncr,clk;output 3:0 q;reg 3:0 q;always(posedge clk )beginif(ncr) q=4b0000;/NCR=0,同步清零else if(en) q=q;/EN=0,暂停计数else if(q=4b0101) q=4b0000;else q=q+1b1;/计数器增1endendmodule/counter3.vmodule counter3(en,ncr,clk,q); input en,ncr,clk; output 3:0 q; reg 3:0 q; always(posedge clk )begin if(ncr) q=4b0000;/NCR=0,同步清零 else if(en=0) q=q;/EN=0,暂停计数 else if(q=4d2) q=4b0000; else q=q+1b1;/计数器增1 endendmodule/分频模块1Hzmodule in50MHz_out1Hz(in_50MHz,out_1Hz); input in_50MHz; output out_1Hz; reg out_1Hz; reg 31:0cnt; /use cnt to count always(posedge in_50MHz) begin if(cnt 32d24999999)/计数到24999999begin cnt = cnt + 1B1; end else begin cnt = 32b0; out_1Hz = out_1Hz; /频率为1HZ end end endmodule/分频模块1KHzmodule in50MHz_out1kHz(in_50MHz,out_1kHz); input in_50MHz; output out_1kHz; reg out_1kHz; reg 31:0cnt; /use cnt to count always(posedge in_50MHz) begin if(cnt 32d24999)/计数到24999begin cnt = cnt + 1B1; end else begin cnt = 32b0; out_1kHz = out_1kHz; /频率为1kHZ end endendmodule module in50MHz_out10Hz(in_50MHz,out_10Hz); input in_50MHz; output out_10Hz; reg out_10Hz; reg 31:0cnt; /use cnt to count always(posedge in_50MHz) begin if(cnt 32d2499999)/计数到2499999begin cnt = cnt + 1B1; end else begin cnt = 32b0; out_10Hz = out_10Hz; /频率为10HZ end endendmodule module in50MHz_out100Hz(in_50MHz,out_100Hz); input in_50MHz; output out_100Hz; reg out_100Hz; reg 31:0cnt; /use cnt to count always(posedge in_50MHz) begin if(cnt 32d249999)/计数到249999begin cnt = cnt + 1B1; end else begin cnt = 32b0; out_100Hz =cnt1)&(cnt1+22h59=cnt)&crl) cl=1; else cl=0; always(negedge clk) if (cl) led=led; else led=2b00; endmodulemodule adjust(clk,ad,switch,adj,cnt1); /闹钟里面的定时模块 input switch,ad,clk; input 3:0 adj; output 23:0 cnt1; reg 23:0 cnt1; always(posedge clk) if(switch=0&ad=1) case(adj) 4b0001:begin if(cnt111:8=4d9) cnt111:8=4d0; else cnt111:8=cnt111:8+1d1;end 4b0010:begin if(cnt115:12=4d5) cnt115:12=4d0; else cnt115:12=cnt115:12+1d1;end 4b0100:begin if(cnt119:16=4d9) cnt119:16=4d0; else cnt119:16=cnt119:16+1d1;end 4b1000:begin if(cnt123:20=4d2) cnt123:20=4d0; else cnt123:20=cnt123:20+1d1;end default cnt1=cnt1; endcaseelse if(switch=1&ad=1) case(adj) 4b0001:begin if(cnt13:0=4d9) cnt13:0=4d0; else cnt13:0=cnt13:0+1d1;end 4b0010:begin if(cnt17:4=4d5) cnt17:4=4d0; else cnt17:4=cnt17:4+1d1;end 4b0100:begin if(cnt111:8=4d9) cnt111:8=4d0; else cnt111:8=cnt111:8+1d1;end 4b1000:begin if(cnt115:12=4d5) cnt115:12=4d0; else cnt115:12=cnt115:12+1d1;end default cnt1=cnt1; endcase else cnt1=cnt1;endmodule/radio.vmodule radio(rcrl,cnt,clk1,clk2,led); /仿真报时模块 input rcrl,clk1,clk2; input 15:0 cnt; output 4:0 led; reg c; reg c2; reg led; always(cnt) if(cnt15:8=8h59) case(cnt7:0) 8h50, 8h52, 8h54, 8h56: c=1; 8h59: c2=1; default :begin c=0;c2=0;endendcaseelse begin c=0;c2=0;end always(posedge clk1) if(c&c2&rcrl) case(cnt7:0) 8h50:led4:1=4b1000; 8h52:led4:1=4b0100; 8h54:led4:1=4b0010; 8h56:led4:1=4b0001; default: led4:1=4b0000; endcase else led4:1=4b0000; always(posedge clk2) if(c&c2&rcrl) led0=1;else led0=0;endmodule/stopwatch.v /秒表模块module stopwatch(start,crl,en,p,clk1,clk2,temp ); input start,crl,en,clk1,clk2; input 3:0 p; output 31:0 temp; wire 23:0 cnt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论