资源描述
SelectionParagraphFormatLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPointselectionParagraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaphFormatLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesTSelectionParbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbagraphFoLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPointse11111111111111111111111111111111lectionParagraphFormatLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPoctionParagraphFormatLineSpaci2222222222222222222222ngLinesToPoints2SelectionParagraphFormatLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPointselectionParagraphFccccccccccccccccccccccccccccccccccccccccccccccccccccccccormatLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPoctionParagraSelec
可编程数字系统设计
课程设计实验报告
实验名称: 基于VHDL的数字钟设计 _
所属课程: 可编程数字系统设计
《可编程数字系统》课程设计
一、课程设计目的:
熟悉EDA工具;掌握用VHDL语言进行数字系统设计的基本方法和过程。
二、设计任务:
设计一数字钟,用数码管显示
基本功能要求:
(1) 可以分屏显示时、分、秒,可用数码管的小数点“.”代替时、分、秒的分
隔符“:”,分屏显示是指由于数码管只有4个,不能同时显示时、分、秒,但可以只显示时、分,或只显示分、秒,通过按键来切换这两种显示方式。
(2)可设置时钟的开始时间。设置时,相应的数码管要闪烁,指示当前设置的设置(内容)。
(3)具有闹铃功能,可以设定闹铃时间。闹铃时间到,LED闪烁进行指示。
三、设计原理:
数字钟的逻辑框图如图1所示。它由校时部分、闹钟部分、计时部分、显示部分组成。振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒钟计数器满60后向分计数器进位,分钟计数器满60后向小时计数器进位,时钟计数器按照“24归0”规律计数。计数器的输出分别经译码器送显示。当计时出现误差时或者到达另外一个时区时,可以用校时部分校时、校分、校秒。需要是用闹钟时,可以利用闹钟部分进行定时。
四、系统分析:
根据数字钟的功能,我们可以将它的系统电路设计划分为四个部分:校时部分、闹钟部分、计时部分和显示部分。其中计时部分又划分为秒钟计时模块、分钟计时模块、时钟计时模块,显示部分又划分为BCD译码模块和扫屏输出模块。
校时模块
秒钟计时模块
分钟计时模块
时钟计时模块
译码模块
扫屏输出
闹钟模块
LED灯
图1
数字钟的顶层实体描述如下:
--TOP.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY digitalclock IS
PORT(
--输入时钟
CLK:IN STD_LOGIC;
--设定闹钟
ALARM_SET:IN STD_LOGIC;
--双键位校时
SET:IN STD_LOGIC;
MODE:IN STD_LOGIC;
--选择显示方式
CHG:IN STD_LOGIC;
--八段译码输出
out_data:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
--输出片选
seg_out:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
--LED输出
ED_OUT:OUT STD_LOGIC
);
END digitalclock;
ARCHITECTURE EXAMPLE OF digitalclock IS
--元件例化
COMPONENT adjuster
PORT(
--输入时钟
CLK:IN STD_LOGIC;
--双键位校时
SET:IN STD_LOGIC;
MODE:IN STD_LOGIC;
--计数使能,接VCC
EN:IN STD_LOGIC;
--秒计数器进位输入
S_ENOUT:IN STD_LOGIC;
--分计数器进位输入
M_ENOUT:IN STD_LOGIC;
--输出1HZ时钟
CLK1HZ:OUT STD_LOGIC;
--输出使能
S_CE:OUT STD_LOGIC;
M_CE:OUT STD_LOGIC;
H_CE:OUT STD_LOGIC
);
END COMPONENT;
COMPONENT CNT60
PORT(
--输入1HZ时钟
CLK1HZ:IN STD_LOGIC;
--计数使能
EN:IN STD_LOGIC;
--进位输出
ENOUT:OUT STD_LOGIC;
--BCD输出
LOW:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
HIGH:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END COMPONENT;
COMPONENT CNT24
ORT(
--输入1HZ时钟
CLK1HZ:IN STD_LOGIC;
--计数使能
EN:IN STD_LOGIC;
--BCD输出
LOW:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
HIGH:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END COMPONENT;
COMPONENT display
PORT(
--BCD输入
in_data:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
--八段译码输出
out_data:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END COMPONENT;
COMPONENT saoping
PORT(
--选择显示方式
CHG:IN STD_LOGIC;
--BCD输入
SL:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SH:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
ML:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
MH:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
HL:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
HH:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
ALARM_L:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
ALARM_H:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
--输入时钟
CLK:IN STD_LOGIC;
--输出片选
seg:out std_logic_vector(3 downto 0);
--BCD输出
out_data:out std_logic_vector(7 downto 0)
);
END COMPONENT;
COMPONENT alarm
PORT(
--输入时钟
CLK:IN STD_LOGIC;
--设定闹钟
ALARM_SET:IN STD_LOGIC;
--BCD输入
IN_HL:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
IN_HH:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
IN_ML:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
IN_MH:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
--BCD输出
LOW:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
HIGH:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
--LED输出
LED_OUT:OUT STD_LOGIC
);
END COMPONENT;
--常数说明
CONSTANT VCC:STD_LOGIC:='1';
--信号说明
SIGNAL VCC_CON:STD_LOGIC;
SIGNAL S_ENOUT:STD_LOGIC;
SIGNAL M_ENOUT:STD_LOGIC;
SIGNAL CLK1HZ:STD_LOGIC;
--计数使能
SIGNAL S_CE:STD_LOGIC;
SIGNAL M_CE:STD_LOGIC;
SIGNAL H_CE:STD_LOGIC;
--BCD码
SIGNAL SL:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL SH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL ML:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL MH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL HL:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL HH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL ALARM_LOW:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL ALARM_HIGH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL SL_OUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL SH_OUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL ML_OUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL MH_OUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL HL_OUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL HH_OUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL ALARM_L_OUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL ALARM_H_OUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
--元件声明
ADJUST_CONTROL:adjuster
PORT MAP(
--输入时钟
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
PORT MAP(
--输入1HZ时钟
CLK1HZ=>CLK1HZ,
--计数使能,接VCC
EN=>S_CE,
--进位输出
ENOUT=>S_ENOUT,
--BCD输出
LOW=>SL,
HIGH=>SH
);
M_CONTROL:CNT60
PORT MAP(
--输入1HZ时钟
CLK1HZ=>CLK1HZ,
--计数使能
EN=>M_CE,
--进位输出
ENOUT=>M_ENOUT,
--BCD输出
LOW=>ML,
HIGH=>MH
);
H_CONTROL:CNT24
PORT MAP(
--输入1HZ时钟
CLK1HZ=>CLK1HZ,
--计数使能
EN=>H_CE,
--BCD输出
LOW=>HL,
HIGH=>HH
);
ALARM_CLOCK:alarm
PORT MAP(
--输入时钟
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
PORT MAP(
--BCD输入
in_data=>SL,
--八段译码输出
out_data=>SL_OUT
);
SH_DIS:display
PORT MAP(
--BCD输入
in_data=>SH,
--八段译码输出
out_data=>SH_OUT
);
ML_DIS:display
PORT MAP(
--BCD输入
in_data=>ML,
--八段译码输出
out_data=>ML_OUT
);
MH_DIS:display
PORT MAP(
--BCD输入
in_data=>MH,
--八段译码输出
out_data=>MH_OUT
);
HL_DIS:display
PORT MAP(
--BCD输入
in_data=>HL,
--八段译码输出
out_data=>HL_OUT
);
HH_DIS:display
PORT MAP(
--BCD输入
in_data=>HH,
--八段译码输出
out_data=>HH_OUT
);
ALARM_L_DIS:display
PORT MAP(
--BCD输入
in_data=>ALARM_LOW,
--八段译码输出
out_data=>ALARM_L_OUT
);
ALARM_H_DIS:display
PORT MAP(
--BCD输入
in_data=>ALARM_HIGH,
--八段译码输出
out_data=>ALARM_H_OUT
);
SAOPINGQI:saoping
PORT MAP(
--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
);
END EXAMPLE;
仿真结果如下:
该顶层文件原理图如下:
系统实验实验结果如下:
五、程序设计:
1、校时模块:采用的是双键校时法,MODE和SET,其中MODE选择需要调整的部分:时钟、分钟、秒钟,而SET则作为调整脉冲。
校时模块的核心思想是利用一个计数器CON来作为状态机,CON=0时为正常工作状态,CON=1时为调整秒钟状态,CON=2时为调整分钟状态,CON=3时为调整时钟状态。调整的时候,利用SET代替CLK1HZ作为计数器输入脉冲,相当于按一次SET则被调整的计数器中的当前值+1,由此获得一个数字钟的时间设定效果。
校时模块同时还具有控制时钟、分钟、秒钟计数器工作的功能,通过两个进位输入端以及三个使能控制端让时钟、分钟、秒钟计数器能够有序工作。比如,当秒钟计数器产生一个进位输入校时模块后,校时模块才通过使能输出端令分钟计数器工作一下,以此类推控制分钟、时钟之间的有序工作。
元件视图如下:
源程序如下:
--adjuster.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY adjuster IS
PORT(
--输入时钟
CLK:IN STD_LOGIC;
--双键位校时
SET:IN STD_LOGIC;
MODE:IN STD_LOGIC;
--计数使能,接VCC
EN:IN STD_LOGIC;
--秒计数器进位输入
S_ENOUT:IN STD_LOGIC;
--分计数器进位输入
M_ENOUT:IN STD_LOGIC;
--输出1HZ时钟
CLK1HZ:OUT STD_LOGIC;
--输出使能
S_CE:OUT STD_LOGIC;
M_CE:OUT STD_LOGIC;
H_CE:OUT STD_LOGIC
);
END adjuster;
ARCHITECTURE EXAMPLE OF adjuster IS
SIGNAL SEL :STD_LOGIC;
SIGNAL SCE_R:STD_LOGIC;
SIGNAL MCE_R:STD_LOGIC;
SIGNAL HCE_R:STD_LOGIC;
SIGNAL CON:INTEGER RANGE 0 TO 3 :=0;
SIGNAL CLKCON1:INTEGER RANGE 0 to 5000;
SIGNAL CLKCON2:INTEGER RANGE 0 to 10000;
SIGNAL OUTCLK:STD_LOGIC;
SIGNAL OUTCLK_TEMP:STD_LOGIC;
BEGIN
--变频为1HZ
CLK1_PROC:PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='0' THEN
IF CLKCON1=5000 THEN
CLKCON1<=0;
OUTCLK_TEMP<='0';
ELSE
CLKCON1<=CLKCON1+1;
OUTCLK_TEMP<='1';
ELSE IF;
END IF;
END PROCESS;
CLK2_PROC:PROCESS(OUTCLK_TEMP)
BEGIN
IF OUTCLK_TEMP'EVENT AND OUTCLK_TEMP='0' THEN
IF CLKCON2=10000 THEN
CLKCON2<=0;
OUTCLK<='0';
ELSE
CLKCON2<=CLKCON2+1;
OUTCLK<='1';
END IF;
END IF;
END PROCESS;
-模为4的计数器
CNT:PROCESS(MODE,SET)
BEGIN
IF MODE'EVENT AND MODE='0' THEN
IF CON=3 THEN
CON<=0;
ELSE
CON<=CON+1;
END IF;
END IF;
END PROCESS;
--四个调整状态
CON_PRO:PROCESS(CON)
BEGIN
CASE CON IS
WHEN 0=>
SEL<='1';
SCE_R<='0';
MCE_R<='0';
HCE_R<='0';
WHEN 1=>
SEL<='0';
SCE_R<='1';
MCE_R<='0';
HCE_R<='0';
WHEN 2=>
SEL<='0';
SCE_R<='0';
MCE_R<='1';
HCE_R<='0';
WHEN 3=>
SEL<='0';
SCE_R<='0';
MCE_R<='0';
HCE_R<='1';
END CASE;
END PROCESS;
SEL_PRO:PROCESS(SEL)
BEGIN
CASE SEL IS
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;
END CASE;
END PROCESS;
END EXAMPLE;
2、计时模块:
(1) 60进制计时模块:利用计数器的方法设制一个60进制计数器,并设置个进位输出端和个位、十位的BCD即时输出端,其中BCD即时输出端连接BCD译码模块进行转换数码管程序所需的驱动译码。
元件视图如下:
源程序如下:
--CNT60.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY CNT60 IS
PORT(
--输入1HZ时钟
CLK1HZ:IN STD_LOGIC;
--计数使能
EN:IN STD_LOGIC;
--进位输出
ENOUT:OUT STD_LOGIC;
--BCD输出
LOW:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
HIGH:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END CNT60;
ARCHITECTURE EXAMPLE OF CNT60 IS
SIGNAL LOW_R:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL HIGH_R:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
BEGIN
--个位计数
LOW_PROC:PROCESS(CLK1HZ,EN)
BEGIN
IF CLK1HZ'EVENT AND CLK1HZ='0' THEN
IF EN='1' THEN
IF LOW_R="1001" THEN
LOW_R<="0000";
ELSE
LOW_R<=LOW_R+"0001";
END IF;
END IF;
END IF;
END PROCESS;
LOW<=LOW_R;
--十位计数
HIGH_PROC:PROCESS(CLK1HZ,EN)
BEGIN
IF CLK1HZ'EVENT AND CLK1HZ='0' THEN
IF EN='1' THEN
IF LOW_R="1001" THEN
IF HIGH_R="0101" THEN
HIGH_R<="0000";
ELSE
HIGH_R<=HIGH_R+"0001";
END IF;
END IF;
END IF;
END IF;
END PROCESS;
HIGH<=HIGH_R;
--计数值为59时,进位输出
ENOUT<='1' WHEN LOW_R="1001" AND HIGH_R="0101" ELSE '0';
END EXAMPLE;
(2)24进制计数模块:利用计数器的方法设制一个24进制计数器,并设置、个位、十位的BCD即时输出端,其中BCD即时输出端连接BCD译码模块进行转换数码管程序所需的驱动译码。
元件视图如下:
源程序如下:
--CNT24.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY CNT24 IS
PORT(
--输入1HZ时钟
CLK1HZ:IN STD_LOGIC;
--计数使能
EN:IN STD_LOGIC;
--BCD输出
LOW:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
HIGH:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END CNT24;
ARCHITECTURE EXAMPLE OF CNT24 IS
SIGNAL LOW_R:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL HIGH_R:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL CLR:STD_LOGIC:='0';
BEGIN
--个位计数
LOW_PROC:PROCESS(CLK1HZ,EN,CLR)
BEGIN
IF CLK1HZ'EVENT AND CLK1HZ='0' THEN
IF EN='1' THEN
IF LOW_R="1001" OR CLR='1' THEN
LOW_R<="0000";
ELSE
LOW_R<=LOW_R+"0001";
END IF;
END IF;
END IF;
END PROCESS;
LOW<=LOW_R;
--十位计数
HIGH_PROC:PROCESS(CLK1HZ,EN,CLR)
BEGIN
IF CLK1HZ'EVENT AND CLK1HZ='0' THEN
IF EN='1' THEN
IF CLR='1' THEN
HIGH_R<="0000";
ELSIF LOW_R="1001" THEN
HIGH_R<=HIGH_R+"0001";
END IF;
END IF;
END IF;
END PROCESS;
HIGH<=HIGH_R;
--计数值为23时,清零
CLR<='1' WHEN LOW_R="0011" AND HIGH_R="0010" ELSE '0';
END EXAMPLE;
3、闹钟模块:该数字钟具有可设置整点闹钟功能,当达到闹钟设定时间时,LED灯会自动闪烁表示警告闹钟时间已到,闪烁时间为一分钟,一分钟之后自动停止。
闹钟的核心思想是,从时钟计时模块以及分钟计时模块的BCD码即时出去与闹钟模块中的计数器所设的值(也就是设定的时间)进行比较。由于该闹钟为整点闹钟,只能进行整点警告,利用ALARM_SET按钮进行设定,每按一次,送给闹钟元件里面的计数器一个脉冲令设定的时间在原有的时间上加一小时。当比较结果完全相同时,LED输出端输出10HZ的脉冲到LED中令LED显示闪烁状态,达到警告目的。
元件视图如下:
源程序如下:
--alarm.vh
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY alarm IS
PORT(
--输入时钟
CLK:IN STD_LOGIC;
--设定闹钟
ALARM_SET:IN STD_LOGIC;
--BCD输入
IN_HL:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
IN_HH:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
IN_ML:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
IN_MH:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
--BCD输出
LOW:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
HIGH:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
--LED输出
LED_OUT:OUT STD_LOGIC
);
END alarm;
ARCHITECTURE EXAMPLE OF alarm IS
SIGNAL clkcon1:integer range 0 to 5000;
SIGNAL clkcon2:integer range 0 to 1000;
SIGNAL clk50khz:std_logic;
SIGNAL clk10hz:std_logic;
SIGNAL LOW_R:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL HIGH_R:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL LED_CON:integer range 0 to 1;
SIGNAL CLR:STD_LOGIC:='0';
BEGIN
--变频为10HZ
clkcon1_proc:process(CLK)
BEGIN
IF CLK'EVENT AND CLK='0' THEN
IF clkcon1=5000 THEN
clkcon1<=0;
clk50khz<='0';
ELSE
clkcon1<=clkcon1+1;
clk50khz<='1';
END IF;
END IF;
END PROCESS;
clkcon2_proc:process(clk50khz)
BEGIN
IF clk50khz'EVENT AND clk50khz='0' THEN
IF clkcon2=1000 THEN
clkcon2<=0;
clk10hz<='1';
ELSE
clkcon2<=clkcon2+1;
clk10hz<='0';
END IF;
END IF;
END PROCESS;
--设定闹钟个位
LOW_PROC:PROCESS(ALARM_SET,CLR)
BEGIN
IF ALARM_SET'EVENT AND ALARM_SET='0' THEN
IF LOW_R="1001" OR CLR='1' THEN
LOW_R<="0000";
ELSE
LOW_R<=LOW_R+"0001";
END IF;
END IF;
END PROCESS;
LOW<=LOW_R;
--设定闹钟十位
HIGH_PROC:PROCESS(ALARM_SET,CLR)
BEGIN
IF ALARM_SET'EVENT AND ALARM_SET='0' THEN
IF CLR='1' THEN
HIGH_R<="0000";
ELSIF LOW_R="1001" THEN
HIGH_R<=HIGH_R+"0001";
END IF;
END IF;
END PROCESS;
HIGH<=HIGH_R;
--计数值为23时,清零
CLR<='1' WHEN LOW_R="0011" AND HIGH_R="0010" ELSE '0';
--响应判定
alarm_proc:PROCESS(IN_HL,IN_HH,IN_ML,IN_MH)
BEGIN
IF LOW_R=IN_HL and HIGH_R=IN_HH THEN
IF IN_ML="0000" AND IN_MH="0000" THEN
LED_CON<=0;
ELSE
LED_CON<=1;
END IF;
END IF;
END PROCESS;
--LED输出
LED_proc:PROCESS(LED_CON)
BEGIN
CASE LED_CON IS
WHEN 0=>LED_OUT<=clk10hz;
WHEN 1=>LED_OUT<='0';
END CASE;
END PROCESS;
END EXAMPLE;
4、显示模块
(1)BCD译码模块:利用共阳端数码管的性质以及其在显示“0-9”过程中的驱动程序可以获得该BCD译码模块。
元件视图如下:
源程序为:
--display.vhd
LIBRARY IEEE;
USE IEEE.STD_
展开阅读全文