本设计报告详述了基于EDA技术的数字钟开发过程,涵盖系统需求分析、硬件描述语言编程、仿真验证及FPGA实现等环节,旨在优化数字时钟功能与性能。
题目分析
1.1 设计要求(数字钟的功能)
该设计需要实现一个具备秒、分、时显示功能的24小时循环计数器,并提供清零及调时调分的功能,同时具有整点报警并在报警过程中可以中断。
根据上述需求,我们可以将系统分解为以下模块:
- 时钟模块:通过试验箱内部提供的时钟信号对各个计数器进行驱动。
- 秒钟模块:实现秒的60进制循环计数,并向分钟提供进位信号;同时支持调分操作;
- 分钟模块:负责分的60进制循环计数,产生小时的进位信号,并具备调时功能;
- 小时模块:完成24小时内时间的循环更新。
- 报警模块:在整点时刻触发报警并持续10秒,在此期间可以中断报警。
以下为各部分的具体描述:
### 模块一(秒钟计数器)
```vhdl
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SECOND IS
PORT (CLK: IN STD_LOGIC; -- 系统时钟信号
RESET:IN STD_LOGIC; -- 系统复位信号
SETMIN:IN STD_LOGIC; -- 分设置信号
ENMIN: OUT STD_LOGIC; -- 分计数时钟信号
DAOUT: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); -- 秒计数值
END ENTITY SECOND;
ARCHITECTURE ART OF SECOND IS
SIGNAL COUNT :STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL ENMIN_1,ENMIN_2:STD_LOGIC;
BEGIN
DAOUT<=COUNT;
ENMIN_2<=(SETMIN AND CLK);
ENMIN<=(ENMIN_1 OR ENMIN_2);
PROCESS(CLK,RESET,SETMIN)
BEGIN
IF (RESET=0)THEN COUNT<=0000000;
ENMIN_1<=0;
ELSIF(CLKEVENT AND CLK=1)THEN
IF(COUNT(3 DOWNTO 0)=1001) THEN
IF(COUNT<16#60#) THEN
IF(COUNT=1011001) THEN ENMIN_1<=1; COUNT<=0000000;
ELSE COUNT<=COUNT+7;
ENMIN_1<=0;
END IF;
ELSE COUNT<=0000000;
END IF;
ELSIF(COUNT<16#60#) THEN
COUNT<=COUNT+1;
ENMIN_1<=0 AFTER 10 NS;
ELSE COUNT<=000000;
ENMIN_1<=0;
END IF;
END IF;
END PROCESS;
END ART;
```
### 模块二(分钟计数器)
```vhdl
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY MINUTE IS
PORT (CLK: IN STD_LOGIC; -- 分钟计数时钟信号
CLKS: IN STD_LOGIC; -- 时设置时钟信号
RESET: IN STD_LOGIC; -- 系统复位信号
SETHOUR:IN STD_LOGIC; -- 小时设置信号
ENHOUR: OUT STD_LOGIC; -- 小时计数时钟信号
DAOUT: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); -- 分钟计数值
END ENTITY MINUTE;
ARCHITECTURE ART OF MINUTE IS
SIGNAL COUNT :STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL ENHOUR_1,ENHOUR_2:STD_LOGIC;
BEGIN
DAOUT<=COUNT;
ENHOUR_2<=(SETHOUR AND CLKS);
ENHOUR<=(ENHOUR_1 OR ENHOUR_2);
PROCESS(CLK,RESET,SETHOUR)
BEGIN
IF (RESET=0)THEN COUNT<=0000000;
ENHOUR_1<=0;
ELSIF(CLKEVENT AND CLK=1)THEN
IF(COUNT(3 DOWNTO 0)=1001) THEN
IF(COUNT<16#60#) THEN
IF(COUNT=1011001) THEN ENHOUR_1<=1; COUNT<=000000;
ELSE COUNT<=COUNT+7;
ENHOUR_1<=0;
END IF;
ELSE COUNT<=00000;
END IF;
ELSIF