基于vhdl的fpga数字钟设计.docx
- 文档编号:13398556
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:37
- 大小:351.30KB
基于vhdl的fpga数字钟设计.docx
《基于vhdl的fpga数字钟设计.docx》由会员分享,可在线阅读,更多相关《基于vhdl的fpga数字钟设计.docx(37页珍藏版)》请在冰点文库上搜索。
基于vhdl的fpga数字钟设计
可编程数字系统设计
课程设计实验报告
实验名称:
基于VHDL的数字钟设计_
所属课程:
可编程数字系统设计
《可编程数字系统》课程设计
一、课程设计目的:
熟悉EDA工具;掌握用VHDL语言进行数字系统设计的基本方法和过程。
二、设计任务:
设计一数字钟,用数码管显示
基本功能要求:
(1)可以分屏显示时、分、秒,可用数码管的小数点“.”代替时、分、秒的分
隔符“:
”,分屏显示是指由于数码管只有4个,不能同时显示时、分、秒,但可以只显示时、分,或只显示分、秒,通过按键来切换这两种显示方式。
(2)可设置时钟的开始时间。
设置时,相应的数码管要闪烁,指示当前设置的设置(内容)。
(3)具有闹铃功能,可以设定闹铃时间。
闹铃时间到,LED闪烁进行指示。
三、设计原理:
数字钟的逻辑框图如图1所示。
它由校时部分、闹钟部分、计时部分、显示部分组成。
振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。
秒钟计数器满60后向分计数器进位,分钟计数器满60后向小时计数器进位,时钟计数器按照“24归0”规律计数。
计数器的输出分别经译码器送显示。
当计时出现误差时或者到达另外一个时区时,可以用校时部分校时、校分、校秒。
需要是用闹钟时,可以利用闹钟部分进行定时。
四、系统分析:
根据数字钟的功能,我们可以将它的系统电路设计划分为四个部分:
校时部分、闹钟部分、计时部分和显示部分。
其中计时部分又划分为秒钟计时模块、分钟计时模块、时钟计时模块,显示部分又划分为BCD译码模块和扫屏输出模块。
数字钟的顶层实体描述如下:
--TOP.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYdigitalclockIS
PORT(
--输入时钟
CLK:
INSTD_LOGIC;
--设定闹钟
ALARM_SET:
INSTD_LOGIC;
--双键位校时
SET:
INSTD_LOGIC;
MODE:
INSTD_LOGIC;
--选择显示方式
CHG:
INSTD_LOGIC;
--八段译码输出
out_data:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
--输出片选
seg_out:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
--LED输出
ED_OUT:
OUTSTD_LOGIC
);
ENDdigitalclock;
ARCHITECTUREEXAMPLEOFdigitalclockIS
--元件例化
COMPONENTadjuster
PORT(
--输入时钟
CLK:
INSTD_LOGIC;
--双键位校时
SET:
INSTD_LOGIC;
MODE:
INSTD_LOGIC;
--计数使能,接VCC
EN:
INSTD_LOGIC;
--秒计数器进位输入
S_ENOUT:
INSTD_LOGIC;
--分计数器进位输入
M_ENOUT:
INSTD_LOGIC;
--输出1HZ时钟
CLK1HZ:
OUTSTD_LOGIC;
--输出使能
S_CE:
OUTSTD_LOGIC;
M_CE:
OUTSTD_LOGIC;
H_CE:
OUTSTD_LOGIC
);
ENDCOMPONENT;
COMPONENTCNT60
PORT(
--输入1HZ时钟
CLK1HZ:
INSTD_LOGIC;
--计数使能
EN:
INSTD_LOGIC;
--进位输出
ENOUT:
OUTSTD_LOGIC;
--BCD输出
LOW:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
COMPONENTCNT24
ORT(
--输入1HZ时钟
CLK1HZ:
INSTD_LOGIC;
--计数使能
EN:
INSTD_LOGIC;
--BCD输出
LOW:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCOMPONENT;
COMPONENTdisplay
PORT(
--BCD输入
in_data:
INSTD_LOGIC_VECTOR(3DOWNTO0);
--八段译码输出
out_data:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENT;
COMPONENTsaoping
PORT(
--选择显示方式
CHG:
INSTD_LOGIC;
--BCD输入
SL:
INSTD_LOGIC_VECTOR(7DOWNTO0);
SH:
INSTD_LOGIC_VECTOR(7DOWNTO0);
ML:
INSTD_LOGIC_VECTOR(7DOWNTO0);
MH:
INSTD_LOGIC_VECTOR(7DOWNTO0);
HL:
INSTD_LOGIC_VECTOR(7DOWNTO0);
HH:
INSTD_LOGIC_VECTOR(7DOWNTO0);
ALARM_L:
INSTD_LOGIC_VECTOR(7DOWNTO0);
ALARM_H:
INSTD_LOGIC_VECTOR(7DOWNTO0);
--输入时钟
CLK:
INSTD_LOGIC;
--输出片选
seg:
outstd_logic_vector(3downto0);
--BCD输出
out_data:
outstd_logic_vector(7downto0)
);
ENDCOMPONENT;
COMPONENTalarm
PORT(
--输入时钟
CLK:
INSTD_LOGIC;
--设定闹钟
ALARM_SET:
INSTD_LOGIC;
--BCD输入
IN_HL:
INSTD_LOGIC_VECTOR(3DOWNTO0);
IN_HH:
INSTD_LOGIC_VECTOR(3DOWNTO0);
IN_ML:
INSTD_LOGIC_VECTOR(3DOWNTO0);
IN_MH:
INSTD_LOGIC_VECTOR(3DOWNTO0);
--BCD输出
LOW:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
--LED输出
LED_OUT:
OUTSTD_LOGIC
);
ENDCOMPONENT;
--常数说明
CONSTANTVCC:
STD_LOGIC:
='1';
--信号说明
SIGNALVCC_CON:
STD_LOGIC;
SIGNALS_ENOUT:
STD_LOGIC;
SIGNALM_ENOUT:
STD_LOGIC;
SIGNALCLK1HZ:
STD_LOGIC;
--计数使能
SIGNALS_CE:
STD_LOGIC;
SIGNALM_CE:
STD_LOGIC;
SIGNALH_CE:
STD_LOGIC;
--BCD码
SIGNALSL:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALSH:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALML:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALMH:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALHL:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALHH:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALALARM_LOW:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALALARM_HIGH:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALSL_OUT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALSH_OUT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALML_OUT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALMH_OUT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALHL_OUT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALHH_OUT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALALARM_L_OUT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALALARM_H_OUT:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
--元件声明
ADJUST_CONTROL:
adjuster
PORTMAP(
--输入时钟
CLK=>CLK,
--双键位校时
SET=>SET,
MODE=>MODE,
--计数使能,接VCC
EN=>VCC_CON,
--秒计数器进位输入
S_ENOUT=>S_ENOUT,
--分计数器进位输入
M_ENOUT=>M_ENOUT,
--输出信号
CLK1HZ=>CLK1HZ,
--输出使能
S_CE=>S_CE,
M_CE=>M_CE,
H_CE=>H_CE
);
VCC_CON<=VCC;
S_CONTROL:
CNT60
PORTMAP(
--输入1HZ时钟
CLK1HZ=>CLK1HZ,
--计数使能,接VCC
EN=>S_CE,
--进位输出
ENOUT=>S_ENOUT,
--BCD输出
LOW=>SL,
HIGH=>SH
);
M_CONTROL:
CNT60
PORTMAP(
--输入1HZ时钟
CLK1HZ=>CLK1HZ,
--计数使能
EN=>M_CE,
--进位输出
ENOUT=>M_ENOUT,
--BCD输出
LOW=>ML,
HIGH=>MH
);
H_CONTROL:
CNT24
PORTMAP(
--输入1HZ时钟
CLK1HZ=>CLK1HZ,
--计数使能
EN=>H_CE,
--BCD输出
LOW=>HL,
HIGH=>HH
);
ALARM_CLOCK:
alarm
PORTMAP(
--输入时钟
CLK=>CLK,
--设定闹钟
ALARM_SET=>ALARM_SET,
--BCD输入
IN_HL=>HL,
IN_HH=>HH,
IN_ML=>ML,
IN_MH=>MH,
--BCD输出
LOW=>ALARM_LOW,
HIGH=>ALARM_HIGH,
--LED输出
LED_OUT=>LED_OUT
);
SL_DIS:
display
PORTMAP(
--BCD输入
in_data=>SL,
--八段译码输出
out_data=>SL_OUT
);
SH_DIS:
display
PORTMAP(
--BCD输入
in_data=>SH,
--八段译码输出
out_data=>SH_OUT
);
ML_DIS:
display
PORTMAP(
--BCD输入
in_data=>ML,
--八段译码输出
out_data=>ML_OUT
);
MH_DIS:
display
PORTMAP(
--BCD输入
in_data=>MH,
--八段译码输出
out_data=>MH_OUT
);
HL_DIS:
display
PORTMAP(
--BCD输入
in_data=>HL,
--八段译码输出
out_data=>HL_OUT
);
HH_DIS:
display
PORTMAP(
--BCD输入
in_data=>HH,
--八段译码输出
out_data=>HH_OUT
);
ALARM_L_DIS:
display
PORTMAP(
--BCD输入
in_data=>ALARM_LOW,
--八段译码输出
out_data=>ALARM_L_OUT
);
ALARM_H_DIS:
display
PORTMAP(
--BCD输入
in_data=>ALARM_HIGH,
--八段译码输出
out_data=>ALARM_H_OUT
);
SAOPINGQI:
saoping
PORTMAP(
--BCD输入
SL=>SL_OUT,
SH=>SH_OUT,
ML=>ML_OUT,
MH=>MH_OUT,
HL=>HL_OUT,
HH=>HH_OUT,
ALARM_L=>ALARM_L_OUT,
ALARM_H=>ALARM_H_OUT,
--选择显示方式
CHG=>CHG,
--输入时钟
CLK=>CLK,
--输出片选
seg=>seg_out,
--BCD输出
out_data=>out_data
);
ENDEXAMPLE;
仿真结果如下:
该顶层文件原理图如下:
系统实验实验结果如下:
五、程序设计:
1、校时模块:
采用的是双键校时法,MODE和SET,其中MODE选择需要调整的部分:
时钟、分钟、秒钟,而SET则作为调整脉冲。
校时模块的核心思想是利用一个计数器CON来作为状态机,CON=0时为正常工作状态,CON=1时为调整秒钟状态,CON=2时为调整分钟状态,CON=3时为调整时钟状态。
调整的时候,利用SET代替CLK1HZ作为计数器输入脉冲,相当于按一次SET则被调整的计数器中的当前值+1,由此获得一个数字钟的时间设定效果。
校时模块同时还具有控制时钟、分钟、秒钟计数器工作的功能,通过两个进位输入端以及三个使能控制端让时钟、分钟、秒钟计数器能够有序工作。
比如,当秒钟计数器产生一个进位输入校时模块后,校时模块才通过使能输出端令分钟计数器工作一下,以此类推控制分钟、时钟之间的有序工作。
元件视图如下:
源程序如下:
--adjuster.vhd
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYadjusterIS
PORT(
--输入时钟
CLK:
INSTD_LOGIC;
--双键位校时
SET:
INSTD_LOGIC;
MODE:
INSTD_LOGIC;
--计数使能,接VCC
EN:
INSTD_LOGIC;
--秒计数器进位输入
S_ENOUT:
INSTD_LOGIC;
--分计数器进位输入
M_ENOUT:
INSTD_LOGIC;
--输出1HZ时钟
CLK1HZ:
OUTSTD_LOGIC;
--输出使能
S_CE:
OUTSTD_LOGIC;
M_CE:
OUTSTD_LOGIC;
H_CE:
OUTSTD_LOGIC
);
ENDadjuster;
ARCHITECTUREEXAMPLEOFadjusterIS
SIGNALSEL:
STD_LOGIC;
SIGNALSCE_R:
STD_LOGIC;
SIGNALMCE_R:
STD_LOGIC;
SIGNALHCE_R:
STD_LOGIC;
SIGNALCON:
INTEGERRANGE0TO3:
=0;
SIGNALCLKCON1:
INTEGERRANGE0to5000;
SIGNALCLKCON2:
INTEGERRANGE0to10000;
SIGNALOUTCLK:
STD_LOGIC;
SIGNALOUTCLK_TEMP:
STD_LOGIC;
BEGIN
--变频为1HZ
CLK1_PROC:
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='0'THEN
IFCLKCON1=5000THEN
CLKCON1<=0;
OUTCLK_TEMP<='0';
ELSE
CLKCON1<=CLKCON1+1;
OUTCLK_TEMP<='1';
ELSEIF;
ENDIF;
ENDPROCESS;
CLK2_PROC:
PROCESS(OUTCLK_TEMP)
BEGIN
IFOUTCLK_TEMP'EVENTANDOUTCLK_TEMP='0'THEN
IFCLKCON2=10000THEN
CLKCON2<=0;
OUTCLK<='0';
ELSE
CLKCON2<=CLKCON2+1;
OUTCLK<='1';
ENDIF;
ENDIF;
ENDPROCESS;
-模为4的计数器
CNT:
PROCESS(MODE,SET)
BEGIN
IFMODE'EVENTANDMODE='0'THEN
IFCON=3THEN
CON<=0;
ELSE
CON<=CON+1;
ENDIF;
ENDIF;
ENDPROCESS;
--四个调整状态
CON_PRO:
PROCESS(CON)
BEGIN
CASECONIS
WHEN0=>
SEL<='1';
SCE_R<='0';
MCE_R<='0';
HCE_R<='0';
WHEN1=>
SEL<='0';
SCE_R<='1';
MCE_R<='0';
HCE_R<='0';
WHEN2=>
SEL<='0';
SCE_R<='0';
MCE_R<='1';
HCE_R<='0';
WHEN3=>
SEL<='0';
SCE_R<='0';
MCE_R<='0';
HCE_R<='1';
ENDCASE;
ENDPROCESS;
SEL_PRO:
PROCESS(SEL)
BEGIN
CASESELIS
WHEN'0'=>
S_CE<=SCE_R;
M_CE<=MCE_R;
H_CE<=HCE_R;
CLK1HZ<=SET;
WHEN'1'=>
S_CE<=EN;
M_CE<=S_ENOUT;
H_CE<=M_ENOUT;
CLK1HZ<=OUTCLK;
ENDCASE;
ENDPROCESS;
ENDEXAMPLE;
2、计时模块:
(1)60进制计时模块:
利用计数器的方法设制一个60进制计数器,并设置个进位输出端和个位、十位的BCD即时输出端,其中BCD即时输出端连接BCD译码模块进行转换数码管程序所需的驱动译码。
元件视图如下:
源程序如下:
--CNT60.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYCNT60IS
PORT(
--输入1HZ时钟
CLK1HZ:
INSTD_LOGIC;
--计数使能
EN:
INSTD_LOGIC;
--进位输出
ENOUT:
OUTSTD_LOGIC;
--BCD输出
LOW:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDCNT60;
ARCHITECTUREEXAMPLEOFCNT60IS
SIGNALLOW_R:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
SIGNALHIGH_R:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
BEGIN
--个位计数
LOW_PROC:
PROCESS(CLK1HZ,EN)
BEGIN
IFCLK1HZ'EVENTANDCLK1HZ='0'THEN
IFEN='1'THEN
IFLOW_R="1001"THEN
LOW_R<="0000";
ELSE
LOW_R<=LOW_R+"0001";
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
LOW<=LOW_R;
--十位计数
HIGH_PROC:
PROCESS(CLK1HZ,EN)
BEGIN
IFCLK1HZ'EVENTANDCLK1HZ='0'THEN
IFEN='1'THEN
IFLOW_R="1001"THEN
IFHIGH_R="0101"THEN
HIGH_R<="0000";
ELSE
HIGH_R<=HIGH_R+"0001";
ENDIF;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
HIGH<=HIGH_R;
--计数值为59时,进位输出
ENOUT<='1'WHENLOW_R="100
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 vhdl fpga 数字 设计