EDA报告.docx
《EDA报告.docx》由会员分享,可在线阅读,更多相关《EDA报告.docx(13页珍藏版)》请在冰豆网上搜索。
![EDA报告.docx](https://file1.bdocx.com/fileroot1/2023-1/4/61431da9-9ce3-48dc-9884-4e535f9aa589/61431da9-9ce3-48dc-9884-4e535f9aa5891.gif)
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