《基于FPGA的交通灯控制器设计.doc》由会员分享,可在线阅读,更多相关《基于FPGA的交通灯控制器设计.doc(22页珍藏版)》请在三一办公上搜索。
1、 FPGA实训报告实训设计题目 基于FPGA的交通灯控制器设计 作 者 xxxxxxx 分 院 xxxxxxxxxxxxxxxxxxx 专 业 班 级 xxxxxxxxx 指导教师(职称) xxxxxxxxxxxxxx 报告完成时间 2012年10月8日 基于FPGA的交通灯控制器设计 摘要:超高速硬件描述语言VHDL,是对数字系统进行抽象的行为与功能描述到具体的内部线路结构描述,利用EDA工具可以在电子设计的各个阶段、各个层系进行计算机模拟验证,保证设计过程的正确性,可大大降低设计成本,缩短设计周期。本文介绍的数字秒表设计,利用基于VHDL的EDA设计工具,采用大规模可编程逻辑器件FPGA,
2、通过设计芯片来实现系统功能。交通灯控制系统可以实现路口红绿灯的自动控制。基于FPGA设计的交通灯控制系统具有电路简单、可靠性强、实时快速擦写、运算速度高、故障率低、可靠性高,而且体积小的特点。本设计采用Altera公司Cyclone系列的EPlC3T1444C8芯片,在Quartus II软件平台上使用VHDL语言,采用自顶向下的设计方法对系统进行了模块化设计和综合,并进行了仿真。该系统可实现十字路口红绿灯及左转弯控制和倒计时显示,仿真结果结果表明系统能够自动控制交通灯转变。关键词:EDA;交通灯;VHDL目录引言11 FPGA概述21.1 FPGA的简介21.2 FPGA的应用22 VHDL
3、硬件描述语言32.1 VHDL程序基本结构32.1.1 实体32.1.2 结构体32.1.3 库42.2 VHDL语言42.2.1 VHDL文字规则42.2.2 VHDL数据对象42.2.3 VHDL数据类型42.2.4 VHDL顺序语句52.2.5 VHDL并行语句53系统设计与仿真63.1 系统介绍63.1.1 设计任务63.1.2 设计要求63.2 系统设计仿真63.2.1 系统框图设计73.2.2 系统时序状态图设计73.2.3 系统工程设计流程图83.2.4 芯片选择83.3 功能模块设计与仿真83.3.1 分频器模块设计83.3.2 控制模块设计93.3.3 倒计时模块设计103.
4、3.4 信号处理模块设计113.3.5 数据译码模块设计123.3.6 显示模块设计143.4 顶层文件设计17结论19参考文献:19基于FPGA的交通灯控制器设计xxxxx专业xxxx班xxxx 指导教师xxxx引言当今社会是数字化的社会,是数字集成电路广泛应用的社会。数字集成电路本身在不断进行更新换代,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。系统设计师更愿意自己设计专业集成电路(ASIC)芯片,而且希望设计周期尽可能短,最好在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场可编程器件(FPLD)。现场可编程门阵列(FPGA
5、)即属其中应用最广泛的一种。随着电子技术的发展,特别是大规模集成电路和计算机技术的研制和发展,让电子产品设计有了更好的应用市场,实现方法也有了更多的选择,而电子电路的设计却变得越来越复杂,使用“语言”进行电子设计已成为一种趋势。现代电子系统设计方法是设计师自己设计芯片来实现电子系统的功能,将传统的固件选用及电路板设计工作放在芯片设计中进行。在这些专业化软件中,EDA(Electronic Design Automation)具有一定的代表性,EDA技术是一种基于芯片的现代电子系统设计方法。基于EDA技术的现场可编程门阵列(FPGA)电 (ASIC) ,在数字系统设计和控制电路中越来越受到重视。
6、VHDL语言是电子设计的主流硬件描述语言,它更适合进行行为描述,这种方式使得设计者专注于电路功能的设计,而不必过多地考虑具体的硬件结构。基于EDA技术的现场可编程门阵列(FPGA)电路,提出现场可编程门阵列(FPGA)是近年来迅速发展的大规模可编程专用集成电路(ASIC),在数字系统设计和控制电路中越来越受到重视。VHDL语言是电子设计的主流硬件描述语言,它更适合进行行为描述,这种方式使得设计者专注于电路功能的设计,而不必过多地考虑具体的硬件结构。1 FPGA概述1.1 FPGA的简介FPGA(FieldProgrammable Gate Array),即现场可编程门阵列,它是在可编程器件的基
7、础上进一步发展的产物。它是作为专用集成电路领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。目前以硬件描述语言所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术主流。1.2 FPGA的应用FPGA的应用可分为三个层面:电路设计,产品设计,系统设计。电路设计:连接逻辑,控制逻辑是FPGA早期发挥作用比较大的领域也是FPGA应用的基石。事实上在电路设计中应用FPGA要求开发者要具备相应的硬件知识(电路知识)和软件应用能力(开发工具)。 产品设计:把相对成熟的技术应用到某些特定领域开发出满足行业
8、需要并能被行业客户接受的产品。这方面主要是FPGA技术和专业技术的结合问题,重点在性能, FPGA技术在这个领域是一个实现手段,FPGA因为具备接口,控制,功能IP,内嵌CPU等特点有条件实现一个构造简单,固化程度高,功能全面的系统产品设计。系统级应用:系统级的应用是FPGA与传统的计算机技术结合,实现一种FPGA版的计算机系统如用XilinxV-4, V-5系列的FPGA,实现内嵌POWERPCCPU, 然后再配合各种外围功能,这个平台上跑LINIX等系统这个系统也就支持各种标准外设和功能接口了,这对于快速构成FPGA大型系统来讲是很有帮助的。2 VHDL硬件描述语言2.1 VHDL程序基本
9、结构一个相对完整的VHDL程序通常包含实体、结构体、配置、程序包和库5个部分。程序模板如下:LIBRARY library name;USE library name.package name.all;ENTITY entity name IS GENERIC ( parameter name :string:=default value; parameter name :integer:=default value); PORT ( input name,input name: IN STD-LOGIC; Input vector name:IN STD_LOGIC_VECTOR( high
10、 DOWNTO low); output name ,output name:OUT STD_LOGIC);END entity name; ARCHITECTURE a OF entity name IS SIGNAL signal name:STD_LOGIC;BEGIN -process statement (optional) -generate statement (optional) END a;2.1.1 实体实体一般用来描述所设计的系统的外部接口信号,是可视部分;其中最重要的部分是端口说明。端口说明语句是对于一个设计实体界面的说明。端口名是赋予每个系统引脚的名称。一个实体通常有
11、一个或多个端口,端口类似于原理图部件符合上的管脚。实体与外界交流的信息必须通过端口通道流入或流出。IEEE 1064标准包中定义了四种端口模式,其功能及符号分别是IN、OUT、INOUT、BUFFER、LINKAGE。2.1.2 结构体结构体用于描述系统内部的结构和行为,建立输入输出之间的关系。在一个实体中,可以含有一个或一个以上的结构体,而在每一个结构体中又可以含有一个或多个进程以及其他的语句。其中,实体名必须是被设计的实体的名字。结构体中的说明语句是对结构体的功能描述语句中将要用到的信号、数据类型、常数、元件、函数和过程等加以说明的语句。结构体包含两类语句:并行语句和顺序语句。在PROCE
12、SS中的语句是顺序执行的,当PROCESS所带的敏感信号发生变化时,PROCESS中的语句就会执行一遍。2.1.3 库库使用说明用于打开(调用)本设计实体将要用到的库,库是专门存放预编译程序包的地方。IEEE库:在IEEE库中有一个STD_LOGIC的包,它是IEEE正式认可的包。STD库:STD库是VHDL的标准库,在库中有名为STANDARD的包。在使用库之前,一定要进行库说明,库的说明总是放在设计单元的前面。2.2 VHDL语言2.2.1 VHDL文字规则VHDL文字主要包括数值和标识符。数值型文字主要有数字型、字符串型和位串型。数字型文字有:整数文字(十进制数)、实数文字(十进制数,必
13、须带有小数点)、以数字基数表示的文字。字符串型文字有:文字字符串、数位字符串、标识符。2.2.2 VHDL数据对象在VHDL中,数据对象类似于一种容器,接受不同数据类型的赋值。数据对象有3种:即常量、信号、变量。常量是固定值,不能在程序中被改变。变量时一个局部量,是一个临时数据,没有物理意义。它只能在Process和Function中定义,必须在进程和子程序的说明性区域说明,并只在其内部有效。信号是描述硬件系统的基本数据对象,代表连接线,Port也是一种信号。2.2.3 VHDL数据类型VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据
14、类型,并且只有相同的数据类型的量才能互相传递和作用。VHDL 的基本类型有:bit(位)、bit-Vector(位矢量)、Boolean、time、character、string、integer 、real。2.2.4 VHDL顺序语句VHDL有如下六类基本顺序语句 :赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句。赋值语句有信号赋值语句和变量赋值语句两种。流程控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句、EXIT语句。IF语句根据条件句产生的判断结果:TRUE 或 FALSE,有条件地选择执行其后的顺序语句。 CASE语句根据满足的条件直接选
15、择多项顺序语句中的一项执行。空操作语句不完成任何操作,它常用于CASE语句中,利用它来表示所余的不用条件下的操作行为满足所有可能的条件。2.2.5 VHDL并行语句结构体中的并行语句主要有七种:并行信号赋值语句、进程语句、块语句 、条件信号赋值语句、元件例化语句(其中包括类属配置语句 )生成语句、并行过程调用语句。3系统设计与仿真3.1 系统介绍交通灯控制器用于自动控制十字路口交通灯和计时器,指挥各种车辆和行人安全通行。3.1.1 设计任务设计一个十字路口交通控制器,方向分为东南西北四个方向。东西方向的红绿灯状态一样,南北方向的红绿灯状态一样。每个方向上,有四盏灯,分别是左转灯、红灯、绿灯和黄
16、灯。左拐灯亮表示左转车辆可以通行;红灯亮表示左转和直行车辆禁行;绿灯亮表示直行车辆和右转的车辆可以通行;黄灯亮表示左转和直行的车辆即将禁行;倒计时显示器用来显示允许通行或禁止通行的时间倒计时。3.1.2 设计要求在十字路口东西方向和南北方向各设一组左转灯;显示的顺序为:左转灯绿灯黄灯红灯。在东西方向和南北方向各设一组倒计时显示器。倒计时只显示对应方向上的红灯倒计时和绿灯倒计时。其余的状态不显示倒计时。左转灯、红灯、绿灯和黄灯亮的时间分别是15秒、80秒、45秒、5秒。状态表如表3-1所示:状态S0S1S2S3S4S5东 西 方 向红红红红 左转绿黄亮 灯 1545515455南 北 方 向红
17、左转绿黄红红红亮灯1545515455表3-1 交通灯状态转换表3.2 系统设计仿真对于交通灯控制器,可基于Quartus II 软件,采用层次化混合输入方式进行设计,即顶层采用原理图设计,底层采用VHDL语言设计。3.2.1 系统框图设计顶层原理图可以依据系统框图进行设计,有分频模块、控制模块、倒计时模块、红绿灯显示模块、译码模块、译码显示模块6六部分组成,如图3-1 所示:图3-1 顶层原理图系统框图3.2.2 系统时序状态图设计图3-2 交通灯时序状态图新建工程新建原理图文件或VHDL文件输入程序或编辑原理图编译,若有错,修改程序,直至无错建立波形文件,导入管脚编译波形文件,查看仿真结果
18、,保存3.2.3 系统工程设计流程图图3-3 系统工程设计流程框图3.2.4 芯片选择在这次毕业设计中,我们选用的FPGA芯片是Altera公司的Cyclone(飓风)系列的芯片,型号为:EP1C3T144C8。它是基于1.5V的,采用0.13um全铜SRAM工艺、TQFP封装,有5980个逻辑单元,2个锁相环,20个M4K RAM块,其中每个RAM为4kbit,可以另加一位奇偶校验位。3.3 功能模块设计与仿真3.3.1 分频器模块设计该分频器模块可将频率为1KHZ的脉冲波,经过分频变为频率为1HZ的脉冲波,这样我们就得到了周期为1S的脉冲波。分频器程序清单如下:library ieee;u
19、se ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpinqi isport ( clk1khz:in std_logic; clk1hz:out std_logic);end fenpinqi;architecture a of fenpinqi isbeginprocess( clk1khz )variable q: integer:=0 ; variable r:std_logic:=0;begin if clk1khzevent and clk1khz=1 then if q=500 then r:=
20、not r; q:=0; else q:=q+1; end if;clk1hz=r;end if;end process;end a;分频器程序仿真结果如图3-4所示:图3-4 分频器模块仿真结果图在分频器程序仿真结果图中,clk1khz 为输入脉冲信号,频率为1khz;clk1hz为输出脉冲信号,频率为1hz。从图中,我们可以看出clk1hz的周期为1s。这表明程序的确把1khz的信号分频成1hz的信号。3.3.2 控制模块设计控制模块可根据clk的脉冲信号输出S的值,下游模块根据S的值来决定红绿灯的状态。同时对倒计时的信号赋初值。控制模块程序清单:library ieee;use ieee
21、.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity control isport( clk:in std_logic; s:out std_logic_vector(2 downto 0); loadat,loadbt:out std_logic; at,bt:out integer range 0 to 80);end control;architecture a of control issignal t:integer;begin process(clk) begin if clkevent and clk=1 then
22、loadat=0;loadbt=0; if t=0 then s=000; at=80; loadat=1; elsif t=15 then s=001; bt=45; loadbt=1; elsif t=60 then s=010; elsif t=65 then s=011; bt=80; loadbt=1; elsif t=80 then s=100; at=45; loadat=1; elsif t=125 then s=101; end if; t=t+1; end if;if t=130 then t=0; end if; end process;end a;控制模块程序仿真结果如
23、图3-5所示:图3-5 控制模块仿真结果图在控制模块程序仿真结果图中,只有一个输入信号clk,它是一个频率为1hz的时钟脉冲信号,输出信号有3个分别是s、at、bt。程序中,通过变量t的值来确定输出信号s的值,并由此确定将要赋得倒计时的初值,然后赋给at,bt。在每次给at,bt赋值时,都会使另一个输出信号loadat,loadbt变成高电平,从而可以触发下一模块的装载。3.3.3 倒计时模块设计倒计时模块用来接收控制模块的输出作为初值,并进行减一操作,最后把减一得结果输出。程序里每检测到一个脉冲clk,就进行一次减一操作。倒计时模块程序清单:library ieee;use ieee.std
24、_logic_1164.all;use ieee.std_logic_unsigned.all;entity atdaojishi isport ( clk,loadat:in std_logic; atin:in integer range 0 to 80; atout:out integer range 0 to 80);end atdaojishi;architecture a of atdaojishi issignal countat:integer range 0 to 80;beginprocessbeginwait until rising_edge(clk);if loada
25、t=1 then countat=atin;else countat=countat-1;end if;end process;atout b:=01001100;when 001= b:=01000010;when 010= b:=01000001;when 011= b:=11000100;when 100= b:=00100100;when 101= b:=00010100;when others = b:=00000000;end case;lrgy=70 thenaout1=7;aout2=60 then aout1=6;aout2=50 thenaout1=5;aout2=40 t
26、henaout1=4;aout2=30 thenaout1=3;aout2=20 thenaout1=2;aout2=10 thenaout1=1;aout2=0 thenaout1=0;aout2=70 thenbout1=7;bout2=60 then bout1=6;bout2=50 thenbout1=5;bout2=40 thenbout1=4;bout2=30 thenbout1=3;bout2=20 thenbout1=2;bout2=10 thenbout1=1;bout2=0 thenbout1=0;bout2 aout1 aout1 aout1 aout1 aout1 ao
27、ut1 aout1 aout1 aout1 aout1 aout1 aout2 aout2 aout2 aout2 aout2 aout2 aout2 aout2 aout2 aout2 aout2 bout1 bout1 bout1 bout1 bout1 bout1 bout1 bout1 bout1 bout1 bout1 bout2 bout2 bout2 bout2 bout2 bout2 bout2 bout2 bout2 bout2 bout2=00000000 ; end case;end process;end a;译码显示仿真结果如图3-9所示:图3-9 译码显示模块仿真结
28、果图在译码显示模块仿真结果图中,at1,at2,bt1,bt2为输入信号,它们的值的范围为09;aout1,aout2,bout1,bout2为输出信号,它们的范围为数字09对应的七位数码管显示段码的值。图中,输出信号的值随着输入信号的变化而相应的变化。仿真完全正确,符合预期。3.4 顶层文件设计交通灯的顶层文件是一个原理图文件,它包含7个元件符号,每一个元件符号均是由一个模块程序生成。7个元件符号分别为:1个分频模块、1个控制模块、1个信号处理模块、2个倒计时模块、1个数据译码模块和1个显示模块。这些模块均经过设计、编译、仿真,结果正确。最后生成可视化元件符号,然后将各个模块用具有电气性质的
29、导线连接起来,这样原理图文件就建好了。保存编译。在建立一个.vwf波形文件,保存并仿真。原理图如图3-10所示,仿真结果如图3.11所示,实验证明仿真结果正确,符合预期。图3-10 顶层文件设计原理图图3-11 顶层文件波形仿真结果图在顶层文件波形仿真结果图中,有一个频率为1khz输入信号clk1khz,它是外部的信号对整个系统设计的输入端口。作为一个脉冲,经过分频变成频率为1hz的脉冲,由于1hz的脉冲的周期是1s,所以我们可以用它来控制整个系统的步调,而这个步调与现实生活中交通灯的步调是一致的。1hz的信号经过控制模块的处理,通过计数使s变化为不同的值,s代表的是交通灯时序图的状态,一共有
30、6个状态(s0s5)。同时对应不同的s的状态赋不同的初值给at,bt。at,bt分别是东西方向和南北方向的倒计时初值。控制模块还有一个功能是提供倒计时模块的置数的触发脉冲。接下来,信号处理模块直接接受s的值来输出相应的红绿灯亮灭状态。例如:lrgy的值为01000010,这表明交通灯的亮灭情况为:东西左转灯灭,东西红灯亮,东西绿灯灭,东西黄灯灭,南北左转灯灭,南北红灯灭,南北绿灯亮,南北黄灯灭。即一一对应。倒计时部分分为两个模块,两个模块分别倒计时东西方向和南北方向。每个倒计时模块都有相似的端口:clk、loadat、atin、atout和clk、loadbt、btin、btout。我们只举其
31、中一个为例子:clk为倒计时的时钟脉冲,当loadat为高电平时,将atin传递给atout,clk的上升沿每来一次,atout减一次。此前,时间的值都是整形的,要想将倒计时实时显示出来,就需要将两位的整数分解成个位和十位,数据译码模块就是这样的。将一个倒计时分解成两个一位数,例如将54分解成5和4。然后经过显示模块将对应的数字译成相应的段码,例如将5和4译码为01101101和01100110。在这个系统设计中,所有的数码管和二极管均为共阴极显示。结论从9月份接到实训任务到现在,已有1个月的时间,回想自己在这1个月的时间里的付出,看着手中这份劳动果实,我真正体会到了收获的喜悦。在此期间,我在网上搜集一些相关信息,到图书馆查阅有关资料,最后终于顺利完成