基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx
《基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
EDA设计可分为系统级、电路级和物理实现级。
用VHDL语言开发的流程:
(1文本编辑:
用任何文本编辑器都可以进行,也可以用专用的HDL编辑环境。
通常VHDL文件保存为.vhd文件。
(2功能仿真:
将文件调入HDL仿真软件进行功能仿真,检查逻辑功能是否正确(也叫前仿真,对简单的设计可以跳过这一步,只在布线完成以后,进行时序仿真。
(3逻辑综合:
将源文件调入逻辑综合软件进行综合,即把语言综合成最简的布尔表达式和信号的连接关系。
逻辑综合软件会生成.edf(edif的EDA工业标准文件。
(4布局布线:
将.edf文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到PLD/FPGA内。
(5编程下载:
确认仿真无误后,将文件下载到芯片中。
本设计为一个多功能的数字钟,具有时、分、秒计数显示功能,以24小时的循环计数:
具有校对功能。
本设计采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计文件,在Quartus工具软件下,采用自顶向下的设计方式,由各个基本模块共同构建了一个基本FPGA的数字钟。
系统主芯片采用EP2C70F896C6,有时钟模块、控制模块、计时模块、数据译码模块、显示以及报时模块组成。
经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,本系统能够完成时、分、秒的分别显示,由按键输入进行数字钟的校时、清零、启停功能。
随着电子技术的发展,数字电路朝着速度快、容量大、体积小、重量轻的方向发展。
人们对时间计量的精度要求越来越高,钟表的数字化给人们生产生活带来了极大的方便。
数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
本次设计以数字电子为主,实现对时、分、秒数字显示的计时装置,周期为24小时,显示满刻度为23时59分59秒,并具有校时功能和报时功能的数字电子钟。
课程设计所采用的开发平台:
QuartusII是可编程片上系统的综合性设计环境,它支持CPLD和FPGA器件的开发。
FPGA(FieldProgrammableGateArray现场可编程门阵列,内部主要由许多可编程逻辑模块组成,靠纵横交错的分布式可编程互连线连接起来,可构成极其复杂的逻辑电路。
本次课程设计所采用的FPGA芯片CycloneII系列的EP2C70F896C6。
2.2工作原理及系统框图
利用数字电子技术、EDA设计方法、FPGA等技术,设计、仿真并实现一个基于FPGA的数字电子时钟基本功能,其基本组成框图如图1所示,振荡器采用ALTERA的DE2-70实验板的50MHz输出,分频器将50MHz的方波进行分频进而得到1Hz的标准秒脉冲,时、分、秒计时模块分别由二十四进制时计数器、六十进制分计数器和六十进制秒计数器完成,校时模块完成时和分的校正。
电子时钟扩展功能为倒计时流水灯。
数字电子钟的电路组成框图片如下图:
图15系统框图
1.数字钟电路系统由主体电路和扩展电路两大部分所组成。
2.数字电子时钟电路具有时、分、秒计时,秒计数器计满60后向分计数器进位,分计数器计满60后向小时计数器进位,小时计数器按照“24进制”规律计数。
3.准确计时,以数字形式显示时、分、秒的时间,计数器的输出经译码器送显示器。
4.具有分、时校正功能,校正输入脉冲频率为1Hz
5.复位功能,时、分、秒计时清零。
6.扩展功能为:
具有仿广播电台整点报时的功能,即每逢59分51秒、52秒、53秒、54秒、55秒及57秒,LED绿灯依此点亮,59分59秒时,LED红灯亮,形成倒计时流水灯报时。
三.软件方案
3.1程序流程图
3.1.124进制
小时采用24进制计时,当CP↑,EN和nCR为高电平时计数,计数范围为[0,23],使能信号EN等于0时,计时器保持。
当高位大于2或高位等于2且低位大于3时,计时器清零,否则继续计时。
流程图见下图。
图1624进制程序流程图
3.1.210进制流程图
当CP↑,EN和nCR为高电平时计数,计数范围为[0,9],使能信号EN等于0时,计时器保持。
当计时到9的时候,计时器清零,否则继续计时。
流程图见下图。
图1710进制流程图
3.1.36进制
当CP↑,EN和nCR为高电平时计数,计数范围为[0,5],使能信号EN等于0时,计时器保持。
当计时到5的时候,计时器清零,否则继续计时。
图186进制流程图
3.1.460进制
分、秒采用60进制计时,当CP↑,EN和nCR为高电平时计数,计数范围为[0,59],使能信号EN等于0时,计时器保持。
当个位等于9时向十位进位;
当个位等于9十位等于5,计时器清零,否则继续计时。
图1960进制流程图
3.1.5from0to9
数码管有7段组成,分共阳极和共阴极,本次设计采用共阳极数码管。
当输入为低电平时,数码管显示;
当输入为高电平时,数码管不显示。
用这样的方法输入不同的高低信号控制数码管的显示。
图20from0to9流程图
3.1.6分频模块
图21分频模块流程图
3.1.7总流程图
图22总流程图
3.2程序清单
3.2.1头文件complete_clock程序
modulecomplete_clock(HEX0,HEX1,HEX2,HEX3,HEX4,HEX5,_50MHzIn,_1Hz,_50Hz,_5KHz,_500KHz,AdjMinkey,AdjHrkey,nCR,Alarm,LED0,LED10,LED3,LED4,LED5,LED6,LED7,LED8,LED9;
output[7:
0]HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;
outputAlarm,_1Hz,_50Hz,_5KHz,_500KHz;
outputLED0;
outputLED10;
outputLED3;
outputLED4;
outputLED5;
outputLED6;
outputLED7;
outputLED8;
outputLED9;
wire[7:
inputnCR,_50MHzIn;
wire_1Hz,_50Hz,_5KHz,_500KHz;
wireLED0;
wireLED10;
wireLED3;
wireLED4;
wireLED5;
wireLED6;
wireLED7;
wireLED8;
wireLED9;
inputAdjMinkey,AdjHrkey;
0]Second,Minute,Hour;
Divided_FrequencyC1(_5KHz,_500KHz,nCR,_50MHzIn;
//调用分频模块,输入50MHz的频率,经两次分频后变为5KHzDivided_FrequencyU0(_1Hz,_50Hz,nCR,_5KHz;
//调用分频模块,输入5KHz的频率,经两次分频后变为1Hz
top_clockU1(Hour,Minute,Second,_1Hz,nCR,AdjMinkey,AdjHrkey;
//调用校时模块,对时、分模块进行校时baoshiU2(Alarm_Ring,Minute,Second,_50Hz,_5KHz;
assignAlarm=Alarm_Ring;
assignLED0=({Minute,Second}==16'
h5951;
//定义LED0为59分51秒时灯亮
assignLED10=({Minute,Second}==16'
h5952;
//定义LED10为59分52秒时灯亮
assignLED3=({Minute,Second}==16'
h5953;
//定义LED3为59分53秒时灯亮
assignLED4=({Minute,Second}==16'
h5954;
//定义LED4为59分54秒时灯亮
assignLED5=({Minute,Second}==16'
h5955;
//定义LED5为59分55秒时灯亮
assignLED6=({Minute,Second}==16'
h5956;
//定义LED6为59分56秒时灯亮
assignLED7=({Minute,Second}==16'
h5957;
//定义LED7为59分57秒时灯亮
assignLED8=({Minute,Second}==16'
h5958;
//定义LED8为59分58秒时灯亮
assignLED9=({Minute,Second}==16'
h5959;
//定义LED9为59分59秒时灯亮from0to9U10(HEX0,Second[3:
0];
//个位秒调用译码
from0to9U9(HEX1,Second[7:
4];
//十位秒调用译码
from0to9U3(HEX2,Minute[3:
//个位分调用译码
from0to9U4(HEX3,Minute[7:
from0to9U5(HEX4,Hour[3:
//个位时调用译码
from0to9U6(HEX5,Hour[7:
//十位时调用译码
endmodule
3.2.2counter24程序
modulecounter24(CntH,CntL,nCR,EN,CP;
inputCP,nCR,EN;
output[3:
0]CntH,CntL;
reg[3:
always@(posedgeCPornegedgenCR
begin
if(~nCR{CntH,CntL}<
=8'
h00;
//当nCR=0时,计时器清零
elseif(~EN{CntH,CntL}<
={CntH,CntL};
//当EN=0时,停止计时,保持
elseif((CntH>
2||(CntH>
9||((CntH==2&
&
(CntL>
=3
{CntH,CntL}<
elseif((CntH==2&
(CntL<
3
beginCntH<
=CntH;
CntL<
=CntL+1'
b1;
end
elseif(CntL==9
=CntH+1'
=4'
b0000;
else
Endmodule
3.2.3counter60程序
modulecounter60(Q1,Q2,Q3,Q4,Q5,Q6,Cnt,Cnt1,Cnt24,nCR,EN,CP,LED,LED1,LED2;
inputCP,nCR,EN;
0]Cnt;
0]Cnt1;
0]Cnt24;
output[6:
0]Q1;
0]Q2;
0]Q3;
0]Q4;
0]Q5;
0]Q6;
outputLED;
outputLED1;
outputLED2;
wire[6:
wireLED;
wireLED1;
wireLED2;
wireENP;
wireENP1;
wireENP2;
wireENP3;
counter10UC0(Cnt[3:
0],nCR,EN,CP;
counter6UC1(Cnt[7:
4],nCR,ENP,CP;
counter10UC2(Cnt1[3:
0],nCR,ENP1,CP;
counter6UC3(Cnt1[7:
4],nCR,ENP2,CP;
counter24UC4(Cnt24[7:
4],Cnt24[3:
0],nCR,ENP3,CP;
assignENP=(Cnt[3:
0]==4'
h9;
assignENP1=(Cnt==8'
h59;
assignENP2=((Cnt1[3:
h9&
(Cnt==8'
assignENP3=((Cnt1==8'
h59&
assignLED=~CP;
assignLED1=~CP;
assignLED2=~CP;
from0to9UC5(Q1,Cnt[3:
from0to9UC6(Q2,Cnt[7:
from0to9UC7(Q3,Cnt1[3:
from0to9UC8(Q4,Cnt1[7:
from0to9UC9(Q5,Cnt24[3:
from0to9UC10(Q6,Cnt24[7:
3.2.4from0to9程序
modulefrom0to9(HEX,D;
0]HEX;
input[3:
0]D;
reg[6:
always@(D
case(D
4'
d0:
{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'
b0000001;
4'
d1:
b1001111;
d2:
b0010010;
d3:
b0000110;
d4:
b1001100;
d5:
b0100100;
d6:
b0100000;
d7:
b0001111;
d8:
b0000000;
d9:
b0000100;
default:
b1111111;
endcase
3.2.5counter6程序
modulecounter6(Q,nCR,EN,CP;
0]Q;
if(~nCRQ<
elseif(~ENQ<
=Q;
elseif(Q==4'
b0101Q<
elseQ<
=Q+1'
//计时器正常计时
3.2.6counter10程序
modulecounter10(Q,nCR,EN,CP;
b1001Q<
3.2.7分频程序
moduleDivided_Frequency(_1HzOut,nCR,_5kHzIN;
input_5kHzIN,nCR;
output_1HzOut;
supply1Vdd;
//定义Vdd是高电平
wire[15:
//计时器的输出信号(中间变量
wireEN1,EN2,EN3;
//计时器的使能信号(中间变量
counter10DU0(Q[3:
0],nCR,Vdd,_5kHzIN;
//调用十进制
counter10DU1(Q[7:
4],nCR,EN1,_5kHzIN;
counter10DU2(Q[11:
8],nCR,EN2,_5kHzIN;
counter10DU3(Q[15:
12],nCR,EN3,_5kHzIN;
assignEN1=(Q[3:
assignEN2=(Q[7:
4]==4'
(Q[3:
assignEN3=(Q[11:
8]==4'
(Q[7:
assign_1HzOut=Q[15];
//assign_500HzOut=Q[0];
3.2.8校时模块程序
moduletop_clock(Second,Minute,Hour,_1Hz,nCR,AdjMinKey,AdjHrkey;
input_1Hz,nCR,AdjMinKey,AdjHrkey;
0]Hour,Minute,Second;
wireMinCP,HrCP;
counter60UT1(Second,nCR,Vdd,_1Hz;
//调用counter60,对秒计时
counter60UT2(Minute,nCR,Vdd,~MinCP;
//调用counter60,对分校时
counter24UT3(Hour[7:
4],Hour[3:
0],nCR,Vdd,~HrCP;
//调用counter24,对时校时
assignMinCP=AdjMinKey?
_1Hz:
(Second==8'
//当MinCP=AdjMinKey时,执行校时,
当MinCP≠AdjMinKey时,秒计时至59时向分进位
assignHrCP=AdjHrkey?
_1Hz:
({Minute,Second}==16'
//当HrCP=AdjHrkey时,执
行校时,当HrCP≠AdjHrkey时,分
秒计时至59分59秒时向时进位Endmodule
四.调试及结果
4.1模块仿真
4.1.1counter10模块仿真
CP为时钟脉冲;
当CP↑,EN和nCR为高电平时Q计数;
Q
的计