数字逻辑课程设计–数字钟的设计(quartus ii)
说明一下这是之前做的数字逻辑课程设计,代码的话我是测试过的应该没有bug,用到的软件是quartus ii。
一、数字钟设计实验报告
1.设计内容
(1) 正常计时:先设置当前时间,然后以秒(60)、分(60)、小时(24)计数,要求使用60进制计数器及24进制计数器,以BCD码形式输出小时、分、秒信号
(2)数码管实时显示计时的小时、分、秒。
2.系统总体设计
系统结构框图
给出结构框图(系统包含的各子模块及连接框图)
给出各子模块的信号名字及功能
时计数器 :Clk_to_hour: 驱动时计时器的时钟信号
Reset : 恢复原位
SCALE_SEL: 小时的高位显示,低位显示
DATOUT: 输出分针时器的秒钟信号
分计时器:clk_to_minute:驱动分计时器的时钟信号
reset:恢复原位
set_hour:使能输入
CO : 进位输出端
DATOUT :输出分针时器的秒钟信号
秒计时器: clk_to_second:驱动秒计时器的时钟信号
reset:恢复原位
set_min:使能输入
CO : 进位输出端
DATOUT :输出秒针时器的秒钟信号
3.计时器模块设计
1、计时器逻辑框图及输入输出描述(包括每个信号名字)
(1)小时—二十四进制的逻辑框图
Clk_to_hour: 驱动时计时器的时钟信号
Reset : 恢复原位
SCALE_SEL: 小时的高位显示,低位显示
DATOUT: 输出分针时器的秒钟信号
(2)分–六十进制的逻辑框图
clk_to_minute:驱动分计时器的时钟信号
reset:恢复原位
set_hour:使能输入
CO : 进位输出端
DATOUT :输出分针时器的秒钟信号
(3)秒—六十进制的逻辑框图
clk_to_second:驱动秒计时器的时钟信号
reset:恢复原位
set_min:使能输入
CO : 进位输出端
DATOUT :输出秒针时器的秒钟信号
2、子模块功能描述
功能的文字描述:功能的文字描述: 主要是对时,分,秒的计数以及对上一位的进位,例如秒计时器中当reset=0时,读取当前时间,reset=1且clk上升沿时,计数器加1。当秒为59秒,上升沿到来时59归零,datout=1。当count溢出则该位进行清零,并向前进一位。该模块主要是体现计数器计数的功能。
3、VHDL源代码
*-----------------------------------------------------
– 小时24进制或12进制的BCD计数模块
-----------------------------------------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY HOUR_BCD_COUNT IS
PORT(clk_to_hour, reset, SCALE_SEL : IN STD_LOGIC;
DATOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END HOUR_BCD_COUNT;
ARCHITECTURE BHV OF HOUR_BCD_COUNT IS
SIGNAL COUNT_SHI, COUNT_GE : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clk_to_hour, reset) BEGIN
IF reset = '0' THEN COUNT_SHI <= "0000"; COUNT_GE <= "0000"; -- 有复位信号,则清除计数。
ELSIF clk_to_hour'EVENT AND clk_to_hour = '1' THEN
IF SCALE_SEL = '1' THEN -- 24进制
IF COUNT_SHI = "0010" AND COUNT_GE = "0011" THEN COUNT_SHI <= "0000"; COUNT_GE <= "0000"; -- 24进制溢出清零
ELSIF COUNT_GE < "1001" THEN COUNT_GE <= COUNT_GE + 1;
ELSE COUNT_GE <= "0000"; COUNT_SHI <= COUNT_SHI + 1;
END IF;
ELSE -- 12进制
IF COUNT_SHI = "0001" AND COUNT_GE = "0001" THEN COUNT_SHI <= "0000"; COUNT_GE <= "0000"; -- 12进制溢出清零
ELSIF COUNT_GE < "1001" THEN COUNT_GE <= COUNT_GE + 1;
ELSE COUNT_GE <= "0000"; COUNT_SHI <= COUNT_SHI + 1;
END IF;
END IF;
END IF;
DATOUT <= COUNT_SHI &a