搜索
您的当前位置:首页正文

fpga红绿灯报告

来源:知库网
Administrator

Page 1 4/28/2013 - 1 -2

前言

(1)EDA简介

电子技术的迅猛发展,高新技术日新月异。传统的电子技术设计方法,以不能帮助我们更好的、高效的完成设计任务。所以我们需要更好的工具来帮助我们完成设计任务。

EDA技术是指以计算机为工作平台,融合应用电子技术、计算机技术、信息处理及智能化技术,进行电子产品自动化设计的一门新技术。

EDA技术作为现代电子设计技术的核心,依赖于计算机,在EDA工具软件平台上,对以硬件描述语言为逻辑描述手段完成设计文件,自动地完成逻辑编译、逻辑化简、逻辑综合、布局布线,以及逻辑优化和仿真测试,直至实现既定的电子电路的功能。

在硬件方面,EDA技术融合了大规模集成电路制造技术、集成电路板图设计技术、可编程器件编程技术、自动测试技术等;在计算机辅助工程方面融合了计算机辅助设计、计算机辅助制造、计算机辅助测试、计算机辅助分析、计算机辅助工程技术以及多种计算机语言的设计概念;在现代电子学方面容纳了诸如计算机设计技术、电子线路设计理论、数字信息处理技术、数字系统建模和优化技术以及基于微波技术的长线技术理论。

当前,利用EDA技术进行电子电路设计的主要方法,是基于可编程器件完成专用电路ASIC的实现,ASIC作为最终的物理平台,是集中容纳用户通过EDA技术将电子应用系统的既定功能、技术指标和个性创意具体实现的硬件实体。

在EDA技术应用中广泛采用自顶向下的方法设计电路,工程项目的设计流程包括:用自然语言描述功能特性和技术指标,用硬件描述语言建立系统描述行为描述结构描述逻辑描述,用计算机开发软件进行功能仿真时序仿真硬件测试。设计者可根据需要,随心所欲地改变器件内部结构乃至器件外部引脚的功能,可以将系统电路分解为各个模块,也可以将多个模块集合在一起。

可以说,EDA技术打破了软件设计和硬件设计间的壁垒,是一门综合性学科,一种多方位技能技术。它将设计效率和产品性能合二为一,代表了电子设计技术和电子应用技术的发展方向。

EDA的设计流程

一 编辑输入

(1) 文本输入。在EDA工具软件的文本编辑见面上,输入用某种硬件语言表 述的电路设

计文本。

(2) 原理图输入。在EDA工具软件的图形编辑界面上,绘制能完成预定功能的电路原理图。 (3) 状态图输入。依据电路的控制条件和状态转换的因果关系,在EDA工具软件的状态图

编辑界面上绘制时序电路的状态流程图。

(4) 波形图输入。在EDA工具软件的波形图编辑界面上,绘制电路输入输出信号间的波形

关系,然后由EDA编译器据此完成电路设计。

一 综合

综合是将由硬件描述语言表述的电路行为表述转换为低级的、与可编程逻辑器件基本结构相映射的网表文件或电路连接图。 一 适配

适配是为了将综合器产生的网表文件装配于指定的目标器中,而产生最终的编程文件。 二 功能仿真与时序仿真

(1) 功能仿真是指针对文本设计、原理图设计及其它设计方法的逻辑功能进行测试模拟,以便

了解所设计电路实现的功能是否符合要求。

Administrator

Page 2 4/28/2013 - 2 -2

(2) 时序仿真的结果接近真实器件的运行特性。 三 编程下载

把适配后生成的编程文件通过编程器或编程电缆载入目标可编程逻辑器件,以便进行硬件验证。

一、硬件测试

对含有载入了编程文件的可编程逻辑器件的硬件系统进行统一的测试。

(2)FPGA简介

现场可编程门阵列FPGA采用可编程的查表LUT构成逻辑函数发器,它的集成度高于CPLD。 本科程使用的是Cyclone系列器件,它是Altera公司开发的,主要由逻辑阵列块LAB、嵌入式存储器、嵌入式锁相环PLL、嵌入式18*18乘法器和I/O单元构成,其工作原理在FPGA器件中具有典型性。Cyclone器件含有数十个嵌入式存储器,速率达200MHZ以上,可构成包括移位寄存器、双口RAM、单口RAM、FIFO、ROM等各种功能单元,从而扩大了FPGA的应用范围。Cyclone器件中含有的PLL可用于调整时钟信号频率、占空比和相违。Cyclone器件的I/O单元支持单端、差分、四态等多种I/O接口标准,支持高达640Mbps的数据传输速度。

本组的选题——数字秒表,就是利用基于Altera公司开发的Cyclone系列器件中的EP1C6Q2408C芯片来完成的,可以实现秒表计时的功能。

Administrator

Page 3 4/28/2013 - 3 -2

课程设计任务书

设计要求

设计一个简单自动控制的交通的交通灯控制系统。 具体要求

1在十字路口的两个方向各设一组红绿黄指示灯,显示顺序为,其中一个方向是绿灯、黄灯、红灯,另一个方向是红灯、绿灯、黄灯;

2主干道红灯持续80秒

3在保证主干道80s前提下支干道绿灯不少于40s 4主干道或支干道绿灯变红灯时,黄灯亮6s 5主干道及支干道有倒计时显示 6有特殊态下两侧红灯全亮 提高

1由左转向灯 2有错误报警 3显示状态错误

Administrator

Page 4 4/28/2013 - 4 -2

系统电路功能描述、粗框图及方案论证说明

确定方案

交通灯示意图如图t-1所示。

交通灯的作用

在道路十字路口,每条道路上有一组红黄绿灯和倒计时显示器,用以指挥车辆和行人有序通行。其中,红灯亮表示道路禁止通行;黄灯亮表示停车;绿灯亮表示可以通行;倒计时显示器是用来显示允许通行或禁止通行的剩余时间。交通灯控制器就是用于自动控制十字路口交通灯的明暗和倒计时器的状态,指挥各种车辆和行人安全通行。

工作状态 S0 S1 S2 S3

表6.1.2交通灯点亮状态表

南北方向 绿灯亮 黄灯亮 红灯亮 红灯亮 东西方向 红灯亮 红灯亮 绿灯亮 黄灯亮 绿 黄 红 倒计时显示器 倒计时显示器 红 黄 绿

系统电路设计陈述

Administrator

Page 5 4/28/2013 - 5 -2

时钟信号CLK RST 控制模块 (南北) 交通灯信号(北) 倒计时时间(北) 显示模块 交通灯信号(西) 控制模块 (东西) 倒计时时间(西) 三、模块电路的端口资源

依据交通灯控制系统的基本结构,分析各模块的具体功能及其在整个系统中的作用,可确定各模块所需要的端口资源。

显示模块的端口资源

显示模块由显示驱动电路和显示器件组成。

A.每个方向有两个用于倒计时显示的七段数码管和3各用于交通灯指示的发光管。 B.每个方向的驱动电路都有两个部分(见图6.1.19),一个是驱动七段显示器,另一个是驱

动交通灯。

在图6.1.19中,输入信号均来自控制模块,其中R、Y、G代表红、黄、绿3各逻辑量,

BCD码代表2组倒计时时间量。同样输出端口的R、Y、G是用于驱动交通灯的3各逻辑量,a~f是驱动七段显示器的7各控制量。

数码2 数码1 红 黄 绿 R Y G a~f a~f 译 码 电 路 R信号

Y信号

G信号

BCD码

BCD码

图 6.1.19 显示模块端口设置

Administrator

Page 6 4/28/2013 - 6 -2

控制模块的端口资源

控制模块是系统的核心模块,控制交通灯的工作状态和倒计时时间。此处进行的端口资源设置是以单方向为例(见图6.1.20),读者可以据此设置另一个方向的端口资源。

红灯(R)

时钟信号CLK 控制模块 RST 黄灯(Y) 绿灯(G) Timh[3..0] Tim1[3..0]

图 6.1.20控制模块端口设置

A、 为了保证倒计时的准确性,需要引入一个基准时钟信号CLK。可以直接输入秒脉冲作

为倒计时的基准时间,也可以输入其他频率的标准脉冲,经分频得到秒脉冲。RST是系统复位信号,用于为系统设置初始状态。

B、 控制模块的输出有两类信号,一类是控制交通灯的逻辑信号(1 or 0),一类是倒计时的BCD码实时结果。这样每个方向控制模块的输出端口资源是,3各分别控制红灯、黄灯和绿灯的逻辑两R、Y、G;2组BCD码数据,分别是计时器的高位timh【3…0】和低位timl【3…0】。

模块电路设计

拟定用层次化设计方法完成各个模块的设计,即底层电路用VHDL语言实现功能,等成

电路把各个模块连接起来,构成整个交通灯控制系统。 (1)设计控制模块

整个系统有两个控制模块,分别控制东西、南北两个方向。根据交通灯的工作状态,

每个方向都有3各未定的状态,只是初始状态不一样。如果南北方向初始状态从绿灯开始,则东西方向初始状态必应从红灯亮开始,否则不符合交通灯的工作规则(见表6.1.2)。

控制模块主要是按就交通灯的工作状态一次控制绿、黄、红灯的亮或灭,同时控制灯

亮的持续时间,当逻辑量输出为1是,对应的灯亮,输出为0时,对应的灯灭。根据交通灯的工作情况,每个方向的任意两个灯不能同时点亮,不同方向之间交通灯的关系按表6.1.21所示转换。

Administrator

Page 7 4/28/2013 - 7 -2

时间未到 红灯 倒计时时间到(5s) 倒计时时间到(80s)

黄灯 时间未到 倒计时时间到(60s) 绿灯 时间未到

图6.1.21交通灯控制状态转换图

A. 南北方向控制模块(cona)的VHDL程序如下,此外初始状态为绿灯亮。

南北方向控制模块的时序仿真如图6.1.22所示。途中CLK是标准时钟信号;g‘y和

r分别代表绿、黄、红灯的控制量,当高电平时对应的灯亮,低电平是对应的灯灭;timh【3…0】timl【3…0】分别是倒计时数的高位和低位。从时序图可以看出,当绿灯g亮时其他灯(r、y)灭,持续时间从19——0(20)各时间脉冲;若CLK选择1s标准时间脉冲,则持续时间就是20s。黄灯y和红灯r的工作时序也类似,只是持续点亮的时间分别是5s和25s。

B. 东西方向控制模块(conb的VHDL)程序与南北方向的编写方式完全一样,只是初始工作状态不同,读者可自行完成。

图6.1.23是东西方向控制模块仿真波形,其初始状态时红灯亮,以后依次是绿灯、黄灯亮。在黄灯亮到实际结束后,有回到红灯亮的状态,如此循环往复,实现对东西方向交通灯的控制

设计显示模块

显示模块需要输出两类显示信号,一类输出到七段显示器,这部分可才考图6.1.11;另一

类是输出3各逻辑两分别控制三只发光管,

控制LED管或者其他发光器件都需要驱动电路这要根据发光器件的功率来确定。而我们使用的LED管驱动电路已经由开发系统的硬件电路提供,故此处对显示模块的实际可不做考虑。但是如果读者自己设计显示系统,就一定要考虑驱动电路,特别是大功率的显示器件。

顶层设计

设计顶层电路可以用图元符号实现,也可以用VHDL的例化语句实现级联,此处利用例化语句完成整体电路的设计:

图6.1.25所示是交通灯控制系统仿真波形。途中南北方向搅动等的控制信号分别是:g1、r1、

y1、timh1和timl1分别是倒计时显示器的高位和地位;东西方向的交通灯的控制信号时g2、r2、y2、timeh2和timl2分别是倒计时显示器的高位和低位。当南北方向为绿灯亮(高电平)或黄灯亮(高电平)时,东西方向为红灯亮(高电平),持续时间为25s,其中南北方向绿灯亮20s、黄灯亮5s;同理,东西方向为绿灯亮(高电平)或者黄灯亮(高电平)时,南北方向为红灯亮(高电平)。

Administrator

Page 8 4/28/2013 - 8 -2

系统电路仿真波形分析结果,引脚锁定清单,硬件(时钟频率、开关、按键、显示、音响等)。

硬件

引脚锁定清单

Administrator

Page 9 4/28/2013 - 9 -2

系统电路仿真波形

适配下载

交通灯控制系统在计算机的QquartusⅡ软件平台上完成逻辑描述和仿真测试并达到设计要求

后,需要下载到后有目标芯片的开发系统上,进行实际检验。

对于本范例来说,选用Cyclone系列芯片EP1C6240C8为设计目标器件,所需的输入部件主要是标准时钟,所需的输出部件是用于倒计时显示器的七段数码管,显示方式为静态;交通灯用发光管代替。通过查阅附录,决定采用看见开发系统的电路模式5,由此可确定设计目标新票引脚标号与开发系统硬件环境间的对应关系:标准时钟clk由开发系统的时钟源Clock0提供,对应目标芯片的28号引脚;系统复位信号rst选择按键1,对应目标芯片的233号引脚;南北方向倒计时器用开发系统的数码管8和数码管7,即timhl【3…0】对应目标芯片的168~165号引脚,timl1【3…0】对应目标芯片的164~161号引脚;交通灯选D8(绿)、D7(黄)和D6(红),即g1、y1、r1对应目标芯片的12、8、7号引脚。东西方向倒计时显示器用数码管2和数码管1,即timh2【3…0】对应目标芯片的20~17号引脚,timl2【3…0】对应目标芯片16~12号引脚;交通灯选D3(红)D2(绿)D1(黄),即r2、g2、y2对应木匾芯片的3、2、1号引脚。

引脚锁定后,进行整个系统的全程编译,从而完成对目标芯片的适配下载。 七、硬件验证

对目标芯片EP1C6Q240C8编程下载成功后,选择开发系统的电路模式5,将时钟源Clock0经跳线帽与1Hz冒充短路,即输入秒脉冲。系统复位按键1置低电平,则系统开始工作,即首先南北向点亮红灯、东西向点亮红灯,然后进入预定的持续时间和交通灯工作规程,倒计时器的工作状态与交通灯转换状态同步,说明检验结果与设计要求相符。

课程设计工作进程 设计小组的分工及工作安排

两人做两个模块,另一人研究提高!

Administrator

Page 10 4/28/2013 - 10 -2

本人承担的任务及执行情况

我做的是东西走向的红绿灯及主干道到的。

一 目的

1在十字路口的两个方向各设一组红绿黄指示灯,显示顺序为,其中一个方向是绿灯、黄灯、红灯,另一个方向是红灯、绿灯、黄灯; 2主干道红灯持续80秒

3在保证主干道80s前提下支干道绿灯不少于40s 4主干道或支干道绿灯变红灯时,黄灯亮6s 5主干道及支干道有倒计时显示 6有特殊态下两侧红灯全亮

二 思路

时钟信号CLK RST 控制模块 (东西) 交通灯信号(北) 倒计时时间(北) 显示模块

三 程序语句注释

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity vhdl1 is

port(rst,clk,en:in std_logic; --系统时钟信号 复位信号 特殊状态信号 r,g,y,l:out std_logic; 交通灯

timh,timl:out std_logic_vector(3 downto 0)); 计时器高位 低位 end vhdl1;

architecture com_arc of vhdl1 is

type rgy is(green,yellow,red,left); 枚举类型数据 begin

process(clk,en)

Administrator

Page 11 4/28/2013 - 11 -2

variable a:std_logic;

variable th,tl:std_logic_vector(3 downto 0); variable state:rgy; begin

if en='1' then a:='1';

g<='0';r<='1';y<='0';l<='0'; else

if rst='1' then

state:=green; 设置开始时为绿灯 a:='0';

elsif clk 'event and clk='1' then case state is

when green=>if a='0' then

th:=\"0101\";tl:=\"1001\";绿灯计时60s a:='1';

g<='1';r<='0';y<='0';l<='0'; 设置绿灯亮其他灭 else 执行倒计时

if not (th=\"0000\" and tl=\"0001\") then

if tl=\"0000\" then tl:=\"1001\"; th:=th-1; else tl:=tl-1; end if; else

th:=\"0000\";tl:=\"0000\"; a:='0'; state:=left; end if; end if;

when left=>if a='0' then th:=\"0001\";tl:=\"1001\"; a:='1';

g<='0';r<='0';y<='0';l<='1'; else

if not (th=\"0000\" and tl=\"0001\") then

if tl=\"0000\" then tl:=\"1001\"; th:=th-1; else tl:=tl-1; end if; else

th:=\"0000\";tl:=\"0000\"; a:='0';

state:=yellow; 倒计时时间到 进入黄灯 end if;

Administrator

Page 12 4/28/2013 - 12 -2

end if;

when yellow=>if a='0' then

th:=\"0000\";tl:=\"0100\"; 黄灯倒计时5s a:='1';

g<='0';r<='0';y<='1';l<='0'; 黄灯亮 其他灭 else 倒计时执行

if not(tl=\"0001\") then tl:=tl-1; else

tl:=\"0000\"; a:='0';

state:=red;倒计时到 红灯亮 end if; end if;

when red=>if a='0' then

th:=\"0110\";tl:=\"0100\"; 设置红灯倒计时64 a:='1';

g<='0';r<='1';y<='0';l<='0'; 控制红灯亮 其他灭 else 执行倒计时

if not (th=\"0000\" and tl=\"0001\") then if tl=\"0000\" then tl:=\"1001\";th:=th-1; else tl:=tl-1; end if; else

th:=\"0000\";tl:=\"0000\"; a:='0';

state:=green; end if; end if;

when others=>state:=green; a:='0'; end case; end if; end if;

timh<=th; 输出倒计时时间高位 timl<=tl; 输出倒计时时间低位 end process; end com_arc;

四 程序执行流程及说明

Administrator

时间未到 Page 13 4/28/2013 - 13 -2

红灯 倒计时时间到(5s) 倒计时时间到(80s)

黄灯 时间未到 倒计时时间到(60s) 绿灯 时间未到

五 仿真结果说明

六 设计中遇到的问题

1语法错误 2 拼写错误3编译时出现错误

附录

程序清单

东西

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity vhdl1 is

port(rst,clk,en:in std_logic;

Administrator

Page 14 4/28/2013 - 14 -2

r,g,y,l:out std_logic;

timh,timl:out std_logic_vector(3 downto 0)); end vhdl1;

architecture com_arc of vhdl1 is type rgy is(green,yellow,red,left); begin

process(clk,en)

variable a:std_logic;

variable th,tl:std_logic_vector(3 downto 0); variable state:rgy; begin

if en='1' then a:='1';

g<='0';r<='1';y<='0';l<='0'; else

if rst='1' then state:=green; a:='0';

elsif clk 'event and clk='1' then case state is

when green=>if a='0' then th:=\"0101\";tl:=\"1001\"; a:='1';

g<='1';r<='0';y<='0';l<='0'; else

if not (th=\"0000\" and tl=\"0001\") then

if tl=\"0000\" then tl:=\"1001\"; th:=th-1; else tl:=tl-1; end if; else

th:=\"0000\";tl:=\"0000\"; a:='0'; state:=left; end if; end if;

when left=>if a='0' then th:=\"0001\";tl:=\"1001\"; a:='1';

g<='0';r<='0';y<='0';l<='1'; else

if not (th=\"0000\" and tl=\"0001\") then

if tl=\"0000\" then tl:=\"1001\"; th:=th-1; else

Administrator

Page 15 4/28/2013 - 15 -2

tl:=tl-1; end if; else

th:=\"0000\";tl:=\"0000\"; a:='0';

state:=yellow; end if; end if;

when yellow=>if a='0' then th:=\"0000\";tl:=\"0100\"; a:='1';

g<='0';r<='0';y<='1';l<='0'; else

if not(tl=\"0001\") then tl:=tl-1; else

tl:=\"0000\"; a:='0'; state:=red; end if; end if;

when red=>if a='0' then th:=\"0110\";tl:=\"0100\"; a:='1';

g<='0';r<='1';y<='0';l<='0'; else

if not (th=\"0000\" and tl=\"0001\") then if tl=\"0000\" then tl:=\"1001\";th:=th-1; else tl:=tl-1; end if; else

th:=\"0000\";tl:=\"0000\"; a:='0';

state:=green; end if; end if;

when others=>state:=green; a:='0'; end case; end if; end if; timh<=th; timl<=tl; end process; end com_arc;

Administrator

Page 16 4/28/2013 - 16 -2

南北

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity vhdl2 is

port(rst,clk,en:in std_logic;

r,g,y,l:out std_logic;

timh,timl:out std_logic_vector(3 downto 0)); end vhdl2;

architecture com_arc of vhdl2 is type rgy is(green,yellow,red,left); begin

process(clk,en)

variable a:std_logic;

variable th,tl:std_logic_vector(3 downto 0); variable state:rgy; begin

if en='1' then a:='1';

g<='0';r<='1';y<='0';l<='0'; else

if rst='1' then state:=red; a:='0';

elsif clk 'event and clk='1' then case state is

when red=>if a='0' then th:=\"1000\";tl:=\"0100\"; a:='1';

g<='0';r<='1';y<='0';l<='0'; else

if not (th=\"0000\" and tl=\"0001\") then

if tl=\"0000\" then tl:=\"1001\"; th:=th-1; else tl:=tl-1; end if; else

th:=\"0000\";tl:=\"0000\"; a:='0';

state:=green; end if; end if;

when green=>if a='0' then th:=\"0011\";tl:=\"1001\";

Administrator

Page 17 4/28/2013 - 17 -2

a:='1';

g<='1';r<='0';y<='0';l<='0'; else

if not(th=\"0000\" and tl=\"0001\") then if tl=\"0000\" then tl:=\"1001\";th:=th-1; else tl:=tl-1; end if; else

tl:=\"0000\";th:=\"0000\"; a:='0'; state:=left; end if; end if;

when left=>if a='0' then th:=\"0001\";tl:=\"1001\"; a:='1';

g<='0';r<='0';y<='0';l<='1'; else

if not (th=\"0000\" and tl=\"0001\") then

if tl=\"0000\" then tl:=\"1001\"; th:=th-1; else tl:=tl-1; end if; else

th:=\"0000\";tl:=\"0000\"; a:='0';

state:=yellow; end if; end if;

when yellow=>if a='0' then th:=\"0000\";tl:=\"0100\"; a:='1';

g<='0';r<='0';y<='1';l<='0'; else

if not (tl=\"0001\") then tl:=tl-1; else

tl:=\"0000\"; a:='0'; state:=red; end if; end if;

when others=>state:=red; a:='0';

Administrator

Page 18 4/28/2013 - 18 -2

end case; end if; end if; timh<=th; timl<=tl; end process; end com_arc;

因篇幅问题不能全部显示,请点此查看更多更全内容

Top