时间:2022-10-20 03:34:25
摘要:介绍了利用VHDL硬件描述语言结合ISE软件和ModelSIM仿真软件进行计时的结果。通过该例可以为其他电路的设计提供一定的借鉴作用。
关键词:VHDL 数字钟 FPGA
中图分类号:TN6 文献标识码:A 文章编号:1007-3973(2010) 08-058-02
近十年来随着超大规模集成电路和软件技术的快速发展,使数字系统集成到一片集成电路内成为可能,Xilinx等公司都推出了非常好的CPLD和FPGA产品,并为这些产品的设计配备了设计、下载软件,这些软件除了支持图形方式设计数字系统外,还支持设计许多种数字系统的设计语言,使数字系统设计起来更加容易,可以说数字电子技术的设计进入了一个新时代。在这样一个大背景下,熟练掌握相关功能模块的开发就成为设计者必备的一部分知识。
1电子时钟的总体设计
电子时钟是电子设计中用来显示时间的一种装置。本设计采用自顶向下( Top-to-Down)的设计方法,将数字电子时钟分四个子模块和一个顶层模块。子模块包括一个10进制计数器,一个10进制计数器,一个24进制计数器和一个LED七段数码显示模块。然后将各个子模块再细分为更小的功能块,直到最后能用VHDL语言进行描述为止。当各个模块都描述完成并仿真确认无误后,再采用元件例化,将各个元件一层一层的例化连接起来,直到最后完成系统设计。
秒钟和分钟的高位只能计数到6,低位可以计数到10,如60秒,60分钟,而小时最大计数到24。时、分、秒的计时结果采用六个数码管动态显示。
数字电子钟逻辑框图如图所示。
图1数字电子钟逻辑框图
2选择石英晶体振荡器的理由
由于通常要求数字钟的脉冲源的频率要十分稳定、准确度高,因此要采用石英晶体振荡器,其他的多谐振荡器难以满足要求。石英晶体不但频率特性稳定,而且品质因数很高,有极好的选频特性。一般情况下,晶振频率越高,准确度越高,但所用的分频级数越多,耗电量就越大,成本就越高,在选择晶体时应综合考虑。
3计时器的设计
计数器的设计,以触发器为单元电路,根据进制按有权码或无权码来编码,采用有条件反馈原理来构成。例如:秒钟和分钟采用60进制计数器 。60进制计数器个位采用10进制计数器,十位采用6进制计数器,个位的计数脉冲计到9清零,并向十位计数器进位。时钟采用24进制计数器,时钟的计数脉冲计到23清零。
这样设计不仅适合人们的计数习惯,而且有利于显示相同的数字。
以下是10进制计数器counter10子模块的VHDL语言的程序代码。Counter6子模块的程序代码与此类似,我们在这里就不再列举了。由于文章篇幅的关系,24进制计数器的程序代码也不在这里列举了。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter10 is
port(clk:in std_logic;
reset:in std_logic;
din:in std_logic_vector(3 downto 0);
dout: out std_logic_vector(3 downto 0);
c:out std_logic);
end counter10;
architecture Behavioral of counter10 is
signal count:std_logic_vector(3 downto 0);
begin
dout
process(clk,reset,din)
begin
count
c
elsif rising_edge(clk) then
if count="1001" then
count
c
else
count
c
end if;
end if;
end process;
end Behavioral;
counter10子模块在ModelSim下的仿真波形如图2所示:
图2counter10仿真波形
4LED七段数码显示模块的设计
LED七段数码显示模块通过译码,将秒、分、时的高低位数字分别译成LED七段数码管上对应的高低电平,然后输出七段值。
7段数码显示器由7个显示码管组成,4个输入信号d0,d1,d2,d3来表示000-1111,即表示十六进制中的0-F;同时它有7个输出信号,分别用a,b,c,d,e,f,g来表示,决定可发光二极管的状态。图3表示的是七段数码管的7个输出信号a,b,c,d,e,f,g与可发光二极管的对应关系。
图3 七段数码管输入输出示意图
若该数码管为共阳数码管,当某位为0时,表示这位所在的数码管发光;如为1,则表示不发光;共阴数码管则正好相反。
从7段数码显示器的原理可以知道,7段数码显示器用4个输入信号对应16个输出信号,并且一个输入信号只能对应一个唯一的输出。从这点出发,很容易想到前面所学的译码器电路,事实上,7段数码显示器的显示就是调用了一个4-16线译码器。下面列出共阳数码管的真值表。
共阳极7段数码管真值表
以下是LED七段数码管显示模块的程序代码。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity decoder is
port(din:in std_logic_vector(3 downto 0);
dout:out std_logic_vector(6 downto 0));
end decoder;
architecture Behavioral of decoder is
begin
process(din)
begin
case din is
when"0000"=>dout
when"0001"=>dout
when"0010"=>dout
when"0011"=>dout
when"0100"=>dout
when"0101"=>dout
when"0110"=>dout
when"0111"=>dout
when"1000"=>dout
when"1001"=>dout
when others=>dout
end case;
end process;
end Behavioral;
5结束语
将顶层文件进行编译,仿真,管脚锁定,再编译,然后将编译生成的可下载文件下载到实验箱的FPGA芯片中。最终可以看到时、分、秒正常显示。
参考文献:
[1]谈世哲.基于Xilinx ISE的FPGA/CPLD设计与应用[M].北京:电子工业出版社,2009.
[2]沈涛. Xilinx FPGA/CPLD初级教程[M]. 西安:西安电子科技大学出版社, 2009.