【正文】
END IF。 END IF。 IF BTI/=X01THEN IF BTI (3 DOWNTO 0) =0000THEN BTI (3 DOWNTO 0) =1001。 BTI (7 DOWNTO 4) = BTI (7 DOWNTO 4)1。 ELSE BTI (3 DOWNTO 0) = BTI(3 DOWNTO 0)1。 BTI (7 DOWNTO 4) = BTI (7 DOWNTO 4)。 END IF。 END IF。 END IF。 END IF。 END PROCESS。 AT=ATI。 BT=BTI。 END JTD_2。 該模塊的仿真波形如下: 圖 35 計時模塊仿真圖 第三章 信號控制器模塊的設計 24 JTD_LIGHT的設計 譯碼驅動模塊根據控制信號,驅動交通燈紅黃綠燈的顯示。來指示車輛及行人有秩序的通行。這個模塊由 JTD_LIGHT 模塊實現,如下圖示: 圖 36 譯碼驅動模塊 該 模塊的源文件程序如下: LIBRARY IEEE。 USE 。 USE 。 ENTITY JTD_LIGHT IS PORT (CLR: IN STD_LOGIC。 M, S: IN STD_LOGIC_VECTOR (2 DOWNTO 0)。 ABL: OUT STD_LOGIC_VECTOR (7 DOWNTO 0))。 END JTD_LIGHT。 ARCHITECTURE JTD_3 OF JTD_LIGHT IS SIGNAL LT: STD_LOGIC_VECTOR (7 DOWNTO 0)。 BEGIN PROCESS (CLR, S, M) BEGIN IF CLR=39。139。THEN LT=00000000。 ELSE IF M=000THEN LT=10000001。 END IF。 IF M=001THEN LT=00100001。 END IF。 IF M=010THEN LT=00011000。 END IF。 第三章 信號控制器模塊的設計 25 IF M=011THEN LT=00010010。 END IF。 IF M=100THEN CASE S IS WHEN 000=LT=00010100。 WHEN 001=LT=10000001。 WHEN 010=LT=01000001。 WHEN 011=LT=00100001。 WHEN 100=LT=01000001。 WHEN 101=LT=00011000。 WHEN 110=LT=00010100。 WHEN 111=LT=00010010。 WHEN OTHERS=LT=LT。 END CASE。 END IF。 END IF。 END PROCESS。 ABL=LT。 END JTD_3。 該模塊的仿真波形如下: 圖 37 譯碼驅動模塊仿真圖 JTD_DIS的設計 顯 示模塊用來顯示倒計時時間和系統(tǒng)的工作狀態(tài)。其輸出用來驅動七 位數碼管,每個方向有兩位顯示 , 并且采用動態(tài)掃描方式 。這個模塊由 JTD_DIS 模第三章 信號控制器模塊的設計 26 塊實現,如下圖示 : 圖 38 顯示模塊 該模塊的源程序如下: LIBRARY IEEE。 USE 。 USE 。 ENTITY JTD_DIS IS PORT (CLK1K, CLK, CLR: IN STD_LOGIC。 M2, M1, M0: IN STD_LOGIC。 AT, BT: IN STD_LOGIC_VECTOR (7 DOWNTO 0)。 LED: OUT STD_LOGIC_VECTOR (6 DOWNTO 0)。 SEL: OUT STD_LOGIC_VECTOR (2 DOWNTO 0))。 END JTD_DIS。 ARCHITECTURE JTD_4 OF JTD_DIS IS SIGNAL OU, STL, STH, MM: STD_LOGIC_VECTOR (3 DOWNTO 0)。 SIGNAL DIS, DS: STD_LOGIC_VECTOR (7 DOWNTO 0)。 SIGNAL SL: STD_LOGIC_VECTOR (2 DOWNTO 0)。 BEGIN MM=0amp。M2amp。M1amp。M0。 STH=XA。 PROCESS (CLR, CLK1K) BEGIN IF CLR=39。139。THEN SL=000。 第三章 信號控制器模塊的設計 27 ELSIF (CLK1K39。EVENT AND CLK1K=39。139。) THEN IF SL=101THEN SL=000。 ELSE SL=SL+1。 END IF。 END IF。 END PROCESS。 PROCESS (SL) BEGIN CASE SL IS WHEN000=OU=BT (3 DOWNTO 0)。 WHEN001=OU=BT (7 DOWNTO 4)。 WHEN 010=OU=AT (3 DOWNTO 0)。 WHEN011=OU=AT (7 DOWNTO 4)。 WHEN100=OU=STL。 WHEN101=OU=STH。 WHEN OTHERS=OU=X0。 END CASE。 END PROCESS。 PROCESS (OU) BEGIN CASE OU IS WHEN X0=DS=X7E。 WHEN X1=DS=X30。 WHEN X2=DS=X6D。 WHEN X3=DS=X79。 WHEN X4=DS=X33。 WHEN X5=DS=X5B。 WHEN X6=DS=X5F。 WHEN X7=DS=X70。 第三章 信號控制器模塊的設計 28 WHEN X8=DS=X7F。 WHEN X9=DS=X7B。 WHEN XA=DS=X4F。 WHEN OTHERS=DS=X00。 END CASE。 END PROCESS。 PROCESS (MM, CLK) BEGIN IF MM=X4THEN STL=X5。 ELSE STL=MM+1。 END IF。 IF CLR=39。139。THEN DIS=X00。 ELSIF MM=X4THEN DIS=DS。 ELSIF SL100THEN IF CLK=39。039。THEN DIS=DS。 ELSE DIS=X00。 END IF。 ELSE DIS=DS。 END IF。 END PROCESS。 LED=DIS (6 DOWNTO 0)。 SEL=SL。 END JTD_4。 該模塊的仿真波形如下: 圖 39 顯示模塊仿真圖 第三章 信號控制器模塊的設計 29 JTD_FQU的設計 本系統(tǒng)動態(tài)掃描需要 1KHz 的脈沖,而系統(tǒng)時鐘需要 1Hz 的脈沖,分頻器主要為系統(tǒng)提供所需要的時鐘脈沖。該模塊將 1KHz 的脈沖信號進行分頻,產 生1s 的方波,作為系統(tǒng)時鐘信號和特殊情況下的倒計時閃爍信號。這個模塊主要由 JTD_FQU 模塊實現 如下圖 : 圖 310 分頻器模塊 其源程序如下: LIBRARY IEEE。 USE 。 USE 。 ENTITY JTD_FQU IS PORT (CLK1K: IN STD_LOGIC。 CLK: OUT STD_LOGIC)。 END JTD_FQU。 ARCHITECTURE JTD_5 OF JTD_FQU IS SIGNAL Q: STD_LOGIC_VECTOR (9 DOWNTO 0)。 BEGIN PROCESS (CLK1K) BEGIN IF (CLK1K39。EVENT AND CLK1K=39。139。) THEN Q=Q+1。 END IF。 END PROCESS。 CLK=Q (9)。 END JTD_5。 該模塊的仿真波形如下: 第三章 信號控制器模塊的設計 30 圖 311 分頻器模塊仿真圖 頂層文件原理圖如 下 圖所示: 圖 312 交通燈控制器原理第四章 系統(tǒng)硬件電路實現 31 第四 章 系統(tǒng)硬件電路實現 外圍電路 鍵盤接口 S1 S2 S3 SCS4 S5 S6 SDSES9S8S7SA S0 SB SFR15 .1KR25 .1KR35 .1KR45 .1KV C C 圖 41 行列式鍵盤接口電路 鍵盤是控制系統(tǒng)中常用的人機交互接口,本設計中鍵盤主要是對交通燈的工作方式進行控制選擇。通常情況下,交通燈 信號控制器工作于方式五。當有特殊情況發(fā)生時,按 A 鍵進入模式切換,使工作方式切換 到方式一至 方式四中的任何一種;按鍵 1~4 對應方式一至方式四;按 B 鍵進入設置模式,此時, 0~9為數字 鍵,可對預先設置好的模式時間進行靈活調整,倒計時結束自動進入正常循環(huán),指揮交通高效作業(yè);或按 0 鍵切換至復位鍵,使進入正常循環(huán)。 恢復鍵 可使交通燈從任何一個狀態(tài) 強制 切回到正常循環(huán)狀態(tài) 。 這種鍵盤控制方式靈活機動,可以根據具體情況隨時更換交通燈的狀態(tài) 性能可靠、 穩(wěn)定 。 一個完善的鍵盤控制程序應解決以下任務: ① 檢測有無按鍵按下; ② 有鍵按下,在無硬件除抖動的情況下,應有軟件延時方法除去抖動影響; ③ 鍵掃描程序; ④ 將鍵編碼轉換成 相應鍵值; 行 列式鍵盤按鍵識別相對復雜一些,如上圖所示,行 線通過上拉電阻接 +5V電 壓被置為高電平。判斷有無鍵按下采用動態(tài)掃描,即依次給列 線送低電平 ,檢查行線輸入。若行 線信號全為高電平,代表 低電平信號所在的列 中無鍵按下;第四章 系統(tǒng)硬件電路實現 32 若行 線有低電平,低電平信號所在的行和出現低電平的列的交點處有鍵按下。 一個完整的鍵盤接口程序包括時鐘分頻、按鍵消抖、鍵掃描模塊和鍵碼轉換模塊 4 個部分。 時鐘分頻 由于這里使用外部晶體振蕩器的頻率為 5MHz,這個頻率對于鍵盤掃描來說肯定太高,所以這里用了一個分頻器來得到適合鍵盤程序使用的輸入時鐘。其邏輯圖為: 圖 42 時 鐘分頻模塊 這里進行了 5000 分頻(其 VHDL 程序代碼見附錄),最后輸出時鐘接近1KHz。程序中調用了偶數分頻器 。 按鍵消抖 另外由按鍵的機械性決定,按鍵具有抖動的影響。因此,必須具有按鍵消抖模塊。本模塊用于當有按鍵按下時,采用了軟件消抖的方法去除去按鍵消抖。模塊的實現方法是先判斷是否有鍵按下,如有鍵按下則延時一段時間,待抖動過去后再讀行線狀態(tài),如果仍有低電平行線,則確定有按鍵按下,然后產生一個有鍵按下的信號。 該模塊有一個時鐘輸入端口,輸入時鐘信號是分頻出來的 1KHz 的時鐘;有一個數據端口與行線 相連,用于輸入行線狀態(tài);一個輸出端口,用于輸出有鍵按下的信號。該模塊的邏輯圖如下: 圖 43 按鍵消抖模塊 原理是當有鍵按下時(其 VHDL 程序代碼見附錄), temp1 會