华中科技大学电子线路设计测试实验FPGA数字钟设计报告(共29页)_第1页
华中科技大学电子线路设计测试实验FPGA数字钟设计报告(共29页)_第2页
华中科技大学电子线路设计测试实验FPGA数字钟设计报告(共29页)_第3页
华中科技大学电子线路设计测试实验FPGA数字钟设计报告(共29页)_第4页
华中科技大学电子线路设计测试实验FPGA数字钟设计报告(共29页)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上华中科技大学电子线路设计与测试实验数字钟设计实验报告班级:自动化1505班姓名:李蓝鑫学号:U2017年5月1、 实验目的 1、掌握数字钟电路的设计与调试方法 2、熟悉使用VERILOG HDL语言描述时序逻辑电路的方法,以及EDA仿真技术2、 实验内容 1、以数字形式显示时、分、秒的时间; 2、小时计数器为同步24进制; 3、要求手动校时、校分; 4、任意时刻闹钟; 5、小时显示(12/24)切换电路; 6、仿广播电台正点报时。3、 模块化,层次化设计(框图设计)秒译码显示部分分钟译码显示部分小时译码显示部分二选一模块选择闹钟与计时译码二选一模块选择闹钟与计时译码二

2、选一模块选择闹钟与计时译码防电台控制与闹钟判断以及声音输出电路比较器模块比较闹钟设定时间与计时时间60进制分钟闹钟设定与存储24进制小时闹钟设定与存储60进制分钟计时并存储12/24进制小时计时并存储60进制秒计时并存储十进制计数器六进制计数器十二进制计数器二十四进制计数器4、 代码实现 1、顶层模块 module clock(decoder_h_m,decoder_s,alarm,_50mhz, choose_h_m_de,hour_12_24,adj_min_key,adj_hour_key, set_min_key,set_hr_key,ctrl_bell,mode,vdd); inpu

3、t _50mhz; /DE0实验板上的晶振频率 wire _1khzin,_1hz,_2hz,_500hz; /分频器的输出信号,1khz通过不同位权的二进制数字获得1hz,2hz,500hz的输出信号 input vdd; /用于提供整个数字钟的异步清零端或者高电平电压,0时清零 wire 7:0hour,minute,second; /计时器的输出信号,作为中间变量存储和传输时间信号 wire 7:0hour_12,hour_all; /12进制的小时计数器的变量,hour_all表示把12进制和24进制用一个变量统一,便于译码 input adj_min_key,adj_hour_key

4、; /校正计时器小时分钟的输入按键,为1时校正时间,为0时正常计时 /计时器的中间使能控制信号,用于计时器的扩展,比如分进位用于控制小时的计数,实现模拟数字钟计时功能 wire minl_en,minh_en,hour_en; input hour_12_24; /12进制与24进制的显示切换,也就是选择hou还是hour_12当为1时12进制,为0时是24进制表达 reg alarm_radio; /仿电台的报时信号输出,当此信号为1时报时信号输出,当此信号为0时不输出 wire alarm_clock; /闹钟的信号输出,同仿电台报时的功能,当此信号为1时,闹钟信号输出 input ctr

5、l_bell; /控制闹钟的声音是否输出的按键 output alarm; /仿电台报时或者闹钟声音信号的输出,集成在一个输出端口,采用或运算使之输出在一起 wire 7:0set_hr,set_min;/设定的闹钟时间输出信号,用于用户设置闹钟定时和用于和当前计时器的时间比较 input set_hr_key,set_min_key; /设定闹钟小时和分钟的输入按键,作为小时计数器和分钟计数器的使能信号 /如果按下,使能有效,正常递增,当松开时,使能无效,不再递增,保存当前的值为闹钟所设定的时间。 /闹钟设定时间和计时器比较器的结果输出,分别为小时的十位比较结果 /小时个位比较结果,分钟十位

6、比较结果,分钟个位比较结果 wire hr_h_equ,hr_l_equ,min_h_equ,min_l_equ; input choose_h_m_de; /因4个数码管显示限制,用于控制显示小时还是分钟信号,1表示小时,0表示分钟 output 13:0decoder_h_m,decoder_s; /译码器的输出,也就是小时、分、秒的译码,用于控制七段译码管的亮灭 wire 7:0led_hr,led_min,led_sec; /输出8421BCD码给显示器,时分秒都是两位十进制数表示,需要八位二进制的BCD二进制码来表示 wire 7:0led_min,led_sec; /说明变量的类型

7、 wire 7:0led_h_min; /由于译码管数量限制,所以把计时的时分集中在一个变量里便于译码 input mode;/设定显示器的显示模式,MODE=1时,显示闹钟所设定的时间,反之则显示计时器的时间 /50MHZ分频器调用模块,50mhz为DE0实验板上的晶振频率 divided50mhz de1(_1khzin,vdd,_50mhz); /1khz分频器的模块调用,vdd,作为使能信号和清零信号,都处于高电平状态。前三种频率的信号为分频输出 divided_frequency u0(_1hz,_2hz,_500hz,vdd,vdd,_1khzin); /60进制秒计数器:调用10

8、进制和6进制底层模块构成 counter10 u1(second3:0,vdd,vdd,_1hz); /秒个位计数器,为十进制,使能信号接电源高电平,一直有效,即一直计数,符合秒的概念 counter6 u2(second7:4,vdd,(second3:0=4'h9),_1hz); /秒计数器十位计数器,以秒个位是否达到九作为使能控制信号 /也就是个位是否产生进位,也就实现了60进制的扩展 assign minl_en=adj_min_key?vdd:(second=8'h59); /分钟的个位使能信号产生,adj_min_key为1时校正分钟信号,所以无需等待秒的进位 /而

9、为0时,则是正常计时状态,虚等待秒的进位来充当使能信号,产生正常的分钟计数 assign minh_en=(adj_min_key&&(minute3:0=4'h59)|(mintue3:0=4'h9) &&(second=8'h59); /分钟的十位使能信号产生,adj_min_key为1时校正分钟信号 /但此时即便在校正状态,也需等待分钟信号的个位进位信号 /当其为0时,分钟是正常即使状态,需同时满足秒的进位与分钟的个位进位 /60进制分钟计数器,也是调用十进制计数器与6进制计数器完成,与秒计数器所不同的是使能信号的不同 counte

10、r10 u3(mintue3:0,vdd,minl_en,_1hz); /分计数器的个位计数 counter6 u4(mintue7:4,vdd,minh_en,_1hz); /分计数器的十位计数 /产生小时计数器使能信号 /为1时校正小时,为0时正常计时,由于小时直接采用底层的24进制计数器 /所以只有一个使能信号,无需十位与个位的使能信号相区分 /正常计数时,需同时满足秒的进位与分的进位 assign hour_en=adj_hour_key?vdd:(mintue=8'h59)&&(second=8'h59); /调用24进制计数器进行小时计数 count

11、er24 u5(hour7:4,hour3:0,vdd,hour_en,_1hz);/24进制小时计数器 /调用12进制计数器进行小时计数 counter12 u6(hour_127:4,hour_123:0,vdd,hour_en,_1hz);/12进制小时计数器 /仿电台整点报时功能 always(minute or second) /因为每逢整点都要报时。所以无需引入小时hour信号 if(minute=8'h59) /先判断分钟计数器是否满足59,再进行判断秒计数器的数值 case(second) /由于需要在51,53,55,57,59秒时报时,所以用case语句 8'

12、;h51, 8'h53, 8'h55, 8'h57:alarm_radio=_500hz; /当出现51,53,55,57,时都往下来执行输出500HZ的信号语句 8'h59:alarm_radio=_1khzin; /当出现59秒时,开始输出1000HZ的信号语句 default:alarm_radio=1'b0; /其他情况下输出0,也就是不报时 endcase else alarm_radio=1'b0; /当分钟信号不满足59时输出为0,也就是不输出报时信号 /闹钟设定模块 /60进制分计数器,用于闹钟设定分钟 counter10 su1

13、(set_min3:0,vdd,set_min_key,_2hz); /当设置分钟的按键按下时使能信号有效,开始计数递增 /松开时,设定的分钟个位信号存入闹钟数字存储的低4位BCD码 counter6 su2(set_min7:4,vdd,(set_min3:0=4'h9),_2hz);/分钟的十位设置 /24进制小时计数器,用于闹钟设定小时 counter24 su3(set_hr7:4,set_hr3:0,vdd,set_hr_key,_2hz);/此时,设定小时的按键充当使能信号 /比较闹钟时间和计时器设定时间是否相等 _4bitcomparer su4(hr_h_equ,set

14、_hr_7:4,hour7:4);/调用4位比较器,一次比较一个BCD码表示的十进制数字 _4bitcomparer su5(hr_l_equ,set_hr_3:0,hour3:0); /小时的个位比较结果 _4bitcomparer su6(min_h_equ,set_min_7:4,minute7:4); /分钟的十位比较结果 _4bitcomparer su7(min_l_equ,set_min_3:0,minute3:0); /分钟的个位比较结果 /闹钟声音控制信号 assign alarm_clock=ctrl_bell?(hr_h_equ&&hr_l_equ&

15、;&min_h_equ&&min_l_equ)&&(second0=1'b1)&&_500hz)|(second0=1'b0)&&_1khzin):1'b0; /当CTRL_BELL为1时,闹钟声音被允许输出,才进行后续判断,而为0时,不允许输出,时钟为0; /hr_h_equ&&hr_l_equ&&min_h_equ&&min_l_equ)用于检测是否满足闹钟响铃条件 /即设定时间与当前时间是否相等。 /second0=1'b1)&&

16、amp;_500hz)|(second0=1'b0)&&_1khzin)用于给闹钟输出信号变量赋值 /500hz和1khz交替输出,用秒的最低位一直在0和1跳变来实现。 /把声音输出模块集成在一起,报时和闹钟信号 assign alarm=alarm_radio|alarm_clock; /2选一模块用于选择显示12进制小时还是24进制小时 _2to1mux mu0(hour_all,hour_12_24,hour_12,hour); /选择显示闹钟时间还是正常计时的时间 _2to1mux mu1(led_hr,mode,set_hr,hour_all); _2to1m

17、ux mu2(led_min,mode,set_min,minute); _2to1mux mu3(led_sec,mode,8'h00,second); /用于选择是显示小时还是分钟 _2to1mux mu4(led_h_min,choose_h_m_de,led_hr,led_min); /七段译码器模块调用 decoder de2(led_h_min,decoder_h_m); /译码小时和分钟的集成 decoder de3(led_sec,decoder_s); /译码秒的计数 endmodule 2、二选一模块/二选一模块完成模式选择module _2to1mux(out,s

18、el,x,y); input 7:0x,y; /声明模块内使用变量,用于接收小时与分钟的BCD码 input sel; /选择信号 output 7:0out; /输出信号 assign out=sel?x:y; /用选择语句完成,为1时赋值XEndmodule 3、四位比较器模块/4位比较器模块module _4bitcomparer(equ,a,b); input 3:0a,b; /声明模块内使用变量,用于接收待比较1位十进制数的BCD码 output equ; /输出变量,比较结果存储在此变量中,相等为1,不相等为0 assign equ=(a=b);Endmodule 4、分频器模块(

19、1)、1KHZ分频到500hz,4hz,1hz模块module divided_frequency(_1hzout,_2hzout,_500hzout,ncr,en,_1khzin); input _1khzin,ncr,en; output _1hzout,_2hzout,_500hzout; /分频器的结果输出,即不同频率的信号 wire11:0 q; /用于获取分频信号的变量,在不同位上取,就可获得不同的频率信号 wire en1,en2; /使能信号 /通过使用三个十进制计数器完成1000进制的计数器扩展 counter10 du0(q3:0,ncr,en,_1khzin); coun

20、ter10 du1(q7:4,ncr,en1,_1khzin); counter10 du3(q11:8,ncr,en2,_1khzin); assign en1=(q3:0=4'd9); assign en2=(q7:4=4'd9)&(q3:0=4'd9); assign _1hzout=q11; assign _2hzout=q10; assign _500hzout=q0; /最低位实现二分频,位往高位移动,依次类推Endmodule(2)、50MHZ分频到1khz模块 module divided50mhz(_1khzin,ncr,_50mhz); in

21、put _50mhz,ncr; /异步清零端 output reg _1khzin; reg 15:0q; /用于存储计数数字 always(posedge _50mhz,negedge ncr) begin if(ncr) /异步清零 begin q<=15'd0; _1khzin<=1'b0; end /当计数到24999时,1khz变量翻转,因为50mhz频率是1000hz的50000倍 else if(q=15'b0111) Begin /所以1khz的周期是50mhz的50000倍,24999个周期翻转一次,翻转两次构成 q<=15'

22、d0; /一个周期,恰好满足50000倍的周期关系,也就达到分频的效果 _1khzin<=(_1khzin); end else begin q<=q+1'b1; /正常加1 end end endmodule 5、 十进制模块module counter10(q,ncr,en,cp); input cp,ncr,en; output 3:0 q; /输出变量 reg 3:0 q; always(posedge cp,negedge ncr) /上升沿出发的时钟脉冲信号,下降沿出发的异步清零信号 begin if(ncr) q<=4'b0000; /异步清零

23、else if(en) q<=q; /当使能为0时,暂停计数,保持原来的数值 else if(q=4'b1001)q<=4'b0000; /当数字到达第十个状态,也就是九时再次清零,完成一次十进制计数 else q<=q+1'b1; /正常计数 endEndmodule6、 六进制模块/6进制计数器module counter6(q,ncr,en,cp); input cp,ncr,en; output 3:0 q; reg 3:0 q; always(posedge cp,negedge ncr) begin if(ncr) q<=4'

24、b0000; else if(en) q<=q; else if(q=4'b0101)q<=4'b0000; /与十进制所不同的就是清零的状态不同 else q<=q+1'b1; endEndmodule7、 二十四进制模块/24进制计数器,用于小时计数module counter24(cnth,cntl,ncr,en,cp); input cp,ncr,en; /时钟脉冲,与异步清零信号和使能信号 output 3:0cnth,cntl; /24的十位和个位的BCD码表示 reg 3:0cnth,ctnl; always(posedge cp,neg

25、edge ncr) begin if(ncr) cnth,cntl<=8'h00; /异步清零 else if(en) cnth,cntl<=cnth,cntl; /使能为01时保持原有状态 else if(cnth>2)|(cntl>9)|(cnth=2)&&(cntl>=3)cnth,cntl<=8'h00; /当满足十位大于2,个位大于9,整体大于23时,都属于越界的情况都需要清零 else if(cnth=2)&&(cntl<3) /当十位为2,个位小于3时,个位正常加1 begin cnth&l

26、t;=cnth;cntl<=cntl_1'b1;end else if(cntl=9) /个位为9时,需要进位,然后个位再清零 begin cnth<=cnth+1'b1;cntl<=4'b0000;end else begin cnth<=cnth;cntl<=cntl_1'b1;end /其他情况也是个位正常加1,十位保持原状 endEndmodule8、 十二进制模块module counter12(cnth,cntl,ncr,en,cp); input cp,ncr,en; output 3:0cnth,cntl; reg

27、3:0cnth,cntl; always(posedge cp,negedge ncr) begin if(ncr) cnth,cntl<=8'h00; else if(en) cnth,cntl<=cnth,cntl; else if(cnth>1)|(cntl>9)|(cnth=1)&&(cntl>=1)cnth,cntl<=8'h00; /与24进制所不同之处在于十位是1的时候开始复位 else if(cnth=1)&&(cntl<1) begin cnth<=cnth;cntl<=cn

28、tl+1'b1;end else if(cntl=9) begin cnth<=cnth+1'b1;cntl<=4'b0000;end else begin cnth<=cnth;cntl<=cntl+1'b1;end end endmodule 9、 七段译码管模块module decoder(number,num_decoder); input 7:0number; /需要被译码的两位十进制数的BCD码 output reg 13:0num_decoder; /译码输出变量,直接控制七段译码管的亮与灭 always(number,nu

29、m_decoder) begin case(number7:4) /十位译码,DE0实验板上的显示管是共阳极,为0时亮 4'd0:num_decoder13:7=7'b; 4'd1:num_decoder13:7=7'b; 4'd2:num_decoder13:7=7'b; 4'd3:num_decoder13:7=7'b; 4'd4:num_decoder13:7=7'b; 4'd5:num_decoder13:7=7'b; 4'd6:num_decoder13:7=7'b; 4&

30、#39;d7:num_decoder13:7=7'b; 4'd8:num_decoder13:7=7'b; 4'd9:num_decoder13:7=7'b; default:num_decoder13:7=7'b; endcase case(number3:0) /个位译码 4'd0:num_decoder6:0=7'b; 4'd1:num_decoder6:0=7'b; 4'd2:num_decoder6:0=7'b; 4'd3:num_decoder6:0=7'b; 4'

31、;d4:num_decoder6:0=7'b; 4'd5:num_decoder6:0=7'b; 4'd6:num_decoder6:0=7'b; 4'd7:num_decoder6:0=7'b; 4'd8:num_decoder6:0=7'b; 4'd9:num_decoder6:0=7'b; default:num_decoder6:0=7'b; endcase endendmodule 5、 模块功能仿真 1、二选一模块Sel为选择信号当sel=1时,选择x信号,x全为1当sel=0时,选择Y

32、信号,y全为0比如这一列:a为1010b为0101所以a>b,则输出不想等equ变量即为0 2、四位比较器模块此为500hz分频结果前面一部分使能无效,没有计数满足周期的2倍关系 3、1KHz分频器模块此部分是分频为2hz的结果由图可知2hz的输出的周期为1000ns满足于1khz的周期为2ns的500倍关系由图可知,10进制0开始到9一共10个状态循环计数 4、十进制模块 5、六进制模块从0到11变化,12个状态周期变化,个位、十位分开表示从0到5变化,6个状态周期变化 6、十二进制模块从0到23变化,24个状态周期变化,个位、十位分开表示 7、二十四进制模块输出周期(1us)与输入周

33、期(20ps)之间满足50000倍关系、分频成功 8、50MHz分频模块以此列低位为例当个位数字表示4时译码为,满足显示要求 9、译码器模块6、 数字钟整体功能仿真 1、说明(1)、以闹钟为示例,因为闹钟基本覆盖所用功能(2)、50mhz的分频功能暂时屏蔽,节省仿真时间 (3)、采用前一段设置闹钟时间,接着一段校正时间,基本校正到与闹钟时间相同,而后再正常计时,产生一分钟闹钟的输出。这一段表示对时间的校正脉冲频率是1hz,持续时间为设置闹钟的时间的两倍,这样得到的时间与闹钟相同 2、波形这一段表示闹钟响铃因为计时的时分与闹钟的时分恰好相等,而持续60s后,分钟不相同闹钟消失这是秒的译码输出满足

34、60一循环即高位6个循环低位10个循环图示满足功能要求这一段表示设置闹钟时间脉冲频率为2hz7、 实验总结 1、调试收获 (1)、50mhz分频到1khz的代码实现问题 首先,50mhz到1khz有50000倍的频率关系,反过来就有50000的周期关系; 其次,由于是上升沿触发,所以一个周期只能触发一次,也就是计数一次,所以,当计数为1时,即过了一个周期。最后,每25000个状态时翻转一次,那么50000个状态后就构成输出变量的一个周期,则恰好满足周期的50000倍关系,也就达到了分频的目的 (2)、时分的显示问题由于DE0实验板的只有四个八段译码管,所以分和时的显示只能集成带两个译码管上,用

35、一个拨码开关来进行切换。也可以采用发光二极管来显示秒的计数,八位二进制数分别控制八个发光二极管的亮与灭。 (3)、波形仿真相关问题 在纠正了一些代码的低级语法错位之后,波形仿真各个部分都没有问题,但整体仿真时却始终不出正确结果波形。经反复查证,发现在VDD部分的设置初始值时在前一段设置了低电平之后,在很长一段之后又出现了低电平,也就相当于产生了清零,隔一段时间清零,当然也就不能完成指定的功能;除此之外,还出现了时分秒的输出在波形上的显示的数字递增规律不对,从28以后就直接乱变化了,后来明白,其次时分秒的高四位和低四位并不满足2进制数的规律,因为是十进制关系,所以当28以后的波形仍然是正确的,但是显示的数字却不是单纯的八位二进制数。另外,在数字钟整体进行仿真时,仿真时间极其漫长,甚至几个小时,其实后来一想,不用再分频模块太过于校正,分频模块单独验证功能正确之后,完全可以在整体仿真时屏蔽掉,这样会节省很多仿真时间,因为分频也只是为了得到一个频率的信号,可以直接给定,这样可以快速有效得验证其他功能。(4)、其他问

温馨提示

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

评论

0/150

提交评论