process (clk)
begin
sel<=addr;
case sel is
when "0000"=>led<="11000000";
when "0001"=>led<="11111001";
when "0010"=>led<="10100100";
when "0011"=>led<="10110000";
when "0100"=>led<="10011001";
when "0101"=>led<="10010010";
when "0110"=>led<="10000010";
when "0111"=>led<="11111000";
when "1000"=>led<="10000000";
when "1001"=>led<="10010000";
when others=>led<="10111111";
end case;
end process;
end behave;
该模块的仿真波形如图18所示。
图18 译码显示波形仿真
4.4 整点报时模块
该模块能够完成整点时的报时功能。即将至整点时,前四秒低音,1Hz的标准脉冲作为输入信号,最后一秒高音,500Hz的高频脉冲作为输入信号[12]。模块逻辑图如图19。
图19 整点报时模块元件
整点报时核心子程序:
library ieee;
use ieee.std_logic_1164.all;
entity baoshi is
port (ml,mh,sh,sl :in std_logic_vector(3 downto 0);
clk05s,clk1k:in std_logic; speaker :out std_logic);
end baoshi;
architecture one of baoshi is
signal a,b,c,d : std_logic ;
begin
process (clk05s,clk1k)
variable cnt : integer range 0 to 200 :=0;
begin
if clk05s'event and clk05s = '1' then
if cnt=119 then
cnt:=0;
else
cnt:=cnt+1;
end if;
if mh="0101" and ml="1001" and (cnt=117 or cnt=115 or cnt=113 or cnt=111)then
c<='0';else c<='1';
end if;
if mh="0000" and ml="0000" and (cnt=119 or cnt=0 or cnt=1)then
d<='0';
else
d<='1';
end if;
end if;
end process;
a<=clk1k and not (d);
b<=clk05s and not (c);
speaker<=a or b;end;
该程序中的时钟信号clk05s的频率为2Hz,且其有效电平(高电平)占空2/3,整点报时模块仿真波形如图20所示。
图20 整点报时模块元仿真波形
5. 实验结论与研究展望
5.1 实验结论
系统总体的仿真波形如图21所示。将设计程序下载到硬件电路上运行调试后,最终结果与预期效果基本一致,时、分能够正常计数并能由控制键分别显示,整点报时功能正常。
在此次的数字钟设计过程中,更进一步地熟悉有关数字电路的知识和具体应用。学会了利用QuartusII软件进行原理图的绘制,硬件描述语言VHDL的编写,程序的仿真等工作。并能根据仿真结果分析设计的存在的问题和缺陷,从而进行程序的调试和完善。
在设计电路中,往往是先仿真后连接实物图,但有时候仿真和电路连接并不是完全一致的,例如在对具体模块的仿真的过程中,往往没有考虑到整体设计的层面以及与上下模块接口的设计。再加上器件对信号的延时等问题,实际下载硬件电路上后会出现一系列的问题,因此仿真图和电路连接图还是有一定区别的。
图21 系统总体仿真图
5.2 研究展望
本设计中虽然有控制键对时钟进行控制,但是用到的按键太多,在实际应用上存在不足。故提出改进方案为用一个按键来选择要调整的数码管,再用两个按键控制计数的加减。这样可以节省按键资源,以供更多的功能的使用。总的来说,通过这次的设计实验更进一步地增强了实验的动手能力,对数字钟的工作原理也有了更加透彻的理解。 VHDL基于FPGA的数字时钟设计+电路图(7):http://www.youerw.com/zidonghua/lunwen_1332.html