基于FPGA的电子秒表设计

2018-02-21 02:30刘博吴华李頔曹佳哲
科技视界 2018年33期

刘博 吴华 李頔 曹佳哲

【摘 要】利用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.