EDA实验报告.docx
- 文档编号:25955410
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:22
- 大小:132.87KB
EDA实验报告.docx
《EDA实验报告.docx》由会员分享,可在线阅读,更多相关《EDA实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
EDA实验报告
综合实验一:
交通灯可控制器的设计
一,实验原理分析
例如交通等控制器用于下图所示的一个十字路口,东西为主干道,南北为支干道。
东西主干道处于常允许通行状态,而南北支路在有车时才允许通行。
当东西主干道允许通行亮绿灯时,南北支路亮红灯,而东西主干道亮红灯时,南北两绿灯。
当东西主干道,南北支干道均有车时,两者交替允许通行,东西主干道和南北支干道每次放行30秒,在每次由绿灯变向红灯时,要亮4秒的黄灯作为过渡。
南北支路
东西主干道东西主干道
南北支路
十字路口交通灯有四种工作状态:
“东西主干道绿灯,南北支路红灯;东西主干道黄灯,南北支路亮红灯;东西主干路亮红灯,南北支路亮绿灯;东西主干路亮红灯,南北支路亮黄灯”,规定‘1’表示灯亮,“0”表示灯灭,东西主干路和南北支路均设置了车辆指示器,及传感器,有车时指示器为高电平,无车时为低电平,设计的控制器用4中状态编码,00,01,10,11来表示,并对应为:
S0,S1,S2,S3表示,如下表:
交通灯状态转换表
控制器状态
东西主干道
南北支路
东西主干路车辆指示器
南北支路车辆指示器
红
黄
绿
红
黄
绿
S0
0
0
1
1
0
0
1
1
1
0
S1
0
1
0
1
0
0
S2
1
0
0
0
0
1
1
0
1
0
S3
1
0
0
0
0
1
当状态为S0时,如果东西主干道和南北之路同时有车时,要优先东西主干路的车辆通行30秒,30秒结束后,东西主干路黄灯再亮4秒作为过渡,此后南北之路才允许车辆通行,如果东西主干道有车,则允许东西主干路车辆通行,如果东西主干道车辆无车,南北支路上有车,则状态有S0想S1跳转。
当状态为S1时,东西主干道黄灯量4秒作为过渡,以保证东西主干路车辆通行完毕。
当状态为S2时,如果东西主干道和南北之路都有车时,可以让南北支路车辆通行30秒,30秒结束后,之路黄灯再亮4秒过渡,此后东西主干道才允许车辆通行,如果只有南北支路有车,则允许南北之路车辆通行,若南北支路无车,东西主干路上又有车,则由S2向S3跳转。
当状态为S3时,南北黄灯量6秒作为过渡,以保证南北之路车辆通行完毕。
二,完整程序
libraryieee;
useieee.std_logic_1164.all;
entitytraffic_ctrlis---------------------------实体
port(clk:
instd_logic;-------------------------端口定义
sense0,sense1:
instd_logic;-----------sense0支路监测,sense1主干道监测
counter:
outintegerrange0to29;----------------计时
r0,y0,g0:
outstd_logic;------------------------------南北之路红黄绿灯
r1,y1,g1:
outstd_logic);------------------------------东西主干道红黄绿灯
end;
architectureartoftraffic_ctrlis---------------------------结构体
signalstate:
std_logic_vector(1downto0);---------------------状态
signalcnt:
integerrange0to29;
begin
process(clk)
variablenclr,en:
bit;
begin
ifclk'eventandclk='1'then
ifnclr='0'then
cnt<=0;
elsifen='0'then
cnt<=cnt;
else
cnt<=cnt+1;
endif;
casestateis
when"00"=>r0<='1';y0<='0';g0<='0';r1<='0';y1<='0';g1<='1';-----状态0及其装换
if(sense0andsense1)='1'then
ifcnt=29then
state<="01";nclr:
='0';en:
='0';
else
state<="00";nclr:
='1';en:
='1';
endif;
elsif(sense0and(notsense1))='1'then
state<="01";nclr:
='0';en:
='0';
else
state<="00";nclr:
='1';en:
='1';
endif;
when"01"=>r0<='1';y0<='0';g0<='0';r1<='0';y1<='1';g1<='0';-----------状态1及其转换
ifcnt=3then
state<="10";nclr:
='0';en:
='0';
else
state<="01";nclr:
='1';en:
='1';
endif;
when"10"=>r0<='0';y0<='0';g0<='1';r1<='1';y1<='0';g1<='0';--------状态2及其装换
if(sense0andsense1)='1'then
ifcnt=29then
state<="11";nclr:
='0';en:
='0';
else
state<="10";nclr:
='1';en:
='1';
endif;
elsifsense0='0'then
state<="11";nclr:
='0';en:
='0';
else
state<="10";nclr:
='1';en:
='1';
endif;
when"11"=>r0<='0';y0<='1';g0<='0';r1<='1';y1<='0';g1<='0';------状态3及其装换
ifcnt=3then
state<="00";nclr:
='0';en:
='0';
else
state<="11";nclr:
='1';en:
='1';
endif;
endcase;
endif;
endprocess;
counter<=cnt;
endart;
三,实验原理图
四,实验仿真图(功能仿真)
五,实验总结
由于这个实验有状态机做的相对比较简便,只要把思路理顺之后,程序的编写就相对简单,值得一提的是对于仿真来讲,如果用时序仿真来做,则效果不是很理想,与是用功能仿真来做则符合实际设计的结果,在板子上实验之后,功能完全能够实现。
在这一点上,疑问还是比较大。
由于这个实验比较简单,我有做了时钟的实验。
六,参考文献
1,EDA技术与应用机械出版社
2,EDA技术实用教程潘松黄继业科学出版社
3,VHDL电路设计清华大学出版社
综合实验二,多功能数字钟
一,实验要求以及实验原理分析。
实验要求:
设计一个带闹钟功能的24小时数字钟
它包括以下几个组成部分:
①显示屏,由4个七段数码管组成,用于显示当前时间(时:
分)或设置的闹钟时间;
②数字键‘0’~‘9’,用于输入新的时间或新的闹钟时间;
③TIME(时间)键,用于确定新的时间设置;
④ALARM(闹钟)键,用于确定新的闹钟时间设置,或显示已设置的闹钟时间;
⑤扬声器,在当前时钟时间与闹钟时间相同时,发出蜂鸣声。
发挥部分
(1)设置新的闹钟时间:
用户用数字键“0”~“9”输入新的时间,然后按“ALARM”键确认。
(2)显示所设置的闹钟时间:
在正常计时显示状态下,用户直接按下“ALARM”键,则已设置的闹钟时间将显示在显示屏上。
原理分析:
由老师给的要求可以分析出该实验主要包括一下几个方面的部分:
(1)时、分、秒计数器。
(2)译码电路:
将计数器的结果进行十进制—LED显示码译码,然后送入LED显示。
(3)显示电路:
用两位LED显示十进制结果。
(4)闹时电路:
取1KHz音频信号以及来自秒计数器、分计数器、时计数的输出信号作为闹时电路的输入。
当按下闹时设置按键后,将一个闹时数据存入触发器内。
时钟正常运行时,D触发器内存的闹时时间与正在运行的时间作比较,当比较结果相同时,输
出一个启动信号触发一分钟闹时电路工作,输出音频信号。
多功能数字钟基本框图
Reset
clk
调时
调分时间显示输出
调秒
蜂鸣器输出
reset
clk
二,完整程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityszzis
port(clk:
instd_logic;--------------各类端口定义,clk为蜂鸣器的时钟
clk1:
instd_logic;--------------计时器时钟
md1:
instd_logic;
md2:
instd_logic_vector(1downto0);
speak:
outstd_logic;
dout:
outstd_logic_vector(6downto0);
selout:
outstd_logic_vector(2downto0));
endszz;
architectureoneofszzis
signalsel:
std_logic_vector(2downto0);
signalhou1:
std_logic_vector(3downto0);
signalhou2:
std_logic_vector(3downto0);
signalmin1:
std_logic_vector(3downto0);
signalmin2:
std_logic_vector(3downto0);
signalseth1:
std_logic_vector(3downto0);
signalseth2:
std_logic_vector(3downto0);
signalsetm1:
std_logic_vector(3downto0);
signalsetm2:
std_logic_vector(3downto0);
signalsec1:
std_logic_vector(3downto0);
signalsec2:
std_logic_vector(3downto0);
signalh1:
std_logic_vector(3downto0);
signalh2:
std_logic_vector(3downto0);
signalm1:
std_logic_vector(3downto0);
signalm2:
std_logic_vector(3downto0);
signals1:
std_logic_vector(3downto0);
signals2:
std_logic_vector(3downto0);
-------------------------------------------------
begin
----------------------------------------------模6计数
choice:
process(clk1)
begin
ifclk1'eventandclk1='1'then
ifsel="101"then
sel<="000";
else
sel<=sel+1;
endif;
endif;
endprocesschoice;
-----------------------------------------------小时十位
h110:
process(clk,hou2,min1,min2,sec1,sec2,md1,md2)
begin
ifclk'eventandclk='1'then
if(hou1="0010"andhou2="0011")and(min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001")then
hou1<="0000";
elsifhou1="0010"andhou2="0011"andmd1='0'andmd2="01"then--------------------当时间为23点且处于校时状态时
hou1<="0000";
elsif(hou2="1001"and(min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001"))or(hou2="1001"andmd1='0'andmd2="01")then
hou1<=hou1+1;
endif;
endif;
endprocessh110;
-----------------------------------------------小时个位
h220:
process(clk,min1,min2,sec1,sec2,md1,md2,hou1)
begin
ifclk'eventandclk='1'then
if(hou1="0010"andhou2="0011")and(min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001")then
hou2<="0000";
elsifhou2="1001"and(min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001")then
hou2<="0000";
elsif(hou2="1001"andmd1='0'andmd2="01")or(hou1="0010"andhou2="0011")then
hou2<="0000";--md<='1';
elsif((min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001"))or(md1='0'andmd2="01")then
hou2<=hou2+1;--speak<=clk;
endif;
endif;
endprocessh220;
-----------------------------------------------分钟十位
m110:
process(clk,min2,sec1,sec2,md1,md2)
begin
ifclk'eventandclk='1'then
if(min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001")then
min1<="0000";
elsifmin1="0101"andmin2="1001"and(md1='0'andmd2="00")then
min1<="0000";
elsif(min2="1001"and(sec1="0101"andsec2="1001"))or(min2="1001"andmd1='0'andmd2="00")then
min1<=min1+1;
endif;
endif;--endif;
endprocessm110;
----------------------------------------------分钟个位
m220:
process(clk,sec1,sec2,md1,md2)
begin
ifclk'eventandclk='1'then
ifmin2="1001"and(sec1="0101"andsec2="1001")then
min2<="0000";
elsifmin2="1001"and(md1='0'andmd2="00")then
min2<="0000";
elseif(sec1="0101"andsec2="1001")or(md1='0'andmd2="00")then
min2<=min2+1;
endif;
endif;endif;
endprocessm220;
---------------------------------------------秒十位
s110:
process(clk)
begin
ifclk'eventandclk='1'then
if(sec1="0101"andsec2="1001")then
sec1<="0000";
elseifsec2="1001"then
sec1<=sec1+1;
endif;
endif;endif;
endprocesss110;
--------------------------------------------秒个位
s220:
process(clk)
begin
ifclk'eventandclk='1'then
ifsec2="1001"then
sec2<="0000";
elsesec2<=sec2+1;
endif;
endif;
endprocesss220;
-------------------------------------------时间设置小时部分
sethour1:
process(clk,seth2)
begin
ifclk'eventandclk='1'then
ifseth1="0010"andseth2="0011"then
seth1<="0000";
elsifseth2="1001"then
seth1<=seth1+1;
endif;
endif;
endprocesssethour1;
-------------------------------------------
sethour2:
process(clk,md1,md2,seth1)
begin
ifclk'eventandclk='1'then
if(seth1="0010"andseth2="0011")orseth2="1001"then
seth2<="0000";
elsifmd1='1'andmd2="00"then
seth2<=seth2+1;
endif;
endif;
endprocesssethour2;
-------------------------------------------时间设置分钟部分
setmin1:
process(clk,setm2)
begin
ifclk'eventandclk='1'then
ifsetm1="0101"andsetm2="1001"then
setm1<="0000";
elsifsetm2="1001"then
setm1<=setm1+1;
endif;
endif;
endprocesssetmin1;
----------------------------------------------
setmin2:
process(clk,md1,md2)
begin
ifclk'eventandclk='1'then
ifsetm2="1001"then
setm2<="0000";
elsifmd1='1'andmd2="01"then
setm2<=setm2+1;
endif;
endif;
endprocesssetmin2;
--------------------------------------------
--------------------------------------------闹铃
speaker:
process(clk1,hou1,hou2,min1,min2)
begin
ifclk1'eventandclk1='1'then
ifseth1=hou1andseth2=hou2andsetm1=min1andsetm2=min2then
speak<=clk1;
elsespeak<='0';
endif;
endif;
endprocessspeaker;
-------------------------------------------
-------------------------------------------
disp:
process(sel,md1,hou1,hou2,min1,min2,sec1,sec2,seth1,seth2,setm1,setm2)
begin
ifsel="000"then
selout<="000";
caseh1is
when"0000"=>dout<="0111111";
when"0001"=>dout<="0000110";
when"0010"=>dout<="1011011";
whenothers=>dout<="1000000";
endcase;
elsifsel="001"then
selout<="001";
caseh2is
when"0000"=>dout<="0111111";
when"0001"=>dout<="0000110";
when"0010"=>dout<="1011011";
when"0011"=>dout<="1001111";
when"0100"=>dout<="1100110";
when"0101"=>dout<="1101101";
when"0110"=>dout<="1111101";
when"0111"=>dout<="0000111";
when"1000"=>dout<="1111111";
when
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 实验 报告