配色: 字号:
FPGA
2012-10-11 | 阅:  转:  |  分享 
  
基于FPGA的倒计时系统的设计

1、引言:

VHDL(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage,超高速集成电路硬件描述语言)诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(TheInstituteofElectricalandElectronicsEngineers)的一种工业标准硬件描述语言。相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下(ToptoDown)和基于库(LibraryBased)的设计的特点,因此设计者可以不必了解硬件结构。从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的FPGA器件中去,从而实现可编程的专用集成电路(ASIC)的设计。

倒计时系统是一个常用的电路系统,如香港回归倒计时,评估倒计时,篮球比赛中24秒进攻倒计时等等。倒计时系统的实现也有许多的方法,如用单片机控制,用FPGA编程等。.用VHDL语言设计可以使整个系统大大简化,提高整体的性能和可靠性。具有体积小、可靠性高、功耗低的特点。本文就是用VHDL语言设计一个用于篮球比赛的24秒倒计时器。

2、关键词:VHDL,波形仿真,倒计时系统.

3、倒计时系统的工作原理:

在NBA比赛中有一个24秒进攻规则,即从获取球权到投篮击中篮板、篮框、命中或投篮被侵犯,其有效时间合计不能超过24秒,否则被判违例,将失去球权.在此过程中,设置24秒、暂停倒计时或者中途终止24秒(即球权归对方)均由裁判控制。本文就是用VHDL语言设计一个用于篮球比赛的24秒倒计时器,并且设置了24秒预设键K1、倒计时启动键K2和倒计时暂停键K3,并将计时精度设置为0.1秒。各按键具体功能如下:K1键按下,LED灯显示24秒;K2键按下,倒计时;K3键按下,计时停止.并用数码管分别显示。

4、设计实现4.1系统方框图的划分和结构设计:该系统可划分为以下几个模块:脉冲发生器(10HZ)模块、计数和状态控制模块、数码管显示模块。下面简要介绍一下各个模块的功能:

?(1)脉冲发生器(COUNT_T):用于产生一个10HZ(0.1秒)的脉冲,来供计数模块计数使用.因为该倒计时系统的计时要精确到0.1秒,所以要有一个0.1秒脉冲发生器.

(2)计数与状态控制模块(SEC_1):本模块有三个按键K1、K2和K3。当K1按下时,进入状态S2,计数器被置值为24秒;当K2按下时,进入状态S1,计数器开始倒计时;当K3按下时,进入状态S0,则停止计数。

(3)数码管显示模块(LED_2):该模块用于把计数的值动态显示在数码管上。

??????系统的顶层电路如下所示:

????

??4.2各模块的VHDL程序如下:

(1)??????脉冲发生器模块的程序:该程序输出clk_s为一个10HZ(即0.1秒)的脉冲。scan_clk来选择led1、led2、led3、led4中的一个并赋给seg作为输出(见数码管显示模块(LED_2)的程序)。

??????libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitycount_tis

port(clk:instd_logic;

????clk_s:outstd_logic;

????scan_clk:outstd_logic_vector(1downto0));

endcount_t;

architecturebehavofcount_tis

signalcnt2:std_logic_vector(8downto0):="000000000";

signalcnt1:std_logic_vector(1downto0):="00";

signalclk1:std_logic:=''0'';

begin?

process(clk)

begin

ifclk=''1''andclk''eventthen

?ifcnt2="110010000"then

???cnt2<="000000000";

???clk1<=notclk1;

?else

???cnt2<=cnt2+1;

???cnt1<=cnt1+1;

?endif;

endif;

endprocess;

clk_s<=clk1;

scan_clk<=cnt1;

endbehav;??????????????????

(2)计数和状态控制模块的程序:clk_s是输入0.1秒的时钟。K1、K2和K3是三个按钮,由裁判员控制,当K1按下时,进入状态S2,计数器被置值为24秒;当K2按下时,进入状态S1,计数器开始倒计时;当K3按下时,进入状态S0,则停止计数;l3、l2、l1是输出,分别等于cnt5、cnt4、cnt3,即24秒的十位、个位和小数位。程序如下:

--sec_vhd

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entitysec_1is

port(clk_s:instd_logic;

???k1:instd_logic;

???k2:instd_logic;

???k3:instd_logic;

???l1:outstd_logic_vector(3downto0);

???l2:outstd_logic_vector(3downto0);

???l3:outstd_logic_vector(3downto0));

endsec_1;

?

architecturebehavofsec_1is

typestatesis(s0,s1,s2);

signalst:states:=s0;

signalcnt3:std_logic_vector(3downto0):="0000";

signalcnt4:std_logic_vector(3downto0):="0000";

signalcnt5:std_logic_vector(3downto0):="0000";

begin

process(clk_s)

begin

?ifclk_s=''1''andclk_s''eventthen

????ifk1=''0''andk2=''0''andk3=''1''then

??????st<=s0;

????endif;

?ifk1=''1''andk2=''0''andk3=''0''then

??????st<=s2;

endif;

?ifk1=''0''andk2=''1''andk3=''0''then

??????st<=s1;

endif;

?

casestis

whens0=>NULL;

whens1=>ifcnt5="0000"then

????????ifcnt4="0000"then

????????ifcnt3="0000"then

???????????st<=s0;

?????????else

???????????cnt4<="1001";

???????????cnt5<="1001";

???????????cnt3<=cnt3-1;

?????????endif;

???????else

?????????cnt5<="1001";

?????????cnt4<=cnt4-1;

???????endif;

??????else

????????cnt5<=cnt5-1;

???????endif;

whens2=>cnt5<="0000";

????????cnt3<="0010";

????????cnt4<="0100";

whenothers=>NULL;

endcase;

endif;

l3<=cnt5;

l2<=cnt4;

l1<=cnt3;

endprocess;

endbehav;

(3)数码管显示模块(LED_2):clk是扫描时钟。用scan_clk来选择led1、led2、led3、led4中的一个并赋给seg作为输出。a是用于数码管的位码选择,a=1表示选中该数码管,被点亮;a=0则不被点亮。mie用于屏蔽其它不使用的数码管。程序如下:?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

???????????????????????????????????????????????????????????????????????????????--led_2.vhd

?

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityled_2is

?

port(clk:instd_logic;

????scan_clk:instd_logic_vector(1downto0);

????l1:instd_logic_vector(3downto0);

????l2:instd_logic_vector(3downto0);

????l3:instd_logic_vector(3downto0);

????seg:outstd_logic_vector(7downto0);

????a:outstd_logic_vector(3downto0);

????mie:outstd_logic_vector(3downto0));

endentityled_2;

architecturebehavofled_2is

signalled1,led2,led3:std_logic_vector(7downto0);

begin

mie<="0000";

process(clk,l1,l2,l3)

begin

ifclk=''1''andclk''eventthen

??casel1is

???????when"0001"=>led1<="11111001";

???????when"0010"=>led1<="10100100";

???????when"0011"=>led1<="10110000";???????

???????when"0100"=>led1<="10011001";

???????when"0101"=>led1<="10010010";

???????when"0110"=>led1<="10000010";

???????when"0111"=>led1<="11111000";

???????when"1000"=>led1<="10000000";

???????when"1001"=>led1<="10010000";

???????whenothers=>led1<="11000000";?

endcase;

casel2is

???????when"0001"=>led2<="01111001";

???????when"0010"=>led2<="00100100";

???????when"0011"=>led2<="00110000";???????

???????when"0100"=>led2<="00011001";

???????when"0101"=>led2<="00010010";

???????when"0110"=>led2<="00000010";

???????when"0111"=>led2<="01111000";

???????when"1000"=>led2<="00000000";

???????when"1001"=>led2<="00010000";

???????whenothers=>led2<="01000000";

endcase;

casel3is

???????when"0001"=>led3<="11111001";

???????when"0010"=>led3<="10100100";

???????when"0011"=>led3<="10110000";???????

???????when"0100"=>led3<="10011001";

???????when"0101"=>led3<="10010010";

???????when"0110"=>led3<="10000010";

???????when"0111"=>led3<="11111000";

???????when"1000"=>led3<="10000000";

???????when"1001"=>led3<="10010000";

???????whenothers=>led3<="11000000";

endcase;

?casescan_clkis

??when"00"=>seg<=led1;

????????????a<="0100";

??when"10"=>seg<=led2;

????????????a<="0010";

??when"01"=>seg<=led3;

????????????a<="0001";

??when"11"=>seg<=led3;

????????????a<="0001";

whenothers=>seg<="11111111";

????????????a<="0000";

endcase;

endif;

endprocess;

endbehav;

4.3、系统的功能仿真:

Altera公司推出的MAX+plusⅡ是一个高度集成化的可编程逻辑器件开发系统,可以开发Altera公司的MAX系列和FLEX系列的可编程器件。该系统的主要特点如下:

(1)??支持多种设计输入方式.如:原理图、VHDL语言、AHDL语言、波形图等.同时还支持主流的第三方EDA工具,如:Synopsys、Modeltechnology等。

(2)??提供完善的功能仿真,同时还提供精确的时间仿真。

(3)??该系统把设计输入、功能仿真、时间仿真、设计编译以及器件编程集成于统一的开发环境,从而更方便、更快捷。

(4)??MAX+plusⅡ开发系统还具有编译快捷,设计实现优化的功能。

本程序利用MAX+plusⅡ进行排错编译,波形仿真,下载仿真.本文只对计数和状态控制模块进行了波形仿真,结果如下所示,从仿真波形上看计数的结果是准确的。

5、结束语:本文介绍了使用VHDL语言设计倒计时系统的方法,并用VHDL语言对各个模块进行了描述:脉冲发生器(10HZ)模块、计数和状态控制模块、数码管显示模块。最后把程序下载到FPGA中进行仿真.可把VHDL语言程序下载到FPGA中组成实际的电路,这样可以简化硬件的开发和制造过程,而且使硬件体积大大缩小,并提高了系统的可靠性。同时在基本电路模块基础上,不必修改硬件电路,通过修改VHDL源程序,增加一些新功能,满足不同用户的需要,实现数字系统硬件的软件化。

6、参考文献:

??(1)<>----北京理工大学ASIC研究所;

(2)<>----谭会生主编。

7、心得体会:

通过本次课程设计,对VHDL语言的使用更加熟悉,而且对Altera公司的MAX+plusⅡ软件从编译、排错到波形仿真、下载到FPGA器件上仿真都有了一定的掌握。也加强了发现问题,解决问题的能力。也学会了和他人的有效合作、高效率的解决问题。



献花(0)
+1
(本文系依米荷阳首藏)