基于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器件上仿真都有了一定的掌握。也加强了发现问题,解决问题的能力。也学会了和他人的有效合作、高效率的解决问题。
|
|