eda实验报告西电.docx
《eda实验报告西电.docx》由会员分享,可在线阅读,更多相关《eda实验报告西电.docx(14页珍藏版)》请在冰豆网上搜索。
eda实验报告西电
《数字逻辑与系统设计》实验报告
目录
一、设计任务与要求2
二、流程图与示意图3
三、设计思路及原理图4
1、原理图4
2、总体思路4
3、状态转移图5
四、设计实现6
1、程序6
2、仿真波形10
3、引脚分配11
4、程序下载12
五、总结13
一、设计任务与要求
设计一个十字路口交通控制系统,其东西,南北两个方向除了有红、黄、绿灯指示是否允许通行外,还设有时钟,以倒计时方式显示每一路允许通行的时间,绿灯,黄灯,红灯的持续时间分别是40、5和45秒。
当东西或南北两路中任一道上出现特殊情况,例如有消防车,警车要去执行任务,此时交通控制系统应可由交警手动控制立即进入特殊运行状态,即两条道上的所有车辆皆停止通行,红灯全亮,时钟停止计时,且其数字在闪烁。
当特殊运行状态结束后,管理系统恢复原来的状态,继续正常运行。
二、流程图与示意图
三、设计思路及原理图
1、原理图
2、总体思路
本设计主要有两种模块,一种控制红黄绿灯的变化,数目为1,即JiaoTongDeng。
另一种控制各种颜色灯的倒计时计数显示,数目为2个分别m45和m45_2。
时钟接入实验箱上所提供的1Hz外部时钟。
其中灯的控制模块采用VHDL设计,分为计数、状态转移和输出三个进程。
其中5个状态分别为:
S4:
1红亮1红亮(紧急)
S0:
1绿亮2红亮(40s)
S1:
1黄亮2红亮(5s)
S2:
1红亮2绿亮(40s)
S3:
1红亮2黄亮(5s)
使能位为1时,灯在S0-S3之间转移;使能位为0时,即紧急状态时,状态转为S4,同时程序保存此时的状态,待紧急状态解除后,恢复进入紧急状态时的状态。
M45计数器模块负责控制两个倒数计时器的工作,用VHDL实现。
原理为每个方向的交通灯计时为三个状态绿(40s)→黄(5s)→红(45s)循环。
所以在内部用状态的转移为计数器分别循环置数为39、4、44。
实现循环计数39~0、4~0、44~0。
本设计中两个M45计数器的区别仅在于一个从绿灯状态开始,一个从红灯状态开始,由于状态为循环,所以其他部分相同。
进入紧急状态时,两路都为红灯闪烁,同时计数器在“00”和”FF”两个状态闪烁。
推出紧急状态后,恢复进入紧急状态时的状态和计数。
状态的恢复通过临时储存状态的两个变量tempL和tempH实现。
具体实现见代码。
3、状态转移图
四、设计实现
1、程序
------------------------JiaoTongDeng.vhd------------------------
-------------------用于实现红黄绿灯的控制-----------------
libraryieee;
useieee.std_logic_unsigned.all;
useieee.std_logic_1164.all;
entityJiaoTongDengis
port(
clk:
instd_logic;
en:
instd_logic;
red1,red2:
outstd_logic;
yellow1,yellow2:
outstd_logic;
green1,green2:
outstd_logic
);
endJiaoTongDeng;
architectureoneofJiaoTongDengis
typestateis(s0,s1,s2,s3,s4);--5个状态
signalstate_now:
state:
=s0;--当前状态,初始化为s0
signalcount:
integer:
=0;--计数变量
begin
--计数进程
counter:
process(clk)begin
if(clk'eventandclk='1')then–时钟上升沿
if(en='1')then
if(count<90)then--实现1-90循环模90计数
count<=count+1;
else
count<=1;
endif;
endif;
endif;
endprocess;
--状态转移进程
state_trans:
process(count)begin
if(clk'eventandclk='1')then
casestate_nowis--根据当前状态按顺序进行转换,en为0时进入紧急
whens0=>
if(en='1')then
if(count>39)then
state_now<=s1;
endif;
else
state_now<=s4;
endif;
whens1=>
if(en='1')then
if(count>44)then
state_now<=s2;
endif;
else
state_now<=s4;
endif;
whens2=>
if(en='1')then
if(count>84)then
state_now<=s3;
endif;
else
state_now<=s4;
endif;
whens3=>
if(en='1')then
if(count>89)then
state_now<=s0;
endif;
else
state_now<=s4;
endif;
whens4=>
if(en='1')then
if(count<39)then
state_now<=s0;
elsif(count<44)then
state_now<=s1;
elsif(count<84)then
state_now<=s2;
elsif(count<89)then
state_now<=s3;
endif;
else
state_now<=s4;
endif;
endcase;
endif;
endprocess;
--output进程把对应状态的绿红黄灯输出
output:
process(clk)begin
casestate_nowis
whens0=>
red1<='0';red2<='1';
green1<='1';green2<='0';
yellow1<='0';yellow2<='0';
whens1=>
red1<='0';red2<='1';
green1<='0';green2<='0';
yellow1<='1';yellow2<='0';
whens2=>
red1<='1';red2<='0';
green1<='0';green2<='1';
yellow1<='0';yellow2<='0';
whens3=>
red1<='1';red2<='0';
green1<='0';green2<='0';
yellow1<='0';yellow2<='1';
whens4=>
red1<='1';red2<='1';
green1<='0';green2<='0';
yellow1<='0';yellow2<='0';
endcase;
endprocess;
endone;
-------------------------------m45.vhd------------------------------
-------------用于实现单方向的计数器显示控制-----------
libraryieee;
useieee.std_logic_unsigned.all;
useieee.std_logic_1164.all;
entitym45is
port(
clk:
instd_logic;
en:
instd_logic;
numH,numL:
outstd_logic_vector(3downto0)
);
endm45;
architectureoneofm45is
signaltempL,tempH:
std_logic_vector(3downto0);--紧急状态时储存当前状态
signalcountL:
std_logic_vector(3downto0):
="0000";
signalcountH:
std_logic_vector(3downto0):
="0000";
signalflag:
std_logic:
='0';--是否为紧急状态标志
signalyellow_flag:
std_logic_vector(1downto0):
="00";--用于记录状态
--另一程序m45_2.vhd仅在此处的初始化不一样,为“10”,其他代码相同
begin
process(clk)begin
if(clk'eventandclk='1')then
if(en='1')then--判断是否紧急,1为正常状态
if(flag='1')then
--若flag为1,说明刚刚恢复正常,需要从tempL和tempH恢复
flag<='0';
if(tempL="0000")then
countL<="0100";
else
countL<=tempL-1;
endif;
countH<=tempH;
elsif(countL=0andcountH=0)then
--若高地位都变为0,则进行下一个状态的置数
if(yellow_flag="00")then—绿灯,置数39
countL<="1001";
countH<="0011";
yellow_flag<="01";
elsif(yellow_flag="01")then—黄灯,置数4
countL<="0100";
countH<="0000";
yellow_flag<="10";
else—红灯,置数44
countL<="0100";
countH<="0100";
yellow_flag<="00";
endif;
elsif(countL=0)then--仅低位到0,高位减1,低位置为9
countL<="1001";
countH<=countH-1;
else
countL<=countL-1;
endif;
elsif(en='0')then--en若为0,则为紧急状态
if(flag='0')then--flag为0则刚转入紧急状态,保存进入前状态
flag<='1';
tempL<=countL;
tempH<=countH;
countL<="0000";
countH<="0000";
else--flag为1则数码管在”00”和”FF”间闪烁
countL<=notcountL;--进行取反操作即可
countH<=notcountH;
endif;
endif;
endif;
endprocess;
numL<=countL;
numH<=countH;
endone;
2、仿真波形
正常情况下
进入紧急状态与恢复正常状态
3、引脚分配
4、程序下载
1、按引脚分配将所用引脚与对应输出连接起来。
2、连接下载器,选择Tools-Programmer,在HardwareSetup中指定好下载器,然后点击Start下载。
3、下载成功后,观察程序实际运行情况。
五、总结
根据仿真与实际下载观察,本实验设计的十字路口交通灯自动控制器设计运行良好,能够实现东西,南北两个方向红、黄、绿灯以及时钟倒计时的控制。