基于FPGA的电子秒表设计
2018-02-21刘博吴华李頔曹佳哲
刘博 吴华 李頔 曹佳哲
【摘 要】利用Xilinx ISE集成开发环境和FPGA开发板实现电子秒表的功能。该电子秒表的显示范围为0.00秒-59.99秒,精度位0.01秒,通过按键控制其启动、暂停和清零。应用VHDL语言设计数字系统,可大大缩短设计时间、降低开发成本,而且易于修改。
【关键词】FPGA;ISE;电子秒表;VHDL
中图分类号: TH714 文献标识码: A 文章编号: 2095-2457(2018)33-0048-002
DOI:10.19694/j.cnki.issn2095-2457.2018.33.020
0 引言
傳统的电子秒表设计开发周期长、精度不高,而且不能根据用户需求现场修改功能。本文利用美国Xilinx公司的ISE集成开发软件[1]和FPGA(现场可编程门阵列)开发板,采用自顶向下的设计方法[2],根据设计指标和需求,从整个系统的逻辑功能触发,将整个系统分为若干个子系统,每个子系统又可分为几个功能模块,利用逻辑框图描述各功能模块和相互间的联系,即绘制系统的结构框图,最后用VHDL语言[2]实现。在ISE软件中输入源程序和管脚约束文件,经过综合、实现、生成二进制文件,最后下载到FPGA开发板上验证。采用自顶向下的设计方法可将复杂问题分解成若干小模块,符合常规的逻辑思维习惯,而且便于分工合作,从而提高设计效率。基于FPGA的电子秒表具有更多的功能、更好的性能和灵活性。
1 整体设计
该电子秒表要实现以下功能:设置启动键和复位键(即清零),以便秒表能随意启动、暂停和清零。显示0.00秒到59.99秒,共有4个输出显示位,分别是0.01秒位、0.1秒位、秒位和10秒位,需要4个计数器与之对应。4个计数器的输出全部为BCD码(二-十进制码)输出,便于同译码器连接,最终通过7段数码管显示。
根据以上分析,电子秒表主要由十进制计数器、六进制计数器、分频器、控制模块和显示译码器组成。其中三个十进制计数器分别对0.01秒、0.1秒和秒位进行计数,六进制计数器用来对用来对10秒位进行计数,分频器用来产生100Hz的计数脉冲和1KHz的扫描时钟(因为4个LED数码管采用动态扫描显示方式,所以需要扫描时钟),显示译码器将BCD码转换成7段数码管显示,控制模块用来控制让4个数码管中的哪一位输出。
2 各功能模块实现和顶层文件编写
2.1 底层模块实现
2.1.1 十进制计数器
计数时钟为100Hz。
entity count6 is
Port ( clk,clr,start : in STD_LOGIC;
cout : out STD_LOGIC;
daout:out STD_LOGIC_VECTOR(3 downto 0));
end count6;
architecture Behavioral of count6 is
signal temp:std_logic_vector(3 downto 0);
begin
process(clk,clr)
begin
if clr='1' then
temp<="0000";
cout<='0';
elsif (clk'event and clk='1') then
if start='1' then
if temp>="0101" then
temp<="0000";
cout<='1';
else
temp<=temp+1;
cout<='0';
end if;
end if;
end if;
daout<=temp;
end process;
end Behavioral;
2.1.2 六进制计数器
实体声明部分与十进制计数器程序相同,不同的只有结构体中以下两行:
if temp>="1001" then
temp<="0000";
2.1.3 分频器
将FPGA开发板上的50MHz的时钟分出一个100Hz的计数时钟和一个1KHz的扫描时钟。
entity div is
Port ( clr,clk : in STD_LOGIC;
q1 : buffer STD_LOGIC;
q2 : buffer STD_LOGIC);
end div;
architecture Behavioral of div is
signal counter:integer range 0 to 249999;
signal counter2:integer range 0 to 24999;
begin
process(clr,clk)
begin
if (clk='1' and clk'event) then
if clr='1' then
counter<=0;
elsif counter=249999 then
counter<=0;
q1 <= not q1;
else
counter<=counter+1;
end if;
end if;
end process;
process(clr,clk)
begin
if (clk='1' and clk'event) then
if clr='1' then
counter2<=0;
elsif counter2=24999 then
counter2<=0;
q2 <= not q2;
else
counter2<=counter2+1;
end if;
end if;
end process;
end Behavioral;
2.1.4 顯示译码器
将输入的BCD码转换成7段数码管对应的值输出,FPGA开发板是共阳极接法。
entity deled is
Port ( num : in STD_LOGIC_VECTOR (3 downto 0);
led : out STD_LOGIC_VECTOR (6 downto 0));
end deled;
architecture Behavioral of deled is
begin
process(num)
begin
case num is
when"0000"=>led<="0000001";-----------3FH0
when"0001"=>led<="1001111";-----------06H 1
when"0010"=>led<="0010010";-----------5BH 2
when"0100"=>led<="1001100";-----------66H 4
when"0101"=>led<="0100100";-----------6DH 5
when"0110"=>led<="0100000";-----------7DH 6
when"0111"=>led<="0001101";-----------27H 7
when"1000"=>led<="0000000";-----------7FH 8
when"1001"=>led<="0000100";-----------6FH 9
when others=>led<="1111111";-----------00H
end case;
end process;
end Behavioral;
2.1.5 控制模块
控制先让哪一位输出,再让哪一位输出。
entity seltime is
Port ( clr : in STD_LOGIC;
clk : in STD_LOGIC;
dain0 : in STD_LOGIC_VECTOR (3 downto 0);
dain1 : in STD_LOGIC_VECTOR (3 downto 0);
dain2 : in STD_LOGIC_VECTOR (3 downto 0);
dain3 : in STD_LOGIC_VECTOR (3 downto 0);
daout : out STD_LOGIC_VECTOR (3 downto 0);
an : out STD_LOGIC_VECTOR (3 downto 0);
dp:out std_logic);
end seltime;
architecture Behavioral of seltime is
signal temp:integer range 0 to 3;
begin
process(clk)
begin
if (clr='1') then
daout<="0000";
temp<=0;
elsif (clk='1'and clk'event) then
if temp=3 then temp<=0;
else temp<=temp + 1;
end if;
case temp is
when 0=>daout<=dain0; an<="1110";dp<='1';
when 1=>daout<=dain1; an<="1101";dp<='1';
when 2=>daout<=dain2; an<="1011";dp<='0';
when 3=>daout<=dain3; an<="0111";dp<='1';
when others=>daout<=dain3; an<="1111";dp<='1';
end case;
end if;
end process;
end Behavioral;
2.2 顶层文件编写
顶层文件应根据系统功能结构图编写,它的主要作用是将底层的7个模块进行连接,并明确这些模块与外围部件(按键、7段数码管)如何进行连接。利用元件例化语句,可实现自顶向下的层次化设计。编好后,要经过ISE软件编译检查语法错误。最后将生成的二进制文件下载到FPGA开发板上验证。
3 总结
利用美国Xilinx公司的ISE集成开发软件,通过VHDL语言编程实现电子秒表设计的功能,并下载到FPGA开发板上验证。因为FPGA器件便于根据用户需求修改功能、灵活、可移植性好,所以基于FPGA设计数字电路系统可大大提高设计效率、缩短开发时间、降低开发成本。
【参考文献】
[1]邹彦,等.EDA技术与数字系统设计[M].电子工业出版社,2007.
[2]何宾,EDA原理及应用[M].清华大学出版社,2009.