EDA模电子时钟设计.docx

上传人:b****8 文档编号:9924704 上传时间:2023-05-22 格式:DOCX 页数:19 大小:115.74KB
下载 相关 举报
EDA模电子时钟设计.docx_第1页
第1页 / 共19页
EDA模电子时钟设计.docx_第2页
第2页 / 共19页
EDA模电子时钟设计.docx_第3页
第3页 / 共19页
EDA模电子时钟设计.docx_第4页
第4页 / 共19页
EDA模电子时钟设计.docx_第5页
第5页 / 共19页
EDA模电子时钟设计.docx_第6页
第6页 / 共19页
EDA模电子时钟设计.docx_第7页
第7页 / 共19页
EDA模电子时钟设计.docx_第8页
第8页 / 共19页
EDA模电子时钟设计.docx_第9页
第9页 / 共19页
EDA模电子时钟设计.docx_第10页
第10页 / 共19页
EDA模电子时钟设计.docx_第11页
第11页 / 共19页
EDA模电子时钟设计.docx_第12页
第12页 / 共19页
EDA模电子时钟设计.docx_第13页
第13页 / 共19页
EDA模电子时钟设计.docx_第14页
第14页 / 共19页
EDA模电子时钟设计.docx_第15页
第15页 / 共19页
EDA模电子时钟设计.docx_第16页
第16页 / 共19页
EDA模电子时钟设计.docx_第17页
第17页 / 共19页
EDA模电子时钟设计.docx_第18页
第18页 / 共19页
EDA模电子时钟设计.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

EDA模电子时钟设计.docx

《EDA模电子时钟设计.docx》由会员分享,可在线阅读,更多相关《EDA模电子时钟设计.docx(19页珍藏版)》请在冰点文库上搜索。

EDA模电子时钟设计.docx

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软件来进行电子时钟仿真。

和同学交流更使我对设计有了新的认识也对自己提出了新的要求。

课题设计过程中我不怕失败,在失败中总结经验,为成功积累素材;学着自我超越,敢于尝试,在尝试中进步,这对我能力的提高大有好处。

设计中有太多的不懂和陌生,但是我会多看、多想、多问、多学,每一个任务都是一个锻炼的机会和成长的过程,我在规定的时间尽善尽美的完成,把自己的能力发挥到最大限度。

 

这个课题设计的过程让我学习、工作的思路有了更为明朗的认识:

它是站在一定高度上去工作的,眼界要放宽,思路要开阔,内容要饱满。

我曾经也做过不少课程设计,但都是局限在课本中,而这次实验设计,能够让我走出来,仿佛推开门看见外面的世界是如此之大,如同井底之蛙跳上井沿过程中要有很好的团结合作意识和责任感,积极的参与到实验设计的讨论中去,学习和听取别人的意见,我也主动的发表意见,用一个积极上进、激情乐观的态度面对每一天的实验设计生活,让我的学习生活丰富多彩。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2