?? jtd1.txt
字號:
交通控制燈的設計
一、任務與要求
設計一個十字路口的紅、綠、黃三色信號交通燈控制電路,具體要求如下:
1)用紅、綠、黃三色發光二極管作信號燈。主干道為東西向,有紅、綠、黃三個燈;支干道為南北向,也有紅、綠、黃三個燈。紅燈亮禁止通行;綠燈亮允許通行;黃燈亮則給行駛中的車輛有時間停靠到禁行線之外;
2)由于主干道車輛較多而支干道車輛較少,所以主干道綠燈時間較長。當主干道允許通行亮綠燈時,支干道亮紅燈。而支干道允許通行亮綠燈時,主干道亮紅燈,兩者交替重復。主干道每次放行50秒,支干道每次放行30秒;
在每次由亮綠燈變成亮紅燈的轉換過程中間,需要亮5秒的黃燈作為過渡,以使行駛中的車輛有時間停靠到禁行線以外。
3)能實現正常的、即時顯示功能。用DE2上的四個七段數碼管作為倒計時顯示器。分別顯示東西、南北方向的紅燈、綠燈、黃燈時間;
4)能實現特殊狀態的功能顯示。設S為特殊狀態的傳感器信號,當S=1時,進入特殊狀態。當S=0時,退出特殊狀態。按S后,能實現特殊狀態功能:
(1)顯示器閃爍;
(2)計數器停止計數并保持在原來的數據;
(3)東西、南北路口均顯示紅燈狀態;
(4)特殊狀態結束后,能繼續對時間進行計數。
5)能實現總體清零功能。按下清零鍵后,系統實現總清零,計數器由初始狀態開始計數,對應狀態的指示燈亮。
二,設計說明
在正常情況下,支路車較少,主路車多,所以設計的交通燈控制要求,在支路無車時,保證主路綠燈亮;而在支路有車時,主路和支路的綠燈交替亮。控制器結構如下圖所示。
下面是端口說明:
Clk: 輸入,系統輸入時鐘;
reset:輸入,是復位信號,高電平有效;
sensor:輸入,為傳感器信號,是高電平有效;
flash: 輸出,轉換期間的閃爍信號;
reda: 輸出,主干道路口顯示紅燈信號,高電平有效;
greena: 輸出,主干道路口顯示綠燈信號,高電平有效;
yellowa: 輸出,主干道路口顯示黃燈信號,高電平有效;
redb: 輸出,支干道路口顯示紅燈信號,高電平有效;
greenb: 輸出,支干道路口顯示綠燈信號,高電平有效;
yellowb: 輸出,支干道路口顯示黃燈信號,高電平有效;
三、實驗設計程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity controller is
port
(clock:in std_logic;
reset:in std_logic;
sensor:in std_logic;
flashut std_logic;
numa,numbut integer range 0 to 90;
reda,greena,yellowaut std_logic;
redb,greenb,yellowbut std_logic
);
end;
architecture control of controller is
signal countnum:integer range 0 to 90;
begin
process(clock)
begin
if reset='1' then ---復位信號,將記數器清零
countnum<=0;
elsif rising_edge(clock) then
if sensor='1' then
flash<='1';
else
flash<='0';
if countnum=89 then ----記數到90秒時,記數器清零
countnum<=0;
else
countnum<=countnum+1; ---正常記數,計脈沖上升沿
end if;
end if;
end if;
end process;
process(clock)
begin
if rising_edge(clock) then
if sensor='1' then ---sensor信號有效期間,兩組路燈都為紅燈
reda<='1';
redb<='1';
greena<='0';
greenb<='0';
yellowa<='0';
yellowb<='0';
else ---sensor無效期間,系統行為:按照一個記數周期時間(90秒)描述動作
if countnum<=49 then ---前50秒,主干道的綠燈亮
numa<=50-countnum;
reda<='0';
greena<='1';
yellowa<='0';
elsif (countnum<=54) then ---51-55秒,主干道的黃燈亮
numa<=55-countnum;
reda<='0';
greena<='0';
yellowa<='1';
else
numa<=90-countnum; ---56-90秒,主干道的紅燈亮
reda<='1';
greena<='0';
yellowa<='0';
end if;
if countnum<=54 then ---0-55秒(主干道為綠,黃燈期間)支干道的紅燈亮
numb<=55-countnum;
redb<='1';
greenb<='0';
yellowb<='0';
elsif countnum<=84 then ---56-85秒,支干道為綠燈
numb<=85-countnum;
redb<='0';
greenb<='1';
yellowb<='0';
else
numb<=90-countnum; ---86-90秒,支干道為黃燈
redb<='0';
greenb<='0';
yellowb<='1';
end if;
end if;
end if;
end process;
end ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -