EDA交通灯课程设计带有测试平台testbench精讲.docx

上传人:b****5 文档编号:12388477 上传时间:2023-04-18 格式:DOCX 页数:25 大小:1.60MB
下载 相关 举报
EDA交通灯课程设计带有测试平台testbench精讲.docx_第1页
第1页 / 共25页
EDA交通灯课程设计带有测试平台testbench精讲.docx_第2页
第2页 / 共25页
EDA交通灯课程设计带有测试平台testbench精讲.docx_第3页
第3页 / 共25页
EDA交通灯课程设计带有测试平台testbench精讲.docx_第4页
第4页 / 共25页
EDA交通灯课程设计带有测试平台testbench精讲.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

EDA交通灯课程设计带有测试平台testbench精讲.docx

《EDA交通灯课程设计带有测试平台testbench精讲.docx》由会员分享,可在线阅读,更多相关《EDA交通灯课程设计带有测试平台testbench精讲.docx(25页珍藏版)》请在冰豆网上搜索。

EDA交通灯课程设计带有测试平台testbench精讲.docx

EDA交通灯课程设计带有测试平台testbench精讲

 

EDA技术课程设计

十字路口交通灯控制器设计

 

学院

电气与信息工程

专 业

电子信息工程

班  级

0934111

课程名称

EDA技术

学号

0934111**

姓名

*俊豪

指导教师

***

 

成绩评定·

一、指导教师评语(根据学生设计报告质量、答辩情况及其平时表现综合评定)。

 

二、评分

评分项目

设计报告评分

答辩评分

平时表现评分

合计

(100分)

任务完成

情况

(20分)

课程设计

报告质量

(40分)

表达情况

(10分)

回答问题

情况

(10分)

工作态度与纪律

(10分)

独立工作

能力

(10分)

得分

 

课程设计成绩评定

班级0934111姓名学号0934111

 

成绩:

分(折合等级)

 

指导教师签字年月日

 

前言

伴随着社会的发展以及人类生活水平的提高,EDA技术在电子信息、通信、自动、控制及计算机应用等领域的重要性日益突出。

随着技术市场与人才市场对DEA需求的不断增加,交通的问题日益突出,单单依靠人力来指挥交通已经不可行了,所以设计交通灯来完成这个需求就显的越加迫切了。

为了确保十字路口的行人和车辆顺利、畅通地通过,往往采用电子控制的交通信号来进行指挥。

以下就是运用数字电子设计出的交通灯:

其中红灯亮,表示该条路禁止通行;黄灯亮表示停车;绿灯亮表示允许通行。

一、设计题目

十字路口交通灯控制器设计。

二、设计任务和要求

用EDA技术设计一个十字路口的交通信号灯控制器,控制A、B两条交叉道路上的车辆通行,具体要求如下:

设计一个十字路口交通信号管理控制器。

对于每个路口,可实现直行、停止、左转指示,并显示当前状态剩余时间

1.每个方向有直行红灯、直行绿灯、停行黄灯和左转绿灯共4个LED指示灯组成;

2.每个方向用两位数码管显示当前状态剩余时间;

3.系统复位后进入东西直行,南北禁行状态;

4.直行状态最后3秒内,绿灯闪烁状态;

三、EDA设计

由于本设计实验的功能较多,所以就采用模块化设计。

整个程序设计基于8种状态,如下表所示:

交通灯状态转换表

状态S

S1

S2

S3

S4

S5

S6

S7

S0

A方向

左拐a1

黄灯ay

绿灯ag

黄灯ay

红灯ar

红灯ar

红灯ar

红灯ar

亮灯时间

10s

4s

20s

4s

33

B方向

红灯br

红灯br

红灯br

红灯br

左拐b1

黄灯by

绿灯bg

黄灯by

亮灯时间

38s

10s

4s

15s

4s

注释:

系统复位后进入A方向直行绿灯,B方向直行红灯的状态即S3。

图1A、B方向示意图

图2整体模块示意图

3.1、明确系统的功能,并进行逻辑抽象

如图1本方案可实现在确定时刻,倒计数数字显示能够及时变化,红黄绿灯能准确变化,考虑到实际应用,加入人工监督功能,通过改变频率来控制交通灯亮灭的时间的长短。

本设计采用模块化设计,图2为本设计十字路口交通等系统的层次结构框图。

3.2、模块功能说明

1.主控制模块(kongzhi):

控制系统输入输出之间联系。

2.显示模块(xianshi):

显示倒计时时间和工作状。

其输出用来驱动4位共阴数码管,并显示倒计时时间(动态扫描)。

3.分频模块(fenpin):

本系统动态扫描需要1KHZ的脉冲而系统时钟需要1HZ的脉冲,分频器主要为系统提供所需要的时钟脉冲。

该模块将1KHZ的脉冲信号进行分频,产生周期为1hz的方波,作为系统时钟信号的倒计时闪烁信号。

4.译码模块(yima):

根据控制信号,驱动交通灯即LED的显示。

5.计数模块(jishu):

用来设定A方向和B方向计时器的初值,并为显示模块提供倒计时时间。

6.顶层模块jiaotongdeng,连接各模块设计,使之成为一个有机体。

前5个模块分别进行仿真测试,成功后把所有.vhdl文件包含在工程jiaotongdeng,实现模块化设计。

3.3、波形仿真及分析

3.3.1、代码

见附录一。

3.3.2、各模块rtl电路及功能仿真和时序仿真

各模块分别建立工程文件,并进行功能仿真、时序仿真,前六个模块成功编译,得到正确仿真结果后,建立顶层模块。

模块一:

控制模块(kongzhi)

图3控制模块(kongzhi)rtl图

图4控制模块(kongzhi)仿真图

模块二:

计时模块(jishi)

图5计时模块(jishi)rtl图

图6计时模块(jishi)仿真图

模块三:

显示模块(xianshi)

图7显示模块(xianshi)rtl图

图8显示模块(xianshi)仿真图

模块四:

译码模块(yima)

图9译码模块(yima)rtl图

图10译码模块(yima)仿真图

模块五:

分频模块(fenpin)

图11分频模块(fenpin)rtl图

图12分频模块(fenpin)仿真图

模块六:

顶层模块

图13本设计整体rtl图

四、硬件测试

编程下载和硬件测试的步骤如下:

1、打开下载窗口。

选择菜单“Tool“项的”programmer“,便可打开下载窗口。

2、设置下载电缆。

将ByteBlaster电缆的一端与微机的并行口相连,另一端10针插头与装有目标器件的PCB板上的插座相连。

并在”HardwareSetup”中设置下载电缆。

3、设置JTAG链。

Altera器件基本都支持JTAG在系统编程方式,这种方式简单易行,不需要专门的编程器。

4、选用模式NO.5,分配引脚,并编译后,把生成*.sof文件下载到基于Cyclone型GW48系列FPGA实验箱开发板上,成功查看结果,CLK时钟频率用1Hz,可通过实验箱上“键7”控制Reset全局复位。

五、实验困难问题及解决措施

在实验的过程中,编写主程序的时候,也遇到调试不成功的问题,主要问题如下:

在编写xianshi模块时,最后给输出信号赋值时,使用了进程语句,但是由于敏感列表不全,导致在仿真时其输出信号的值产生错误。

解决措施就是通过逐个查看内部信号,由于敏感列表不全,致使有些时刻,最后赋值的进程语句没有启动,从而造成输出结果不全。

在实现绿灯剩余时间小于三秒时开始闪烁功能时,遇到问题。

具体表现在yima模块中。

开始为了在绿灯状态,使绿灯在高、地电平间变换,所以就尝试使用时钟信号clk的上升沿和下降沿,其中上升沿时,绿灯高电平即亮,下降沿时绿灯熄灭。

虽然这种方案在modelsim中仿真成功,但是在quartus进行综合出现错误,该综合软件综合不出此寄存器。

经过多次试验,使用了clk高低电平触发,不再使用其上升下降沿。

在整个程序中有时在使用IF语句时,会因为考虑不完整造成实验结果出错。

因为在IF语句中如果过没有ELSE语句,那么输出将默认保持前一个状态,这样很容易产生错误。

总之经过查阅各种资料,成功的把程序调试了出来。

在查阅试验箱说明书的情况下,完成了引脚的选定,并把程序下载到了试验箱里面,完成了实物的演示。

 

参考文献

[1]邹彦编.EDA技术与数字系统设计.北京:

电子工业出版社.2007.

[2]潘松,黄继业编.EDA技术与VHDL(第二版).北京:

清华大学出版社.2007.

[3]王锁萍编.电子设计自动化教程.成都:

电子科技大学出版社.2000.

[4]徐志军,徐光辉编.CPLD/FPGA的开发与应用.北京:

电子工业出版社.2002.

[5]杨旭,刘盾等编.EDA技术基础与实验教程.北京:

清华大学出版社.2010.

 

七、附录

附录一:

本系统采用用硬件描述语言VHDL描述。

分为五个模块,分别为控制模块、计时模块、显示模块、译码模块和分频模块,下面针对每个模块给出相应的程序:

模块一:

/*************************控制部分**********************/

/***********定义输入输出端口***********/

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitykongzhiis--实体部分;

port(

clk,clr:

instd_logic;

at,bt:

instd_logic_vector(7downto0);

s:

outstd_logic_vector(2downto0)

);

endkongzhi;

architecturertlofkongzhiis--结构体部分;

signalq:

std_logic_vector(2downto0);

begin

--mainlogic

process(clk,clr,at,bt)

begin

ifclr='1'thenq<="011";--系统复位后,系统的状态是A干道绿灯;

B干道红灯;

elsif(clk'eventandclk='1')then

if(at=x"01")or(bt=x"01")then--倒计时结束时,状态发生改变;

q<=q+1;

elseq<=q;

endif;

endif;

endprocess;

s<=q;

endrtl;

模块二:

/*************************计时部分**********************/

/***********为A,B方向设置初值***********/

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityjishiis--实体部分

port(

clk,clr:

instd_logic;

s:

instd_logic_vector(2downto0);

at,bt:

outstd_logic_vector(7downto0)

);

endjishi;

architecturertlofjishiis--结构体

signalati,bti:

std_logic_vector(7downto0);--中间信号

signalart,agt,alt,abyt:

std_logic_vector(7downto0);

signalbrt,bgt,blt:

std_logic_vector(7downto0);

begin

--mainlogic--每个状态的总时间分别赋给相应的信号;

art<=x"33";--A方向直行红灯总时间为33s;

agt<=x"20";--A方向直行绿灯总时间为20s;

alt<=x"10";--A方向左拐绿灯总时间为4s;

abyt<=x"04";--黄灯总时间为4s;

brt<=x"38";--B方向直行红灯总时间为38s;

bgt<=x"15";--B方向直行绿灯总时间为15s;

blt<=x"04";--B方向左拐绿灯总时间为4s;

process(clk,clr,s)begin

ifclr='1'thenati<=x"33";bti<=x"24";

--系统复位后A方向直行绿灯剩余时间为33s,B方向直行红灯剩余时间为24s;

elsif(clk'eventandclk='1')then

if(ati=x"01")or(bti=x"01")then

casesis--在每个状态,赋给相应初始时间;

when"000"=>ati<=alt;bti<=brt;

when"001"=>ati<=abyt;

when"010"=>ati<=agt;

when"011"=>ati<=abyt;

when"100"=>ati<=art;bti<=blt;

when"101"=>bti<=abyt;

when"110"=>bti<=bgt;

when"111"=>bti<=abyt;

whenothers=>ati<=ati;bti<=bti;

endcase;

endif;

ifati/=x"01"then--当前时间大于1s时,则相应位进行减一;

ifati(3downto0)="0000"then

ati(3downto0)<="1001";--因为总时间使用的是十六进制

ati(7downto4)<=ati(7downto4)-1;

elseati(3downto0)<=ati(3downto0)-1;

ati(7downto4)<=ati(7downto4);

endif;

endif;

ifbti/=x"01"then--当前时间大于1s时,则相应位进行减一;

ifbti(3downto0)="0000"then

bti(3downto0)<="1001";

bti(7downto4)<=bti(7downto4)-1;

elsebti(3downto0)<=bti(3downto0)-1;

bti(7downto4)<=bti(7downto4);

endif;

endif;

endif;

endprocess;

at<=ati;--最后给输出信号赋值;

bt<=bti;

endrtl;

模块三:

/*************************显示部分**********************/

/***********显示倒计时时间和系统工作状态***********/

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityxianshiis--实体部分;

port(

clk1k,clr,clk:

instd_logic;

at,bt:

instd_logic_vector(7downto0);

led:

outstd_logic_vector(6downto0);

sel:

outstd_logic_vector(3downto0)

);

endxianshi;

architecturertlofxianshiis--结构体部分;

signalou:

std_logic_vector(3downto0);

signaldis,ds:

std_logic_vector(7downto0);

signalsl:

std_logic_vector(2downto0):

="000";

signalsq:

std_logic_vector(3downto0):

="0000";

begin

--mainlogic

sl1:

process(clk1k,clr)

begin

ifclr='1'thensl<="000";

elsif(clk1k'eventandclk1k='1')then

ifsl="011"thensl<="000";

elsesl<=sl+1;

endif;

endif;

endprocess;

sq1:

process(sl)--产生位选信号

begin

caseslis

when"000"=>sq<="0001";

when"001"=>sq<="0010";

when"010"=>sq<="0100";

when"011"=>sq<="1000";

whenothers=>null;

endcase;

endprocess;

ou1:

process(sl)--显示时间与位选信号一一对应;

begin

caseslis

when"000"=>ou<=bt(3downto0);--

when"001"=>ou<=bt(7downto4);

when"010"=>ou<=at(3downto0);

when"011"=>ou<=at(7downto4);

whenothers=>ou<=x"0";

endcase;

endprocess;

ds1:

process(ou)begin--将显示时间转换成数码管显示;

caseouis

whenx"0"=>ds<=x"3F";

whenx"1"=>ds<=x"06";

whenx"2"=>ds<=x"5b";

whenx"3"=>ds<=x"4f";

whenx"4"=>ds<=x"66";

whenx"5"=>ds<=x"6d";

whenx"6"=>ds<=x"7d";

whenx"7"=>ds<=x"07";

whenx"8"=>ds<=x"7f";

whenx"9"=>ds<=x"6F";

whenothers=>ds<=x"00";

endcase;

endprocess;

saomiao:

process(clk,ds,clr,sl)–-给输出信号赋值;

begin

ifclr='1'thendis<=ds;

elsifsl<"101"then

ifclk='0'thendis<=ds;--低电平数码管显示时间;

elsedis<=x"00";--高电平数码管全关闭;

endif;

elsedis<=ds;

endif;

endprocess;

led<=dis(6downto0);

sel<=sq;

endrtl;

模块四:

/*************************译码部分**********************/

/***********驱动交通灯的显示***********/

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityyimais--实体部分;

port(

clr,clk:

instd_logic;

at,bt:

instd_logic_vector(7downto0);

s:

instd_logic_vector(2downto0);

abl:

outstd_logic_vector(7downto0)

);

endyima;

architecturertlofyimais--结构体部分;

signallt:

std_logic_vector(7downto0);

signala:

std_logic_vector(7downto0);

signalb:

std_logic_vector(7downto0);

begin

--mainlogic

process(clr,s,clk)--状态S控制着每个方向的LED灯;

begin

ifclr='1'thenlt<="00100001";

endif;

casesis

when"000"=>lt<="00010100";

when"001"=>lt<="10000001";

when"010"=>lt<="01000001";

when"011"=>lt<=a;

when"100"=>lt<="01000001";

when"101"=>lt<="00011000";

when"110"=>lt<="00010100";

when"111"=>lt<=b;

whenothers=>lt<=lt;

endcase;

endprocess;

process(clk,at,bt,s)–绿灯时间小于4秒时,绿灯开始闪烁;

begin

if(s="011")then

ifat

ifclk='1'then

a<="00000001";

elsifclk='0'then

a<="00100001";

endif;

elsea<="00100001";

endif;

elsea<="00100001";

endif;

if(s="111")then

ifbt

ifclk='1'then

b<="00010000";

elsifclk='0'then

b<="00010010";

endif;

elseb<="00010010";

endif;

elseb<="00010010";

endif;

endprocess;

abl<=lt;

endrtl;

模块五:

/*************************分频部分**********************/

/***********为系统提供所需要的时钟脉冲***********/

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityfenpinis--实体部分;

port(

clk1k:

instd_logic;

clk:

outstd_logic

);

endfenpin;

architecturertloffenpinis--结构体部分;

signalfp:

std_logic_vector(9downto0):

="0000000000";

begin

--mainlogic

process(clk1k)

begin

if(clk1k'eventandclk1k='1')

thenfp<=fp+1;--计数

endif;

endprocess;

clk<=fp(9);--29个clk1k周期产生半个周期的clk信号;

endrtl;

顶层文件模块程序:

libraryieee;

useieee.std_logic_1164.all;

entityjiaotongdengis--实体部分;

port(

clk1k,clr:

instd_logic;

shuma:

outst

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

当前位置:首页 > 求职职场 > 简历

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

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