EDA模电子时钟设计资料.docx
- 文档编号:2833419
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:19
- 大小:105.36KB
EDA模电子时钟设计资料.docx
《EDA模电子时钟设计资料.docx》由会员分享,可在线阅读,更多相关《EDA模电子时钟设计资料.docx(19页珍藏版)》请在冰点文库上搜索。
EDA模电子时钟设计资料
苏州科技学院天平学院
EDA电子综合设计
院系:
专业:
班级:
学号:
姓名:
第一部分:
设计说明
1.1设计任务
设计一款数字电子时钟,具体要求如下:
1:
输入条件:
50MHz时钟,2个输入按键;
2:
功能实现:
具有显示时、分、秒功能;采用LED数码管显示;具有闹钟与对时功能,对时精确到分,闹钟设置与对时采用按键作为输入信号。
3:
采用altera公司的quartusII软件进行编程与仿真,设计语言可以选择VerilogHDL或VHDL。
1.2目的与意义
训练综合运用学过的数字电子技术、数字系统设计技术(HDL硬件设计)和计算机编程及电路相关基本知识,培养独立设计比较复杂数字系统设计能力。
通过综合设计,力争掌握使用EDA工具设计数字系统电路的基本方法,包括原理方案的确定、详细设计中的编程与仿真等一系列过程,为以后进行工程实践问题的研究打下设计基础。
时钟,自从它发明的那天起,就成为人类的朋友,但随着社会的进步,科技的的发展,人们对它的功能又提出了新的要求,怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?
这就要求人们不断设计出新型时钟。
现代社会,守时已不仅关系到一个人的职业生涯,还成了衡量一个人道德的标准。
时钟为人们提供了科学利用时间规律的依据,然而,普通的机械钟表与半机械钟表对于忙碌的生活显然早已不太适应,设计一款高精度数字时钟势在必行。
本课题将通过对目前市场上的数字电子钟的研究,利用EDA技术设计一款高精度数字式电子钟,使人们可以得到精确时间显示,帮助人们合理安排时间,方便人们的生活。
第二部分原理方案设计
设计一个多功能数字时钟,具有时分、秒计数显示、闹钟功能。
能够利用按键实现对闹钟时间的设定并在当前显示时间到时后能够进行闹钟提示。
能够利用按键实现“较时”、“较分”功能,随时对数码管的显示进行校正和校对。
数字中系统主要由系统时钟,三个功能按键(mode,turn,change),FPGA,数码管和蜂鸣器部分组成。
图1多功能数字时钟整体模块图
2.1分频模块方案设计
分频模块用于为系统的实现提供稳定的工作频率和计时信号源,产生分频为1HZ频率的信号作为计时模块的信号源。
分频算法设计:
定义变量并根据需要得到的分频信号设定计数值,对该变量进行加或减计数,每到达一次计数值点,将该变量清零或重置,并且对输出信号取一次反,即可以得到所需的分频信号。
在这里使用任意分频计数器。
定义变量并且设定一个上限值,每次加计数到该上限值时,输出该计数值的最高位。
2.2显示模块
计时模块是对1s的信号源进行秒计时,计时满后向上进位的设计思想。
译码显示模块采用的是数码管的动态扫描方式。
2.3控制模块
设置三个按键,一个作为功能控制信号,按键每次加一,加到三在归零。
为0:
计时功能;为1:
闹铃功能;为2:
手动校对功能。
一个按键选择是调整时间,还是分钟,若长时间按住该键,可使秒信号清零,用于精确调时。
一个按键用于手动调整,每按一次,计数器加1,如果长按,则连续快速加1;用于快速调时和定时。
第三部分详细设计过程
图2顶层模块
3.1分频模块
3.1.1模块功能描述
该模块为任意分频计数器,在这里使用了两个分频模块,分别输出4Hz和1Khz的时钟信号。
功能:
对输入时钟clock进行F_DIV倍分频后输出clk_out。
其中F_DIV为分频系数,分频系数范围为1~2^n(n=F_DIV_WIDTH)若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。
若分频系数为偶数,则输出时钟占空比为50%;若分频系数为奇数,则输出时钟占空比取决于输入时钟占空比和分频系数(当输入为50%时,输出也是50%)。
图3分频模块div_4hz
图4分频模块div_1k
3.1.2模块设计思想
定义变量为分频系数,若位偶数,则产生分频系数的一半个时钟周期为高电平,分频系数的一半个时钟周期为低电平;若为奇数,则相应地偏移一个。
3.1.3设计关键知识点
若分频系数为偶数,则输出时钟占空比为50%;若分频系数为奇数,则输出时钟占空比取决于输入时钟占空比和分频系数(当输入为50%时,输出也是50%)。
modulediv_4hz(clock,clk_out);//I/O口声明
inputclock;//输入时钟
outputclk_out;//输出时钟
//内部寄存器
regclk_p_r;//上升沿输出时钟
regclk_n_r;//下降沿输出时钟
reg[F_DIV_WIDTH-1:
0]count_p;//上升沿脉冲计数器
reg[F_DIV_WIDTH-1:
0]count_n;//下降沿脉冲计数器
//参数--分频系数
parameterF_DIV=12500000;//分频系数<<<<-----修改这里
parameterF_DIV_WIDTH=32;//分频计数器宽度
wirefull_div_p;//上升沿计数满标志
wirehalf_div_p;//上升沿计数半满标志
wirefull_div_n;//下降沿计数满标志
wirehalf_div_n;//下降沿计数半满标志
//判断计数标志位置位与否
assignfull_div_p=(count_p assignhalf_div_p=(count_p<(F_DIV>>1)-1); assignfull_div_n=(count_n assignhalf_div_n=(count_n<(F_DIV>>1)-1); //时钟输出 assignclk_out=(F_DIV==1)? clock: (F_DIV[0]? (clk_p_r&clk_n_r): clk_p_r); //上升沿脉冲计数 always@(posedgeclock) begin if(full_div_p) begin count_p<=count_p+1'b1; if(half_div_p) clk_p_r<=1'b0; else clk_p_r<=1'b1; end else begin count_p<=0; clk_p_r<=1'b0; end end //下降沿脉冲计数 always@(negedgeclock) begin if(full_div_n) begin count_n<=count_n+1'b1; if(half_div_n) clk_n_r<=1'b0; else clk_n_r<=1'b1; end else begin count_n<=0; clk_n_r<=1'b0; end end endmodule 3.2显示模块 3.2.1模块功能描述 该模块设计为时钟显示模块,一共8个共阳极数码管,显示格式为XX.XX.XX。 3.2.2模块设计思想 整个时钟的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的范围为0~23时。 由于分钟和秒钟显示的范围都是从0~59,可以用一个4位的二进制码显示十位,用一个四位的二进制码(BCD码)显示个位;对于小时因为他的范围是从0~23,同样可以用一个4位的二进制码显示十位,用一个4位的二进制码(BCD码)显示个位。 3.2.3设计关键知识点 由于动态扫描,需要一个频率较高的时钟信号用于刷新显示。 送入显示的数高低4位分离开来,分别用于显示十位和个位。 图5显示模块scan_led modulescan_led(clk_1k,dig,seg,hourh,hourl1,minh,minl1,sech,secl1); inputclk_1k; input[3: 0]hourh,hourl1,minh,minl1,sech,secl1; output[7: 0]dig; output[7: 0]seg; reg[7: 0]dig; reg[7: 0]seg; reg[3: 0]dataout_buf; reg[2: 0]count; always@(posedgeclk_1k) begin count<=count+1'b1; end always@(posedgeclk_1k) begin case(count) 3'd0: dataout_buf=secl1; 3'd1: dataout_buf=sech; 3'd2: dataout_buf=4'ha; 3'd3: dataout_buf=minl1; 3'd4: dataout_buf=minh; 3'd5: dataout_buf=4'ha; 3'd6: dataout_buf=hourl1; 3'd7: dataout_buf=hourh; endcase case(count) 3'd0: dig=8'b1111_1110; 3'd1: dig=8'b1111_1101; 3'd2: dig=8'b1111_1011; 3'd3: dig=8'b1111_0111; 3'd4: dig=8'b1110_1111; 3'd5: dig=8'b1101_1111; 3'd6: dig=8'b1011_1111; 3'd7: dig=8'b0111_1111; endcase end always@(dataout_buf) begin case(dataout_buf) 4'h0: seg=8'b0000_0011; 4'h1: seg=8'b1001_1111; 4'h2: seg=8'b0010_0101; 4'h3: seg=8'b0000_1101; 4'h4: seg=8'b1001_1001; 4'h5: seg=8'b0100_1001; 4'h6: seg=8'b0100_0001; 4'h7: seg=8'b0001_1111; 4'h8: seg=8'b0000_0001; 4'h9: seg=8'b0000_1001; 4'ha: seg=8'b1111_1101; endcase end endmodule 3.3时钟控制模块 3.3.1模块设计功能 该模块设计为多功能数字钟的控制模块。 各信号引脚功能定义为: mode: 功能控制信号;为0: 计时功能;为1: 闹铃功能;为2: 手动校对功能; turn: 在手动校对时,选择是调整时间,还是分钟,若长时间按住该键,可使秒信号清零,用于精确调时; change: 手动调整时,每按一次,计数器加1,如果长按,则连续快速加1;用于快速调时和定时; hour,min,sec: 时,分,秒显示信号; alert: 扬声器驱动信号;用于产生闹铃音和报时音;闹铃音为持续20秒的急促的“嘀嘀嘀”音,若按住“change”键,可屏蔽该闹铃音;整点报时音为“嘀嘀嘀嘀嘟”四短一长音; LD_alert: 接发光二极管,指示是否设置了闹钟功能; LD_hour: 接发光二极管,指示当前调整的是小时信号; LD_min: 接发光二极管,指示当前调整的是分钟信号。 3.3.2模块设计思想 mode按键每触发一次,定义一个变量m自加,从0加到2;加满2,重新置为0。 用case语句产生3种模式。 图6时钟模块clock1 moduleclock(clk,clk_1k,mode,change,turn,alert,hourh,hourl1,minh,minl1,sech,secl1, LD_alert,LD_hour,LD_min); inputclk,clk_1k,mode,change,turn; outputalert,LD_alert,LD_hour,LD_min; output[3: 0]hourh,hourl1,minh,minl1,sech,secl1; reg[7: 0]hour,min,sec,hour1,min1,sec1,ahour,amin; reg[1: 0]m,fm,num1,num2,num3,num4; reg[1: 0]loop1,loop2,loop3,loop4,sound; regLD_hour,LD_min; regclk_1Hz,clk_2Hz,minclk,hclk; regalert1,alert2,ear; regcount1,count2,counta,countb; wirect1,ct2,cta,ctb,m_clk,h_clk; always@(posedgeclk) begin clk_2Hz<=~clk_2Hz; if(sound==3)beginsound<=0;ear<=1;end elsebeginsound<=sound+1;ear<=0;end end//ear信号用于产生或屏蔽声音 always@(posedgeclk_2Hz)//由4HZ的输入时钟产生1HZ的时基信号 clk_1Hz<=~clk_1Hz; always@(negedgemode)//mode信号控制系统在三种功能间的转换 begin if(m==2)m<=0; elsem<=m+1; end always@(negedgeturn)//产生count1,count1,counta,countb四个信号 fm<=~fm; always begin case(m) 2: beginif(! fm) begincount1<=! change;{LD_min,LD_hour}<=2;end else begincounta<=! change;{LD_min,LD_hour}<=1;end {count2,countb}<=0; end 1: beginif(! fm) begincount2<=! change;{LD_min,LD_hour}<=2;end else begincountb<=! change;{LD_min,LD_hour}<=1;end {count1,counta}<=2'b00; end default: {count1,count2,counta,countb,LD_min,LD_hour}<=0; endcase end always@(negedgeclk) if(count2)begin if(loop1==3)num1<=1; else beginloop1<=loop1+1;num1<=0;end end elsebeginloop1<=0;num1<=0;end always@(negedgeclk) if(countb)begin if(loop2==3)num2<=1; else beginloop2<=loop2+1;num2<=0;end end elsebeginloop2<=0;num2<=0;end always@(negedgeclk) if(count1)begin if(loop3==3)num3<=1; else beginloop3<=loop3+1;num3<=0;end end elsebeginloop3<=0;num3<=0;end always@(negedgeclk) if(counta)begin if(loop4==3)num4<=1; else beginloop4<=loop4+1;num4<=0;end end elsebeginloop4<=0;num4<=0;end assignct1=(num3&clk)|(! num3&m_clk); assignct2=(num1&clk)|(! num1&count2); assigncta=(num4&clk)|(! num4&h_clk); assignctb=(num2&clk)|(! num2&countb); always@(posedgeclk_1Hz) if(! (sec1^8'h59)|(! turn)&(! m)) begin sec1<=0;if(! ((! turn)&(! m)))minclk<=1; end elsebegin if(sec1[3: 0]==4'b1001) beginsec1[3: 0]<=4'b0000;sec1[7: 4]<=sec1[7: 4]+1;end elsesec1[3: 0]<=sec1[3: 0]+1;minclk<=0; end assignm_clk=minclk||count1; always@(posedgect1) begin if(min1==8'h59)beginmin1<=0;hclk<=1;end elsebegin if(min1[3: 0]==9) beginmin1[3: 0]<=0;min1[7: 4]<=min1[7: 4]+1;end elsemin1[3: 0]<=min1[3: 0]+1;hclk<=0; end end assignh_clk=hclk||counta; always@(posedgecta) if(hour1==8'h23)hour1<=0; elseif(hour1[3: 0]==9) beginhour1[7: 4]<=hour1[7: 4]+1;hour1[3: 0]<=0;end elsehour1[3: 0]<=hour1[3: 0]+1; always@(posedgect2) if(amin==8'h59)amin<=0; elseif(amin[3: 0]==9) beginamin[3: 0]<=0;amin[7: 4]<=amin[7: 4]+1;end elseamin[3: 0]<=amin[3: 0]+1; always@(posedgectb) if(ahour==8'h23)ahour<=0; elseif(ahour[3: 0]==9) beginahour[3: 0]<=0;ahour[7: 4]<=ahour[7: 4]+1;end elseahour[3: 0]<=ahour[3: 0]+1; always if((min1==amin)&&(hour1==ahour)&&(amin|ahour)&&(change)) if(sec1<8'h20)alert1<=1; elsealert1<=0; elsealert1<=0; always case(m) 3'b00: beginhour<=hour1;min<=min1;sec<=sec1;end 3'b01: beginhour<=ahour;min<=amin;sec<=8'hzz;end 3'b10: beginhour<=hour1;min<=min1;sec<=8'hzz;end endcase assignLD_alert=(ahour|amin)? 1: 0; assignalert=((alert1)? clk_1k&clk: 0)|alert2; always begin if((min1==8'h59)&&(sec1>8'h54)||(! (min1|sec1))) if(sec1>8'h54)alert2<=ear&clk_1k; elsealert2<=! ear&clk_1k; elsealert2<=0; end assign{hourh,hourl1}=hour; assign{minh,minl1}=min; assign{sech,secl1}=sec; endmodule 第四部分功能仿真 4.1分频仿真波形 由于50MHz分频为4Hz分频系数太大,这里以50分频为例。 图750分频示例 在clk_out的半个周期内,clk出现了25个周期,50分频是正确的。 4.2计时仿真 图8时间-分计数 如图8所示,每有一个clk脉冲信号,送给显示的数加1,从0加到59,再到0,如此循环。 4.3闹钟仿真 图9闹钟仿真波形 如图9所示为01: 02: 00-01: 02: 59的一分钟闹钟波形,当计数满60(图中显示为59)时,alert信号置位。 第五部分总结 此次设计过程中,学会了使用Quartus软件来进行电子时钟仿真。 和同学交流更使我对设计有了新的认识也对自己提出了新的要求。 课题设计过程中我不怕失败,在失败中总结经验,为成功积累素材;学着自我超越,敢于尝试,在尝试中进步,这对我能力的提高大有好处。 设计中有太多的不懂和陌生,但是我会多看、多想、多问、多学,每一个任务都是一个锻炼的机会和成长的过程,我在规定的时间尽善尽美的完成,把自己的能力发挥到最大限度。 这个课题设计的过程让我学习、工作的思路有了更为明朗的认识: 它是站在一定高度上去工作的,眼界要放宽,思路要开阔,内容要饱满。 我曾经也做过不少课程设计,但都是局限在课本中,而这次实验设计,能够让我走出来,仿佛推开门看见外面的世界是如此之大,如同井底之蛙跳上井沿过程中要有很好的团结合作意识和责任感,积极的参与到实验设计的讨论中去,学习和听取别人的意见,我也主动的发表意见,用一个积极上进、激情乐观的态度面对每一天的实验设计生活,让我的学习生活丰富多彩。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 电子 时钟 设计 资料