EDA报告.docx

上传人:b****6 文档编号:6184275 上传时间:2023-01-04 格式:DOCX 页数:13 大小:212.04KB
下载 相关 举报
EDA报告.docx_第1页
第1页 / 共13页
EDA报告.docx_第2页
第2页 / 共13页
EDA报告.docx_第3页
第3页 / 共13页
EDA报告.docx_第4页
第4页 / 共13页
EDA报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

EDA报告.docx

《EDA报告.docx》由会员分享,可在线阅读,更多相关《EDA报告.docx(13页珍藏版)》请在冰豆网上搜索。

EDA报告.docx

EDA报告

交通控制器设计实验

一、实验目的

1、了解交通灯的亮灭规律。

2、了解交通灯控制器的工作原理。

3、进一步熟悉VHDL语言编程,了解实际设计中的优化方案。

二、实验任务

设计一个十字路口交通控制系统,其东西,南北两个方向除了有红、黄、绿灯指示是否允许通行外,还设有时钟,以倒计时方式显示每一路允许通行的时间,绿灯,黄灯,红灯的持续时间分别是40、5和45秒。

当东西或南北两路中任一道上出现特殊情况,例如有消防车,警车要去执行任务,此时交通控制系统应可由交警手动控制立即进入特殊运行状态,即两条道上的所有车辆皆停止通行,红灯全亮,时钟停止计时,且其数字在闪烁。

当特殊运行状态结束后,管理系统恢复原来的状态,继续正常运行。

三、原理分析

本系统主要由计数控制器和倒计时显示器电路组成。

计数控制器实现总共90秒的计数,90秒也是交通控制系统的一个大循环;控制器控制系统的状态转移和红黄绿灯的信号输出;倒计时显示器电路实现45秒倒计时和显示功能。

整个系统的工作时序受控制器控制,它是系统的核心。

控制器的整个工作过程用状态机进行描述,其状态转移关系如下图所示。

五种状态描述如下:

s0:

东西方向红灯亮,南北方向绿灯亮,此状态持续40秒的时间;

s1:

东西方向红灯亮,南北方向黄灯亮,此状态持续5秒的时间;

s2:

东西方向绿灯亮,南北方向红灯亮,此状态持续40秒的时间;

s3:

东西方向黄灯亮,南北方向红灯亮,此状态持续5秒的时间;

s4:

紧急制动状态,东西方向红灯亮,南北方向红灯亮,当紧急制动信号有效(hold=’0’)时进入这种状态。

当紧急制动信号无效(hold=’1’)时,状态机按照s0→s1→s2→s3→s0循环;当紧急制动有效(hold=’0’)时,状态机立即进入s4,两个方向红灯全亮,计数器停止计数;当紧急制动信号再恢复无效时,状态机会回到原来的状态继续执行。

四、电路设计

(1)分频器

分频器实现的是将高频时钟信号转换成底频的时钟信号,用于触发控制器、计数器和扫描显示电路。

该分频器实现的是一千分频,将一千赫兹的时钟信号分频成一赫兹的时钟信号。

(2)控制器设计

控制器的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的分位译码电路。

此外,当检测到特殊情况(HOLD=‘1’)发生时,无条件点亮红灯的二极管。

本控制器可以有两种设计方法,一种是利用时钟烟的下降沿读取前级计数器的计数值,然后作出反应;另一种则是将本模块设计成纯组合逻辑电路,不需要时钟驱动。

这两种方法各有所长,必须根据所用器件的特性进行选择:

比如有些FPGA有丰富的寄存器资源,而且可用与组合逻辑的资源则相对较少,那么使用第一种方法会比较节省资源;而有些CPLD的组合逻辑资源则比较多,用第二种方法可能更好。

(3)计数器设计

这里需要的计数器的计数范围为0-90。

计到90后,下一个时钟沿回复到0,开始下一轮计数。

此外,当检测到特殊情况(HOLD=‘1’)发生是,计数器暂停计数,而系统复位信号RESET则使计数器异步清零。

 

(4)分位译码电路设计--1

因为控制器输出的到计时数值可能是1位或者2位十进制数,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位的十进制数,如25分为2和5,7分为0和7)。

与控制器一样,分位电路同样可以由时钟驱动,也可以设计成纯组合逻辑电路。

控制器中,引入了寄存器。

为了让读者开拓眼界,分位电路就用组合逻辑电路实现。

 

(5)分位译码电路设计—2

 

(6)数码管驱动设计

串行连接,即每个数码管对应的引脚都接在一起(如每个数码管的a引脚都接到一起,然后再接到CPLD/FPGA上的一个引脚上),通过控制公共端为高电平控制相应数码管的亮、灭(共阴极数码管的公共端为高电平时,LED不亮;共阳极的公共端为低电平时,LED不亮)。

串行法的优点在于消耗的系统资源少,占用的I/O口少,N个数码管只需要(7+N)个引脚(如果需要小数点,则是(8+N)个引脚)。

其缺点是控制起来不如并行法容易。

(7)下图为交通灯控制器的顶层文件连接图

五、程序设计

(1)分频器的设计

LIBRARYIEEE;

USEIEEE.Std_Logic_1164.ALL;

ENTITYFreDeviderIS

PORT

(Clkin:

INStd_Logic;

Clkout:

OUTStd_Logic);

END;

ARCHITECTUREDeviderOFFreDeviderIS

CONSTANTN:

Integer:

=499;

signalcounter:

Integerrange0toN;

signalClk:

Std_Logic;

BEGIN

PROCESS(Clkin)

begin

IFrising_edge(Clkin)THEN

IFCounter=Nthen

counter<=0;

Clk<=notclk;

else

counter<=counter+1;

endif;

endif;

endprocess;

clkout<=clk;

end;

(2)控制设计

控制器的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段译管的分译码电路。

此外,当检测到特殊情况(Hold=‘1’)发生时,无条件点亮红色的发光二极管。

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYcountrollerIS

PORT(Clock:

INSTD_LOGIC;

Hold:

instd_logic;

CountNum:

inINTEGERRANGE0TO89;

NumA,NumB:

outINTEGERRANGE0TO45;

RedA,GreenA,YellowA:

outstd_logic;

RedB,GreenB,YellowB:

outstd_logic);

END;

ARCHITECTUREbehaviorOFCountrollerIS

BEGIN

process(Clock)

BEGIN

IFfalling_edge(Clock)THEN

IFHold='1'THEN

RedA<='1';

RedB<='1';

GreenA<='0';

GreenA<='0';

YellowA<='0';

YellowB<='0';

ELSIFCountNum<=39THEN

NumA<=40-CountNum;

RedA<='0';

GreenA<='1';

YellowA<='0';

ELSIFCountNum<=44THEN

NumA<=45-CountNum;

RedA<='0';

GreenA<='0';

YellowA<='1';

ELSE

NumA<=90-CountNum;

RedA<='1';

GreenA<='0';

YellowA<='0';

ENDIF;

IFCountNum<=44THEN

NumB<=45-CountNum;

RedB<='1';

GreenB<='0';

YellowB<='0';

ELSIFCountNum<=84THEN

NumB<=85-CountNum;

RedB<='0';

GreenB<='1';

YellowB<='0';

ELSe

NumB<=90-CountNum;

RedB<='0';

GreenB<='0';

YellowB<='1';

ENDIF;

ENDIF;

ENDPROCESS;

END;

(3)计数器的设计

这里计数器的计数范围为0—45S。

计到45后,下一个时钟沿回复到0,开始下一轮计数.此外,当检测到特殊情况(Hold=‘1‘)发生时,计数器暂停计数,而系统复位号Reset则使计数器异步清0。

程序如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYcounterIS

PORT(clock:

INSTD_LOGIC;

reset:

instd_logic;

Hold:

instd_logic;

countNum:

BuFFeRINTEGERRANGE0TO90);

END;

ARCHITECTUREbehaviorOFcounterIS

BEGIN

process(reset,Clock)

BEGIN

IFReset='1'THEN

countNum<=0;

ELSIFrising_edge(Clock)THEN

IFHold='1'then

countNum<=countNum;

ELSE

IFcountNum=90THEN

countNum<=0;

ELSE

countNum<=countNum+1;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

END;

(4)分位译码电路设计--1

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYFenweiIS

PORT

(Numin:

INintegerRANGE0TO45;

NumA,NumB:

OUTIntegerRANGE0to9

);

END;

ARCHITECTUREbehaviorOFFenweiIS

BEGIN

process(Numin)

BEGIN

IFNumin>=40THEN

NumA<=4;

NumB<=Numin-40;

ELSIFNumin>=30THEN

NumA<=3;

NumB<=Numin-30;

ELSIFNumin>=20THEN

NumA<=2;

NumB<=Numin-20;

ELSIFNumin>=10THEN

NumA<=1;

NumB<=Numin-10;

ELSE

NumA<=0;

NumB<=Numin;

ENDIF;

ENDPROCESS;

END;

(5)分位译码电路设计—2

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYFenwei2IS

PORT

(Numin:

INintegerRANGE0TO45;

NumC,NumD:

OUTIntegerRANGE0to9

);

END;

ARCHITECTUREbehaviorOFFenwei2IS

BEGIN

process(Numin)

BEGIN

IFNumin>=40THEN

NumC<=4;

NumD<=Numin-40;

ELSIFNumin>=30THEN

NumC<=3;

NumD<=Numin-30;

ELSIFNumin>=20THEN

NumC<=2;

NumD<=Numin-20;

ELSIFNumin>=10THEN

NumC<=1;

NumD<=Numin-10;

ELSE

NumC<=0;

NumD<=Numin;

ENDIF;

ENDPROCESS;

END;

(6)数码管驱动设计

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYbcd_dataIS

PORT

(bcd_data:

inSTD_LOGIC_VECTOR(3downto0);

segout:

outSTD_LOGIC_VECTOR(6downto0)

);

END;

ARCHITECTUREbehaviorOFbcd_dataIS

BEGIN

process(bcd_data)

BEGIN

casebcd_datais

when"0000"=>segout<="1111110";

when"0001"=>segout<="0110000";

when"0010"=>segout<="1101101";

when"0011"=>segout<="1111001";

when"0100"=>segout<="0110011";

when"0101"=>segout<="1011011";

when"0110"=>segout<="0011111";

when"0111"=>segout<="1110000";

when"1000"=>segout<="1111111";

when"1001"=>segout<="1110011";

whenothers=>null;

ENDCASE;

ENDPROCESS;

END;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_unsigned.ALL;

ENTITYdtsmIS

PORT(clk:

inSTD_LOGIC;

NumA,NumB,NumC,NumD:

inSTD_LOGIC_VECTOR(3downto0);

segout1:

outSTD_LOGIC_VECTOR(6downto0);

led_sel:

outSTD_LOGIC_VECTOR(3downto0));

ENDdtsm;

architecturebhvofdtsmis

componentbcd_datais

port(bcd_data:

inSTD_LOGIC_VECTOR(3downto0);

segout:

outSTD_LOGIC_VECTOR(6downto0));

endcomponent;

signalx:

STD_LOGIC_VECTOR(3downto0);

signalq:

STD_LOGIC_VECTOR(1downto0);

begin

p1:

process(clk)

begin

ifclk'eventandclk='1'then

Q<=Q+'1';

endif;

endprocess;

p2:

process(Q)

begin

caseQis

when"00"=>led_sel<="1110";x<=NumD;

when"01"=>led_sel<="1101";x<=NumC;

when"10"=>led_sel<="1011";x<=NumB;

when"11"=>led_sel<="0111";x<=NumA;

whenothers=>null;

endcase;

endprocess;

u1:

bcd_dataPORTmap(bcd_data=>x,segout=>segout1);

end

 

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

当前位置:首页 > 表格模板 > 合同协议

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

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