EDA课程设计多功能数字钟.docx
- 文档编号:11014339
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:26
- 大小:553.60KB
EDA课程设计多功能数字钟.docx
《EDA课程设计多功能数字钟.docx》由会员分享,可在线阅读,更多相关《EDA课程设计多功能数字钟.docx(26页珍藏版)》请在冰豆网上搜索。
EDA课程设计多功能数字钟
EDA课程设计
实用多功能数字钟
学院:
机械与电子工程学院
专业:
电子科学与技术
班级:
学号:
姓名:
指导教师:
2012年1月13日
摘要:
本次课程设计用Verilog语言,选择QuartusII开发工具来设计多功能数字钟。
就在前不久,我们还刚刚完成了单片机的多功能时钟的设计,继而又做EDA电子钟实验。
通过两者之间的对比可以发现EDA的许多特点。
电子设计自动化(EDAElectronicDesignAutomation)技术是一种以计算机作为工作平台,以EDA软件工具为开发环境,以硬件描述语言和原理图描述为设计入口,以可编程逻辑器为实验载体,以ASIC、SOC和SOPC嵌入式系统为设计目标,以数字系统系统设计为应用方向的电子产品自动化设计技术。
而QuartusⅡ是Altera公司推出的的第四代PLD开发系统。
主要用于设计新器件和大规模CPLD/FPGA。
使用QuartusⅡ的设计者不需精通器件内部的复杂结构。
设计者可以用自己熟悉的设计工具(如原理图输入或硬件描述语言)建立设计,QuartusⅡ把这些设计转自动换成最终所需的格式。
设计方法分为:
硬件描述语言,verilog语言描述。
verilog语言描述可能精确和简练地表示电路的逻辑功能,现在PLD的设计过程中广泛使用。
以上是对EDA和QuartusⅡ的了解。
本次EDA的课程设计虽然时间有限,但是设计的题目《多功能数字钟》很贴近人的日常生活,让我们学生对最基本的电子产品有个深入的认识。
本次的课程设计是基于VerilogHDL的多功能数字钟,完成时、分、秒的显示功能。
设计利用VerilogHDL语言自顶向下的设计理念,突出其作为硬件描述语言的良好的可读性、可移植性以及易于理解等优点。
整个程序语言功能主要包含计时,闹钟,校时,整点报时等功能。
关键词:
EDA软件,Verilog语言,QuartusII开发工具,多功能时钟
4.2.1整点报时程序模块6
4.2.2仿真波形及分析7
4.3.1闹铃程序模块8
1QuartusⅡ仿真软件的使用简介
QuartusⅡ是Altera公司推出的的第四代PLD开发系统。
主要用于设计新器件和大规模CPLD/FPGA。
使用QuartusⅡ的设计者不需精通器件内部的复杂结构。
设计者可以用自己熟悉的设计工具(如原理图输入或硬件描述语言)建立设计,QuartusⅡ把这些设计转自动换成最终所需的格式。
其设计速度非常快。
对于一般几千门的电路设计,使用QuartusⅡ,从设计输入到器件编程完毕,用户拿到设计好的逻辑电路,大约只需几小时。
设计处理一般在数分钟内内完成。
特别是在原理图输入等方面。
。
PLD器件的逻辑功能描述一般分为原理图描述和硬件描述语言描述,原理图描述是一种直观简便的方法,它可以将现有的小规模集成电路实现的功能直接用PLD器件来实现,而不必去将现有的电路用语言来描述,但电路图描述方法无法做到简练;硬件描述语言描述是可编程器件设计的另一种描述方法,语言描述可能精确和简练地表示电路的逻辑功能,现在PLD的设计过程中广泛使用。
常用的硬件描述语言有ABEL,VHDL语言等。
[12-13]
在这里我们可以先看一看用FPGA/CPLD开发工具进行电路设计的一般流程
通常可将FPGA/CPLD设计流程归纳为以下7个步骤,这与ASIC设计有相似之处。
1.设计输入。
在传统设计中,设计人员是应用传统的原理图输入方法来开始设计的。
自90年代初,Verilog、VHDL、AHDL等硬件描述语言的输入方法在大规模设计中得到了广泛应用。
2.功能仿真。
设计的电路必须在布局布线前验证电路功能是否有效。
PLD设计中,有时跳过这一步。
3.设计编译。
设计输入之后就有一个从高层次系统行为设计向门级逻辑电路设转化翻译过程,即把设计输入的某种或某几种数据格式(网表)转化为软件可识别的某种数据格式(网表)。
4.优化。
对于上述综合生成的网表,根据布尔方程功能等效的原则,用更小更快的综合结果代替一些复杂的单元,并与指定的库映射生成新的网表,这是减小电路规模的一条必由之路。
5.布局布线。
在PLD设计中,3-5步可以用PLD厂家提供的开发软件自动一次完成。
6.时序仿真。
需要利用在布局布线中获得的精确参数再次验证电路的时序。
7.生产。
布线和后仿真完成之后,就可以开始ASCI或PLD芯片的投产。
同样,使用QuartusⅡ基本上也是有以上几个步骤,但可简化为:
设计输入、设计编译、设计仿真、下载。
2课程设计任务
应用VerilogHDL设计一个多功能的数字钟,具有下述功能:
(1)计时功能:
包括时,分,秒的计时;
(2)定时与闹钟功能:
能在设定的时间发出闹铃音;
(3)校时功能:
对小时,分钟和秒能手动调整以校准时间;
(4)整点报时功能:
每逢整点,产生“嘀嘀嘀嘀—嘟”,四短一长的报时音。
3设计依据和设计方案
3.1设计原理:
数字电子钟由振荡器、分频器、计数器、译码显示器、报时等电路组成。
其中振荡器和分频器组成标准秒信号发生器由不同进制的计数器、译码器和显示器组成计时系统。
秒信号送入计数器进行计数把累加的结果以‘时’、‘分’、‘秒’的数字显示出来。
‘时’显示由12进制计数器、译码器、显示器构成。
‘分’、‘秒’显示分别由60进制计数器、译码器、显示器构成。
可进行整点报时计时出现误差时可以用校时电路校时、校分。
3.2设计目标和方法:
QuartusⅡ软件作为电子钟设计工作平台以数字电路为设计数字时钟的理论基础按照“自顶向下”的层次化设计方法设计该电路对整个系统进行方案设计和功能划分系统的关键电路用一片或几片专用集成电路实现应用QuartusⅡ软件进行数字电路的设计与仿真。
3.3设计总体方案
数字计时器基本功能是计时,因此首先需要获得具有精确振荡时间的脉振信号,以此作为计时电路的时序基础,实验中可以使用的振荡频率源为50MHz。
数字计时器要实现时分秒计时、闹钟闹铃、时分秒手动校时、时分秒清零,时间保持和整点报时等多种基本功能,所有功能都基于计时功能。
因此首先需要获得具有精确振荡时间的脉振信号,以此作为计时电路的时序基础,实验中可以使用的振荡频率源为50MHZ,通过分频获得所需脉冲频率1Hz。
得到1Hz脉冲后,要产生计时模块,必须需要加法器来进行加法。
时钟能够产生时间前进是对秒脉冲计数产生形成的,为了形成时分秒,需要对秒进位信号进行计数从而产生分,对分进位信号进行计数产生时信号。
秒和分均为60进制,时为24进制,所以需要有模60和模24计数器。
3.4总体模块分类介绍
总共分为11各模块,一个总的顶层调用模块:
(1)sound_ddd_du嘀嘀嘀—嘟声音模块。
(2)sound_ddd嘀嘀嘀闹铃声
(3)hexcounter16进制计数器模块。
(4)adder加法器模块。
(5)bitsel将输出解码成时分秒选择模块。
(6)switch去抖模块。
(7)led译码显示模块:
7段数码管显示器,分别显示小时、分钟、秒。
(8)clk50mto1时钟分频模块:
50mhz时钟分频到1hz。
(9)counter_time计时模块:
生成60进制、24进制计数器。
(10)alarm_time闹钟时间设定模块。
(11)alarm闹铃模块.
(12)clock顶层模块。
4设计步骤
4.1CLOCK顶层调用模块
4.1.1顶层程序模块
顶层模块中,调用各个模块来实现多功能数字钟。
首先是建立在计时模块上完成整个数字钟的走时,计时模块又是建立在50mhz分频至1hz、八位全加器、十六进制计数器等模块上完成整体的基本走时。
然后可以建立闹钟模块,且设置modestate置00为计时模式,10选择闹钟模块,01手动调整模式,11非法模式来避免闹钟模块与走时模块的冲突。
其次在闹铃模块中,ld_alert是否设置了闹铃控制闹铃的开关,mcheck手动调整时间,turn来控制调整的时间在分与时的选择,change是调整信号,alert为闹铃输出。
再通过led输出时分秒。
moduleclock(clk50m,mode,turn,change,mreset,led_hour1,led_hour0,led_minu1,led_minu0,led_sec1,led_sec0,alert,ld_alert,ld_check,ld_hour,ld_min,ld_sec);
inputclk50m;
inputmode;
inputturn;
inputchange;
inputmreset;
outputalert;
outputld_alert;
outputld_check;
outputld_hour;
outputld_min;
outputld_sec;
output[7:
0]led_hour1;
output[7:
0]led_hour0;
output[7:
0]led_minu1;
output[7:
0]led_minu0;
output[7:
0]led_sec1;
output[7:
0]led_sec0;
reg[1:
0]modestate;
wirenowmode;
wireischecking;
assign{nowmode,ischecking}=modestate;
always@(negedgemode)
begin
case(modestate)
2'b00:
modestate<=2'b10;
2'b10:
modestate<=2'b01;
2'b01:
modestate<=2'b00;
default:
modestate<=2'b00;
endcase
end
wirerest,clk_1hz;
switch#(8)rmjitter(clk50m,mreset,reset);
clk50mtol(clk50m,clk1hz);
wire[2:
0]selcode;
bitselseldecoder(nowmode,ischecking,turn,selcode,rest);
wire[3:
0]clocktime0,clocktime1,clocktime2,clocktime3,clocktime4,clocktime5;
wireclockalarmon;
wire[2:
0]counterselcode;
assigncounterselcode=(modestate==2'b01)?
selcode:
3'b000;
counter_timeclock_time(clk_1hz,counterselcode,~change,clocktime5,clocktime4,clocktime3,
clocktime2,clocktime1,clocktime0,clockalarmon,reset);
wire[3:
0]alarmtime0,alarmtime1,alarmtime2,alarmtime3;
wirealarmon;
alarm_timealarm_time(clk_1hz,nowmode,selcode[2:
1],change,{clocktime5,clocktime4,clocktime3,
clocktime2,clocktime1},{alarmtime3,alarmtime2,alarmtime1,alarmtime0},
alarmon,reset);
wirevoiceout;
alarmalarmvoice(clk50m,{clockalarmon,alarmon},voiceout,reset);
assign{ld_hour,ld_min,ld_sec}=(ischecking||nowmode)?
selcode:
3'b000;
assignalert=voiceout;
reg[3:
0]showout2,showout3,showout4,showout5;
ledled5(showout5,1'b1,led_hour1);
ledled4(showout4,1'b0,led_hour0);
ledled3(showout3,1'b1,led_minu1);
ledled2(showout2,1'b0,led_minu0);
ledled1(clocktime1,1'b1,led_sec1);
ledled0(clocktime0,1'b1,led_sec0);
always
beginif(nowmode)
beginshowout5=alarmtime3;showout4=alarmtime2;
showout3=alarmtime1;showout2=alarmtime0;end
elsebegin
showout5=clocktime5;showout4=clocktime4;
showout3=clocktime3;showout2=clocktime2;end
end
assignld_alert=nowmode;assignld_check=ischecking;
endmodule
4.1.2仿真波形及分析
在clock为1ps周期情况下,设置modestate置00为计时模式,10选择闹钟模块,01手动调整模式,11非法模式,在闹铃模块中,ld_alert高电平闹铃开,mcheck为高电平则可以手动调整时间,turn控制了调整的时间在分与时的选择,change有效则改变调整的数值,alert有效闹铃输出。
ledhourl,led_hour0,led_minul,led_minu0,led_secl,ledsec0输出时分秒。
4.2sound_ddd_du嘀嘀嘀—嘟声音模块
4.2.1整点报时模块
modulesound_ddd_du(clk_lk,on,out);
parameterSOUNDSPACE=300;
parametershotstopspace=200;
parameterlongsoundspace=600;
inputclk_lk,on;outputregout;regsound_di,sound_du;
always@(posedgeclk_lk)sound_di<=~sound_di;
always@(posedgesound_di)sound_du<=~sound_du;
reg[11:
0]mscount;
always@(posedgeclk_lk)
beginif(on)begin
if(mscount<(SOUNDSPACE+shotstopspace)*3+longsoundspace+10)
mscount<=mscount+1'b1;endelsemscount<=0;
end
always@(negedgeclk_lk)
beginif(on)
beginif((mscount>=0)&&(mscount elseif((mscount>=SOUNDSPACE)&&(mscount<(SOUNDSPACE+shotstopspace))) out<=0;elseif((mscount>=(SOUNDSPACE+shotstopspace))&&(mscount<(SOUNDSPACE+shotstopspace)+SOUNDSPACE)) out<=sound_di;elseif((mscount>=(SOUNDSPACE+shotstopspace)+SOUNDSPACE)&&(mscount<(SOUNDSPACE+shotstopspace)*2)) out<=0;elseif((mscount>=(SOUNDSPACE+shotstopspace)*2)&&(mscount<((SOUNDSPACE+shotstopspace)*2+SOUNDSPACE))) out<=sound_di;elseif((mscount>=(SOUNDSPACE+shotstopspace)*2+SOUNDSPACE)&&(mscount<(SOUNDSPACE+shotstopspace)*3)) out<=0;elseif((mscount>=(SOUNDSPACE+shotstopspace)*3)&&(mscount<((SOUNDSPACE+shotstopspace)*3+longsoundspace))) out<=sound_du;elseout<=0; endendmodule 4.2.2仿真波形及分析 再出现低信号后连续出现三个高电平,一段延时再出现一个高电平 4.3sound_ddd嘀嘀嘀闹铃声模块 4.3.1闹铃模块 modulesound_ddd(clk_lk,on,out); parametersoundspace=300; parametershotstopspace=200; parameterlongstopspace=500; inputclk_lk,on;outputregout;regsound; always@(posedgeclk_lk) beginsound<=~sound;end reg[10: 0]mscount; always@(posedgeclk_lk) beginif(mscount==(soundspace*3+shotstopspace*2+longstopspace-1)) mscount<=0;elsemscount<=mscount+1'b1; end always@(negedgeclk_lk) beginif(on) beginif((mscount>=0)&&(mscount elseif((mscount>=soundspace)&&(mscount<(soundspace+shotstopspace))) out<=0;else if((mscount>=(soundspace+shotstopspace))&&(mscount<(soundspace+shotstopspace)+soundspace)) out<=sound;else if((mscount>=(soundspace+shotstopspace)+soundspace)&&(mscount<(soundspace+shotstopspace)*2)) out<=0;else if((mscount>=(soundspace+shotstopspace)*2)&&(mscount<((soundspace+shotstopspace)*2+soundspace))) out<=sound; elseout<=0;end elseout<=0;end endmodule 4.3.2仿真波形及分析 4.4hexcounter16进制计数器模块 4.4.1H进制计数器模块 经过分频后,输出脉冲频率为1hz,即周期为1s,通过16进制计数器,将其转化为16进制数字。 16进制采用4位二进制,因此寄存器长度为四位。 当set高电平有效时,将数据送给counter计数器,carrtbit清零,如若counter计数器达到16进制中max即15时,counter清零,而carrtbit置高电平有效。 如若set一直处于低电平,则counter计数器自加一进行计数,carrtbit清零。 modulehexcounter(clk,set,max,setdata,dataout,carryout); inputclk,set;input[3: 0]max,setdata;outputcarryout; output[3: 0]dataout;reg[3: 0]counter;regcarrybit; assigncarryout=carrybit;assigndataout=counter; always@(posedgeclkorposedgeset) beginif(set) begincounter<=setdata; carrybit<=0;end elsebeginif((counter==max)||(counter>max)) begincounter<=0;carrybit<=1;end elsebegincounter<=counter+1'b1;carrybit<=0;end endend endmodule 4.4.2仿真波形及分析 调试试验结果如图所示,set一直处于低电平状态下,当datout计数置3后再加一即清零,而carrybit置1,再来一个脉冲上升沿又回来置数,符合十六进制计数器。 4.5加法器模块 4.5.1加法器模块 本实验中adder采用8位全加器,out=in1+in2,带进位。 moduleadder(in1,in2,out); parameterin1width=8;parameterin2width=8; parameteroutwidth=8; input[in1width-1: 0]in1;input[in2width-1: 0]in2; output[outwidth-1: 0]out; assignout=in1+in2; Endmodule 4.5.2仿真波形及分析 由输出的十进制数相加符合结果 4.6bitsel将输出解码成时分秒选择模块 4.6.1解码选择程序模块 将输出解码成时分秒选择,并且分闹钟设置还是计时模式。 为了不产生冲突,Alarmmode为是否设置闹钟模式,checkmode为是否设置调整时间模式,且相互之间不能同时有效。 当reset有效时,对所有输出清零。 modulebitsel(alarmmode,checkmode,sel,selcode,reset); inputalarmmode,checkmode,sel,reset; outputreg[2: 0]selcode; reg[2: 0]check_code;reg[1: 0]alarm_code; always@(negedgeselorposedgereset) beginif(reset)check_code<=3'b000; elsebegin case(check_code) 3'b000: check_code<=3'b001; 3'b001: check_code<=3'b010; 3'b010: check_code<=3'b100; 3'b100: check_code<=3'b001; default: check_code<=3'b000; endcase end end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 课程设计 多功能 数字