EDA实验交通灯设计报告.docx
《EDA实验交通灯设计报告.docx》由会员分享,可在线阅读,更多相关《EDA实验交通灯设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
EDA实验交通灯设计报告
EDA原理及应用
实验报告
题目:
交通灯控制器
专业:
电子信息工程
班级:
姓名:
学号:
一、设计题目:
交通灯控制器
二、设计目标:
1、 设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。
2、 红、绿、黄发光二极管作信号灯。
3、 主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯。
4、 主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,设立45秒、25秒计时、显示电路。
5、 在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,使行驶中的车辆有时间停到禁行线外,设立5秒计时、显示电路。
三、设计原理:
(含系统总的原理图)
由两个分频器模块,三个计数器模块及它的选择器,一个扫描数码管模块,和一个红绿灯控制模块连接而成。
RTL状态图
四、设计内容:
(含状态转换图、软件流程图、说明文字等,每单独模块的图标和VHDL程序;最后为总体程序框图)
分频器1
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDVFIS
PORT(CLK:
INSTD_LOGIC;
--D:
INSTD_LOGIC_VECTOR(3DOWNTO0);
FOUT:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFDVFIS
SIGNALFULL:
STD_LOGIC;
BEGIN
P_REG:
PROCESS(CLK)
VARIABLECNT8:
INTEGERRANGE48000000DOWNTO0;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCNT8=24000000THEN
CNT8:
=0;
FULL<='1';
ELSECNT8:
=CNT8+1;
FULL<='0';
ENDIF;
ENDIF;
ENDPROCESSP_REG;
P_DIV:
PROCESS(FULL)
VARIABLECNT2:
STD_LOGIC;
BEGIN
IFFULL'EVENTANDFULL='1'THEN
CNT2:
=NOTCNT2;
IFCNT2='1'THENFOUT<='1';ELSEFOUT<='0';
ENDIF;
ENDIF;
ENDPROCESSP_DIV;
END;
说明:
采用的是48M时钟输入,作为后面的时钟信号。
分频器2
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDVF2IS
PORT(CLK:
INSTD_LOGIC;
--D:
INSTD_LOGIC_VECTOR(3DOWNTO0);
FOUT:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFDVF2IS
SIGNALFULL:
STD_LOGIC;
BEGIN
P_REG:
PROCESS(CLK)
VARIABLECNT8:
INTEGERRANGE48000000DOWNTO0;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCNT8=20000THEN
CNT8:
=0;
FULL<='1';
ELSECNT8:
=CNT8+1;
FULL<='0';
ENDIF;
ENDIF;
ENDPROCESSP_REG;
P_DIV:
PROCESS(FULL)
VARIABLECNT2:
STD_LOGIC;
BEGIN
IFFULL'EVENTANDFULL='1'THEN
CNT2:
=NOTCNT2;
IFCNT2='1'THENFOUT<='1';ELSEFOUT<='0';
ENDIF;
ENDIF;
ENDPROCESSP_DIV;
END;
说明:
改变了分频器的大小,这个频率很高,是给扫描数码管模块使用的。
计数器1
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcntnIS
PORT(CLK:
INSTD_LOGIC;
CLR:
INSTD_LOGIC_vector(2downto0);
U:
INSTD_LOGIC_VECTOR(2DOWNTO0);
A,B:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbhvOFcntnIS
SIGNALJ,K,L:
STD_LOGIC;
SIGNALQ2,Q1:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
a1:
PROCESS(CLK)
BEGIN
IFCLR="001"THENQ1<="0100";
ELSIFU="010"THEN
IFCLK'EVENTANDCLK='1'THEN
Q1<=Q1-1;IFQ1="0000"THENQ1<="1001";J<='1';ELSEJ<='0';ENDIF;
ENDIF;A<=Q1;
ENDIF;
ENDPROCESS;
a2:
PROCESS(J)
BEGIN
IFCLR="001"THENQ2<="0010";
ELSIFU="010"THEN
IFJ'EVENTANDJ='1'THEN
Q2<=Q2-1;IFQ2="0000"THENQ2<="0010";K<='0';ELSEK<='1';ENDIF;
ENDIF;B<=Q2;
ENDIF;
ENDPROCESS;
END;
说明:
作为支干道通行时间,倒计时25s。
计数器2
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcntmIS
PORT(CLK:
INSTD_LOGIC;
CLR:
INSTD_LOGIC_vector(2downto0);
U:
INSTD_LOGIC_VECTOR(2DOWNTO0);
C,D:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbhvOFcntmIS
SIGNALJ,K,L:
STD_LOGIC;
SIGNALQ2,Q1:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
a1:
PROCESS(CLK)
BEGIN
IFCLR="010"THENQ1<="0101";
ELSIFU="001"THEN
IFCLK'EVENTANDCLK='1'THEN
Q1<=Q1-1;IFQ1="0000"THENQ1<="1001";J<='1';ELSEJ<='0';ENDIF;
ENDIF;C<=Q1;
ENDIF;
ENDPROCESS;
a2:
PROCESS(J)
BEGIN
IFCLR="010"THENQ2<="0000";
ELSIFU="001"THEN
IFJ'EVENTANDJ='1'THEN
Q2<=Q2-1;IFQ2="0000"THENQ2<="0010";K<='0';ELSEK<='1';ENDIF;
ENDIF;D<=Q2;
ENDIF;
ENDPROCESS;
END;
说明:
要亮5秒黄灯作为过渡
计数器3
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcntlIS
PORT(CLK:
INSTD_LOGIC;
CLR:
INSTD_LOGIC_vector(2downto0);
U:
INSTD_LOGIC_VECTOR(2DOWNTO0);
E,F:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbhvOFcntlIS
SIGNALJ,K,L:
STD_LOGIC;
SIGNALQ2,Q1:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
a1:
PROCESS(CLK)
BEGIN
IFCLR="001"THENQ1<="0100";
ELSIFU="000"THEN
IFCLK'EVENTANDCLK='1'THEN
Q1<=Q1-1;IFQ1="0000"THENQ1<="1001";J<='1';ELSEJ<='0';ENDIF;
ENDIF;E<=Q1;
ENDIF;
ENDPROCESS;
a2:
PROCESS(J)
BEGIN
IFCLR="001"THENQ2<="0100";
ELSIFU="000"THEN
IFJ'EVENTANDJ='1'THEN
Q2<=Q2-1;IFQ2="0000"THENQ2<="0010";K<='0';ELSEK<='1';ENDIF;
ENDIF;F<=Q2;
ENDIF;
ENDPROCESS;
END;
说明:
作为主干道通行时间,倒计时45s。
选择器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYxuanzeIS
PORT(U:
INSTD_LOGIC_VECTOR(2DOWNTO0);
A,B,C,D,E,F:
INSTD_LOGIC_VECTOR(3DOWNTO0);
Q1,Q2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbhvOFxuanzeIS
BEGIN
PROCESS(U)
BEGIN
caseUIS
WHEN"000"=>Q1<=E;Q2<=F;
WHEN"001"=>Q1<=C;Q2<=D;
WHEN"010"=>Q1<=A;Q2<=B;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
说明:
不同的状态数码管分别显示45s,25s,5s倒计时。
红绿灯控制模块
libraryieee;
useieee.std_logic_1164.all;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entitydengis
generic(a:
integer:
=45;
b:
integer:
=5;
c:
integer:
=25);
port(clk,rst:
instd_logic;
R1,G1,Y1,R2,G2,Y2:
outstd_logic;
U:
outstd_logic_vector(2downto0));
end;
architectureoneofdengis
typefsm_stis(QA,QB,QC,QD);
signalcurrent_state,next_state:
fsm_st;
SIGNALq:
integerrange0TO200;
begin
--process(clk)
--begin
--ifclk='1'andclk'eventthen
--ifq=29thenq<=0;elseq<=q+1;endif;endif;
--endprocess;
process(clk)
begin
ifrst='0'thencurrent_state<=QA;q<=0;
elsifclk='1'andclk'eventthen
current_state<=next_state;ifq=a+b+b+c-1thenq<=0;elseq<=q+1;endif;
endif;
endprocess;
process(current_state,q)
begin
casecurrent_stateis
whenQA=>G1<='0';R2<='0';R1<='1';Y1<='1';G2<='1';Y2<='1';U<="000";
ifq=a-1thennext_state<=QB;
elsenext_state<=QA;
endif;
whenQB=>Y1<='0';R2<='0';R1<='1';G1<='1';G2<='1';Y2<='1';U<="001";
ifq=a+b-1thennext_state<=QC;
elsenext_state<=QB;
endif;
whenQC=>R1<='0';G2<='0';Y1<='1';G1<='1';R2<='1';Y2<='1';U<="010";
ifq=a+b+c-1thennext_state<=QD;
elsenext_state<=QC;
endif;
whenQD=>R1<='0';Y2<='0';Y1<='1';G1<='1';G2<='1';R2<='1';U<="001";
ifq=a+b+b+c-1thennext_state<=QA;
elsenext_state<=QD;
endif;
endcase;
endprocess;
end;
说明:
设置四种状态QA主绿,支红;QB主黄,支红;QC主红,支绿;QD主红,支黄;同时用时间控制状态的切换
扫描数码管模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityscan_ledis
port(clk:
instd_logic;
a1,a2,a3,a4,a5,a6,a7,a8:
instd_logic_vector(3downto0);
sg:
outstd_logic_vector(6downto0);
bt:
outstd_logic_vector(7downto0));
end;
architectureoneofscan_ledis
signalcnt8:
std_logic_vector(2downto0);
signala:
std_logic_vector(3downto0);
begin
p1:
process(cnt8)
begin
casecnt8is
when"000"=>bt<=NOT"00000001";a<=a1;
when"001"=>bt<=NOT"00000010";a<=a2;
when"010"=>bt<=NOT"00000100";a<=a3;
when"011"=>bt<=NOT"00001000";a<=a4;
when"100"=>bt<=NOT"00010000";a<=a5;
when"101"=>bt<=NOT"00100000";a<=a6;
when"110"=>bt<=NOT"01000000";a<=a7;
when"111"=>bt<=NOT"10000000";a<=a8;
whenothers=>null;
endcase;
endprocessp1;
p2:
process(clk)
begin
ifclk'eventandclk='1'thencnt8<=cnt8+1;
endif;
endprocessp2;
p3:
process(a)
begin
caseais
when"0000"=>sg<=NOT"0111111";when"0001"=>sg<=NOT"0000110";
when"0010"=>sg<=NOT"1011011";when"0011"=>sg<=NOT"1001111";
when"0100"=>sg<=NOT"1100110";when"0101"=>sg<=NOT"1101101";
when"0110"=>sg<=NOT"1111101";when"0111"=>sg<=NOT"0000111";
when"1000"=>sg<=NOT"1111111";when"1001"=>sg<=NOT"1101111";
when"1010"=>sg<=NOT"1110111";when"1011"=>sg<=NOT"1111100";
when"1100"=>sg<=NOT"0111001";when"1101"=>sg<=NOT"1011110";
when"1110"=>sg<=NOT"1111001";when"1111"=>sg<=NOT"1110001";
whenothers=>null;
endcase;
endprocessp3;
end;
说明:
采用共阳7段数码管。
经过高频率的扫描给人以同时出现的错觉。
虽然有8个输入但我只用了2个;
总体程序框图
五、实验现象(需要有实验现象图片及文字说明)
交通灯设计共有六个灯,当主干道亮绿灯时,支干道亮红灯;45秒倒计时后,主干道亮5秒黄灯;接着支干道亮绿灯时,主干道亮红灯;25秒倒计时后,支干道亮5秒黄灯,依次循环下去。