基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx

上传人:b****8 文档编号:22414408 上传时间:2023-02-04 格式:DOCX 页数:21 大小:121.12KB
下载 相关 举报
基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx_第1页
第1页 / 共21页
基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx_第2页
第2页 / 共21页
基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx_第3页
第3页 / 共21页
基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx_第4页
第4页 / 共21页
基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx

《基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。

基于FPGA的数字电子时钟设计与实现Word文档下载推荐.docx

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

的计

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

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1