FPGA交通灯设计实训报告.docx

上传人:b****5 文档编号:8008928 上传时间:2023-01-27 格式:DOCX 页数:20 大小:272.16KB
下载 相关 举报
FPGA交通灯设计实训报告.docx_第1页
第1页 / 共20页
FPGA交通灯设计实训报告.docx_第2页
第2页 / 共20页
FPGA交通灯设计实训报告.docx_第3页
第3页 / 共20页
FPGA交通灯设计实训报告.docx_第4页
第4页 / 共20页
FPGA交通灯设计实训报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

FPGA交通灯设计实训报告.docx

《FPGA交通灯设计实训报告.docx》由会员分享,可在线阅读,更多相关《FPGA交通灯设计实训报告.docx(20页珍藏版)》请在冰豆网上搜索。

FPGA交通灯设计实训报告.docx

FPGA交通灯设计实训报告

FPGA实训报告

 

实训设计题目基于FPGA的交通灯控制器设计

作者xxxxxxx

分院xxxxxxxxxxxxxxxxxxx

专业班级xxxxxxxxx

指导教师(职称)xxxxxxxxxxxxxx

报告完成时间2012年10月8日

 

基于FPGA的交通灯控制器设计

摘要:

超高速硬件描述语言VHDL,是对数字系统进行抽象的行为与功能描述到具体的内部线路结构描述,利用EDA工具可以在电子设计的各个阶段、各个层系进行计算机模拟验证,保证设计过程的正确性,可大大降低设计成本,缩短设计周期。

本文介绍的数字秒表设计,利用基于VHDL的EDA设计工具,采用大规模可编程逻辑器件FPGA,通过设计芯片来实现系统功能。

交通灯控制系统可以实现路口红绿灯的自动控制。

基于FPGA设计的交通灯控制系统具有电路简单、可靠性强、实时快速擦写、运算速度高、故障率低、可靠性高,而且体积小的特点。

本设计采用Altera公司Cyclone系列的EPlC3T1444C8芯片,在QuartusII软件平台上使用VHDL语言,采用自顶向下的设计方法对系统进行了模块化设计和综合,并进行了仿真。

该系统可实现十字路口红绿灯及左转弯控制和倒计时显示,仿真结果结果表明系统能够自动控制交通灯转变。

关键词:

EDA;交通灯;VHDL

 

基于FPGA的交通灯控制器设计

xxxxx专业xxxx班xxxx指导教师xxxx

引言

当今社会是数字化的社会,是数字集成电路广泛应用的社会。

数字集成电路本身在不断进行更新换代,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。

系统设计师更愿意自己设计专业集成电路(ASIC)芯片,而且希望设计周期尽可能短,最好在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场可编程器件(FPLD)。

现场可编程门阵列(FPGA)即属其中应用最广泛的一种。

随着电子技术的发展,特别是大规模集成电路和计算机技术的研制和发展,让电子产品设计有了更好的应用市场,实现方法也有了更多的选择,而电子电路的设计却变得越来越复杂,使用“语言”进行电子设计已成为一种趋势。

现代电子系统设计方法是设计师自己设计芯片来实现电子系统的功能,将传统的固件选用及电路板设计工作放在芯片设计中进行。

在这些专业化软件中,EDA(ElectronicDesignAutomation)具有一定的代表性,EDA技术是一种基于芯片的现代电子系统设计方法。

基于EDA技术的现场可编程门阵列(FPGA)电(ASIC),在数字系统设计和控制电路中越来越受到重视。

VHDL语言是电子设计的主流硬件描述语言,它更适合进行行为描述,这种方式使得设计者专注于电路功能的设计,而不必过多地考虑具体的硬件结构。

基于EDA技术的现场可编程门阵列(FPGA)电路,提出现场可编程门阵列(FPGA)是近年来迅速发展的大规模可编程专用集成电路(ASIC),在数字系统设计和控制电路中越来越受到重视。

VHDL语言是电子设计的主流硬件描述语言,它更适合进行行为描述,这种方式使得设计者专注于电路功能的设计,而不必过多地考虑具体的硬件结构。

 

1FPGA概述

1.1FPGA的简介

FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在可编程器件的基础上进一步发展的产物。

它是作为专用集成电路领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

目前以硬件描述语言所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。

1.2FPGA的应用

FPGA的应用可分为三个层面:

电路设计,产品设计,系统设计。

电路设计:

连接逻辑,控制逻辑是FPGA早期发挥作用比较大的领域也是FPGA应用的基石。

事实上在电路设计中应用FPGA要求开发者要具备相应的硬件知识(电路知识)和软件应用能力(开发工具)。

产品设计:

把相对成熟的技术应用到某些特定领域开发出满足行业需要并能被行业客户接受的产品。

这方面主要是FPGA技术和专业技术的结合问题,重点在性能,FPGA技术在这个领域是一个实现手段,FPGA因为具备接口,控制,功能IP,内嵌CPU等特点有条件实现一个构造简单,固化程度高,功能全面的系统产品设计。

系统级应用:

系统级的应用是FPGA与传统的计算机技术结合,实现一种FPGA版的计算机系统如用Xilinx V-4,V-5系列的FPGA,实现内嵌POWER PC CPU,然后再配合各种外围功能,这个平台上跑LINIX等系统这个系统也就支持各种标准外设和功能接口了,这对于快速构成FPGA大型系统来讲是很有帮助的。

 

2VHDL硬件描述语言

2.1VHDL程序基本结构

一个相对完整的VHDL程序通常包含实体、结构体、配置、程序包和库5个部分。

程序模板如下:

LIBRARYlibraryname;

USElibraryname.packagename.all;

ENTITYentitynameIS

GENERIC

(parametername:

string:

=defaultvalue;

parametername:

integer:

=defaultvalue);

PORT

(inputname,inputname:

INSTD-LOGIC;

Inputvectorname:

INSTD_LOGIC_VECTOR(highDOWNTOlow);

outputname,outputname:

OUTSTD_LOGIC);

ENDentityname;

ARCHITECTUREaOFentitynameIS

SIGNALsignalname:

STD_LOGIC;

BEGIN

--processstatement(optional)

--generatestatement(optional)

ENDa;

2.1.1实体

实体一般用来描述所设计的系统的外部接口信号,是可视部分;其中最重要的部分是端口说明。

端口说明语句是对于一个设计实体界面的说明。

端口名是赋予每个系统引脚的名称。

一个实体通常有一个或多个端口,端口类似于原理图部件符合上的管脚。

实体与外界交流的信息必须通过端口通道流入或流出。

IEEE1064标准包中定义了四种端口模式,其功能及符号分别是IN、OUT、INOUT、BUFFER、LINKAGE。

2.1.2结构体

结构体用于描述系统内部的结构和行为,建立输入输出之间的关系。

在一个实体中,可以含有一个或一个以上的结构体,而在每一个结构体中又可以含有一个或多个进程以及其他的语句。

其中,实体名必须是被设计的实体的名字。

结构体中的说明语句是对结构体的功能描述语句中将要用到的信号、数据类型、常数、元件、函数和过程等加以说明的语句。

结构体包含两类语句:

并行语句和顺序语句。

在PROCESS中的语句是顺序执行的,当PROCESS所带的敏感信号发生变化时,PROCESS中的语句就会执行一遍。

2.1.3库

库使用说明用于打开(调用)本设计实体将要用到的库,库是专门存放预编译程序包的地方。

IEEE库:

在IEEE库中有一个STD_LOGIC的包,它是IEEE正式认可的包。

STD库:

STD库是VHDL的标准库,在库中有名为STANDARD的包。

在使用库之前,一定要进行库说明,库的说明总是放在设计单元的前面。

2.2VHDL语言

2.2.1VHDL文字规则

VHDL文字主要包括数值和标识符。

数值型文字主要有数字型、字符串型和位串型。

数字型文字有:

整数文字(十进制数)、实数文字(十进制数,必须带有小数点)、以数字基数表示的文字。

字符串型文字有:

文字字符串、数位字符串、标识符。

2.2.2VHDL数据对象

在VHDL中,数据对象类似于一种容器,接受不同数据类型的赋值。

数据对象有3种:

即常量、信号、变量。

常量是固定值,不能在程序中被改变。

变量时一个局部量,是一个临时数据,没有物理意义。

它只能在Process和Function中定义,必须在进程和子程序的说明性区域说明,并只在其内部有效。

信号是描述硬件系统的基本数据对象,代表连接线,Port也是一种信号。

2.2.3VHDL数据类型

VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且只有相同的数据类型的量才能互相传递和作用。

VHDL的基本类型有:

bit(位)、bit-Vector(位矢量)、Boolean、time、character、string、integer、real。

2.2.4VHDL顺序语句

VHDL有如下六类基本顺序语句:

赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句。

赋值语句有信号赋值语句和变量赋值语句两种。

流程控制语句共有五种:

IF语句、CASE语句、LOOP语句、NEXT语句、EXIT语句。

IF语句根据条件句产生的判断结果:

TRUE或FALSE,有条件地选择执行其后的顺序语句。

CASE语句根据满足的条件直接选择多项顺序语句中的一项执行。

空操作语句不完成任何操作,它常用于CASE语句中,利用它来表示所余的不用条件下的操作行为——满足所有可能的条件。

2.2.5VHDL并行语句

结构体中的并行语句主要有七种:

并行信号赋值语句、进程语句、块语句、条件信号赋值语句、元件例化语句(其中包括类属配置语句)生成语句、并行过程调用语句。

 

3系统设计与仿真

3.1系统介绍

交通灯控制器用于自动控制十字路口交通灯和计时器,指挥各种车辆和行人安全通行。

3.1.1设计任务

设计一个十字路口交通控制器,方向分为东南西北四个方向。

东西方向的红绿灯状态一样,南北方向的红绿灯状态一样。

每个方向上,有四盏灯,分别是左转灯、红灯、绿灯和黄灯。

左拐灯亮表示左转车辆可以通行;红灯亮表示左转和直行车辆禁行;绿灯亮表示直行车辆和右转的车辆可以通行;黄灯亮表示左转和直行的车辆即将禁行;倒计时显示器用来显示允许通行或禁止通行的时间倒计时。

3.1.2设计要求

在十字路口东西方向和南北方向各设一组左转灯;显示的顺序为:

左转灯

绿灯

黄灯

红灯。

在东西方向和南北方向各设一组倒计时显示器。

倒计时只显示对应方向上的红灯倒计时和绿灯倒计时。

其余的状态不显示倒计时。

左转灯、红灯、绿灯和黄灯亮的时间分别是15秒、80秒、45秒、5秒。

状态表如表3-1所示:

状态

S0

S1

S2

S3

S4

S5

东西方向

红左转

绿

亮灯

15

45

5

15

45

5

南北方向

红左转

绿

亮灯

15

45

5

15

45

5

表3-1交通灯状态转换表

3.2系统设计仿真

对于交通灯控制器,可基于QuartusII软件,采用层次化混合输入方式进行设计,即顶层采用原理图设计,底层采用VHDL语言设计。

3.2.1系统框图设计

顶层原理图可以依据系统框图进行设计,有分频模块、控制模块、倒计时模块、红绿灯显示模块、译码模块、译码显示模块6六部分组成,如图3-1所示:

图3-1顶层原理图系统框图

3.2.2系统时序状态图设计

 

图3-2交通灯时序状态图

 

3.2.3系统工程设计流程图

 

图3-3系统工程设计流程框图

3.2.4芯片选择

在这次毕业设计中,我们选用的FPGA芯片是Altera公司的Cyclone(飓风)系列的芯片,型号为:

EP1C3T144C8。

它是基于1.5V的,采用0.13um全铜SRAM工艺、TQFP封装,有5980个逻辑单元,2个锁相环,20个M4KRAM块,其中每个RAM为4kbit,可以另加一位奇偶校验位。

3.3功能模块设计与仿真

3.3.1分频器模块设计

该分频器模块可将频率为1KHZ的脉冲波,经过分频变为频率为1HZ的脉冲波,这样我们就得到了周期为1S的脉冲波。

分频器程序清单如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityfenpinqiis

port(clk1khz:

instd_logic;

clk1hz:

outstd_logic);

endfenpinqi;

architectureaoffenpinqiis

begin

process(clk1khz)

variableq:

integer:

=0;

variabler:

std_logic:

='0';

begin

ifclk1khz'eventandclk1khz='1'then

ifq=500thenr:

=notr;q:

=0;

elseq:

=q+1;

endif;

clk1hz<=r;

endif;

endprocess;

enda;

分频器程序仿真结果如图3-4所示:

图3-4分频器模块仿真结果图

在分频器程序仿真结果图中,clk1khz为输入脉冲信号,频率为1khz;clk1hz为输出脉冲信号,频率为1hz。

从图中,我们可以看出clk1hz的周期为1s。

这表明程序的确把1khz的信号分频成1hz的信号。

3.3.2控制模块设计

控制模块可根据clk的脉冲信号输出S的值,下游模块根据S的值来决定红绿灯的状态。

同时对倒计时的信号赋初值。

控制模块程序清单:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitycontrolis

port(clk:

instd_logic;

s:

outstd_logic_vector(2downto0);

loadat,loadbt:

outstd_logic;

at,bt:

outintegerrange0to80);

endcontrol;

architectureaofcontrolis

signalt:

integer;

begin

process(clk)

begin

ifclk'eventandclk='1'then

loadat<='0';loadbt<='0';

ift=0thens<="000";at<=80;loadat<='1';

elsift=15thens<="001";bt<=45;loadbt<='1';

elsift=60thens<="010";

elsift=65thens<="011";bt<=80;loadbt<='1';

elsift=80thens<="100";at<=45;loadat<='1';

elsift=125thens<="101";

endif;

t<=t+1;

endif;

ift=130thent<=0;endif;

endprocess;

enda;

控制模块程序仿真结果如图3-5所示:

图3-5控制模块仿真结果图

在控制模块程序仿真结果图中,只有一个输入信号clk,它是一个频率为1hz的时钟脉冲信号,输出信号有3个分别是s、at、bt。

程序中,通过变量t的值来确定输出信号s的值,并由此确定将要赋得倒计时的初值,然后赋给at,bt。

在每次给at,bt赋值时,都会使另一个输出信号loadat,loadbt变成高电平,从而可以触发下一模块的装载。

3.3.3倒计时模块设计

倒计时模块用来接收控制模块的输出作为初值,并进行减一操作,最后把减一得结果输出。

程序里每检测到一个脉冲clk,就进行一次减一操作。

倒计时模块程序清单:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityatdaojishiis

port(clk,loadat:

instd_logic;

atin:

inintegerrange0to80;

atout:

outintegerrange0to80);

endatdaojishi;

architectureaofatdaojishiis

signalcountat:

integerrange0to80;

begin

process

begin

waituntilrising_edge(clk);

ifloadat='1'thencountat<=atin;

elsecountat<=countat-1;

endif;

endprocess;

atout<=countat;

enda;

倒计时模块程序仿真结果如图3-6所示:

图3-6倒计时模块仿真结果图

在倒计时模块程序仿真结果图中,clk为1hz的输入信号,loadat为at计数器的装载信号,当loadat为高电平时,将输入信号atin的值装载到计数器中,开始执行减一操作,每接受一次clk,执行一次,并将结果输出。

3.3.4信号处理模块设计

信号处理模块可根据输入的S信号,输出对应的红绿灯信号,直接改变并驱动红绿灯的亮和灭。

信号处理模块程序清单:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitymainis

port(s:

instd_logic_vector(2downto0);

lrgy:

outstd_logic_vector(7downto0));

endmain;

architectureaofmainis

begin

process(s)

variableb:

std_logic_vector(7downto0);

begin

casesis

when"000"=>b:

="01001100";

when"001"=>b:

="01000010";

when"010"=>b:

="01000001";

when"011"=>b:

="11000100";

when"100"=>b:

="00100100";

when"101"=>b:

="00010100";

whenothers=>b:

="00000000";

endcase;

lrgy<=b;

endprocess;

enda;

信号处理模块程序仿真结果如图3-7所示:

图3-8信号处理模块仿真结果图

在信号处理模块仿真结果图中,S为输入信号,用来表明整个红绿灯的状态(一共6个状态:

S0~S5);lrgy为输出信号,代表整个红绿灯的亮和灭的情况,灯的排序从高位到低位排列,方向上是先东西方向,后南北方向。

也就是说,序列为:

东西方向左转灯、红灯、绿灯、黄灯,然后南北方向左转灯、红灯、绿灯、黄灯。

从图中我们可以看出S的状态从“000”到“101”,共六个状态,每一个状态都对应相应的红绿灯亮灭的状态,仿真结果完全正确,符合预期。

3.3.5数据译码模块设计

数据译码模块将输入的用来显示的两位倒计时数值,分解成四个整形的数值,以供后面的显示模块继续译码显示。

数据译码程序清单如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityto8421bcdis

port(at,bt:

inintegerrange0to80;

aout1,aout2,bout1,bout2:

outintegerrange0to9);

endto8421bcd;

architectureaofto8421bcdis

begin

process(at,bt)

begin

ifat>=70then

aout1<=7;

aout2<=at-70;

elsifat>=60then

aout1<=6;

aout2<=at-60;

elsifat>=50then

aout1<=5;

aout2<=at-50;

elsifat>=40then

aout1<=4;

aout2<=at-40;

elsifat>=30then

aout1<=3;

aout2<=at-30;

elsifat>=20then

aout1<=2;

aout2<=at-20;

elsifat>=10then

aout1<=1;

aout2<=at-10;

elsifat>=0then

aout1<=0;

aout2<=at;

endif;

ifbt>=70then

bout1<=7;

bout2<=bt-70;

elsifbt>=60then

bout1<=6;

bout2<=bt-60;

elsifbt>=50then

bout1<=5;

bout2<=bt-50;

elsifbt>=40then

bout1<=4;

bout2<=bt-40;

elsifbt>=30then

bout1<=3;

bout2<=bt-30;

elsifbt>=20then

bout1<=2;

bout2<=bt-20;

elsifbt>=10then

bout1<=1;

bout2<=bt-10;

elsifbt>=0then

bout1<=0;

bout2<=bt;

endif;

endprocess;

enda;

译码程序仿真结果如图3-8所示:

图3-8译码程序仿真结果图

在数据译码模块仿真结果图中,at,bt为输入信号,at,bt的范围为0~80。

这包含了所有倒计时的范围;aout1,aout2,bout1,bout2为输出信号,值的范围为0~9,涵盖了数码管显示数字的范围。

图中at,bt的值不断变化,而aout1,aout2都能将at的值分解成个位和十位,其中aout1代表十位,aout2代

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1