余麗紅,龍諾春,林春景,柳貴東
(廣東白云學院 電氣與信息工程學院,廣東 廣州 510450)
超高速集成電路硬件描述語言(Very-High-Speed Integrated Circuit Hardware Description Language,VHDL)是電子產品設計的三大語言之一,其語法非常嚴格,是我國電子設計自動化硬件描述語言的國家統一標準[1]。VHDL的程序結構特點是將設計實體包括元件、電路模塊或電路系統分成外部端口和內部實體。VHDL用簡單的源代碼來描述復雜的內部電路結構,采用分層設計、頂層統一的描述方法。在完成外部端口的定義和內部實體的開發后,就可以生成能被其他系統設計反復利用的模塊,供電路設計人員共享,避免重復設計,提高設計效率。
VHDL模塊化的設計方法是借助庫。庫一般分為IEEE、WORK、STD、ASIC和用戶自定庫5種。庫被用來存放預先編譯好的程序代碼數據,包括程序包集合定義、配置定義、實體定義和結構體定義。庫的優勢在于方便設計者共用已經編譯通過的設計成果。設計者在設計電子產品的過程中,首先要明確電子系統的整體功能,并將大的功能模塊劃分為小的功能模塊,功能模塊進一步細分為功能子模塊。子模塊的設計用一個VHDL程序實現。VHDL自頂向下[2]的硬件模塊化設計流程如圖1所示。

圖1 VHDL模塊化設計流程
交通燈控制器綜合了組合電路與時序電路,主要用來模擬交通路口紅黃綠燈變化和倒計時的過程。交通控制器主要包括:時鐘分頻、紅黃綠狀態轉換、紅黃綠狀態譯碼、倒計時顯示譯碼模塊。設計過程中所用實驗設備的初始時鐘為20 MHz。利用分頻模塊將20 MHz的頻率轉換為1 Hz,對應時間為1 s。分頻模塊是通過計數器來實現,紅黃綠狀態轉換模塊用于控制交通燈的狀態依次為紅、黃、綠,重復循環,并控制3種狀態的倒計時時間。顯示譯碼模塊可以顯示交通燈的狀態和時間。狀態譯碼將3種狀態譯為段碼和位碼,其中,段碼用于顯示3種狀態倒計時的時間,位碼用于控制相應數碼管的亮滅。顯示模塊需要用3個LED燈和兩個數碼管,利用動態掃描原理來完成兩個數碼管的顯示。每個時鐘周期內掃描一個數碼管,顯示一位數據,顯示的數據值由段碼來控制,由于人眼的視覺暫留現象,只要時鐘掃描>100 Hz,人眼觀測到的所有數碼管就是同時顯示的[3]。系統設計的模塊框圖如圖2所示。

圖2 系統設計的模塊框
完整的VHDL程序一般包括5個部分:庫、程序包、配置、結構體和實體。庫專門用于存儲預先編譯完成的實體、結構體、程序包集合和配置。程序包用于存放各設計模能夠共享的常數、數據類型、子程序等基礎設計單元。配置用于把特定的結構體關聯到一個確定的實體上,為一個大型系統的設計提供管理和工程組織[4]。實體用于參數定義和描述模塊的外部端口。結構體是VHDL程序的主體部分,用于描述模塊的具體行為、結構和功能。
2.2.1 時鐘分頻模塊
根據設計要求,分頻模塊的外部端口共有4個:初始時鐘輸入端口、復位控制輸入端口、122 Hz的動態掃描脈沖輸出端口以及1 Hz的計時脈沖輸出端口。分頻模塊實體的VHDL語言描述如下:
ENTITY SZFP IS
PORT(CLK,RST: IN STD_LOGIC;
CT1,CT2: OUT STD_LOGIC);
END SZFP;
端口說明語句中,CLK是輸入端口,表示初始時鐘信號;RST是輸入端口,代表復位信號;CT1、CT2為輸出端口,表示分頻以后的時鐘信號,分別為1 Hz,100 Hz。
2.2.2 狀態轉換模塊
狀態轉換模塊的外部端口共有5個:1 Hz計時脈沖輸入端口、復位控制輸入端口、紅黃綠狀態輸出端口、個位數據輸出端口和十位數據輸出端口。該模塊實體的VHDL語言描述如下:
ENTITY ZTZH IS
PORT(CLK,RST: IN STD_LOGIC;
STATE: OUT STD_LOGIC_VECTOR(2 DOWNTO 0)
DL,DH:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END ZTZH;
其中,STATE表示狀態輸出信號;DL,DH代表輸出的倒計時數據。
2.2.3 狀態譯碼模塊
狀態譯碼模塊的外部端口共有兩個:紅黃綠狀態輸入端口和LED燈控制輸出端口。該模塊實體的VHDL語言描述如下:
ENTITY ZTYM IS
PORT(STATE: IN STD_LOGIC_VECTOR(2 DOWNTO 0)
LIGHT: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END ZTYM;
2.2.4 顯示譯碼模塊
顯示譯碼模塊的外部端口共有6個:122 Hz動態掃描脈沖輸入端口、復位控制輸入端口、十位數據輸入端口、個位數據輸入端口、控制數值的段碼和選擇芯片的位碼。該模塊實體的VHDL語言描述如下:
ENTITY XSYM IS
PORT(CLK,RST:IN STD_LOGIC;
DL,DH:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
EN:OUT STD_LOGIC_VECTOR(1 DOWNTO 0));
END XSYM;
2.2.5 頂層系統模塊
頂層系統模塊將時鐘分頻、計數器狀態轉換、譯碼、顯示4個分模塊整合在一起。在VHDL程序中利用元件例化語句來建立頂層模塊與子模塊之間的連接關系。元件例化語句由元件聲明語句和元件例化語句[5]兩部分組成。元件聲明(component)是對頂層要調用的較低層次的實體進行端口說明,相當于完成底層元件的封裝。元件例化(port map)是在調用較低層次的實體時建立起端口之間的一一對應關系。設計最終借助元件例化實現交通燈控制器的功能。頂層模塊設計實體共有5個端口:20 MHz初始時鐘輸入、復位控制輸入、LED燈控制輸出端口,段碼輸出和位碼輸出,相對應的VHDL語言描述如下:
ENTITY JTD IS
PORT(CLK,RST:IN STD_LOGIC;
DT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
LIGHT: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
EN:OUT STD_LOGIC_VECTOR(1 DOWNTO 0));
END JTD;
元件例化語句如下:
U0:SZFP PORT MAP(CLK,RST,CT1,CT2);
U1:ZTZH PORT MAP(CT1,RST,STATE,DL,DH);
U2:ZTYM PORT MAP(STATE,LIGHT);
U3:XSYM PORT MAP(CT2,RST,DL,DH,DT,EN);
其中,DL、DH、CT1、CT2為內部信號。
交通燈控制器的硬件實現選用Altera公司的MAX+PLUSⅡ軟件。硬件實現之前先完成4個模塊的時序仿真,接下來完成頂層模塊的時序仿真,然后在目標芯片上進行管腳分配,連接好對應引腳后就可以進行程序下載和硬件實現。本設計的硬件實現如圖3所示。

圖3 交通燈控制器
VHDL語言對于初學者來講是比較難掌握的,文章根據多年的教學經驗設計交通燈控制器的程序,用以幫助學生掌握自上而下的模塊化程序設計思想,讓學生對VHDL語言中的順序語句、并行語句(特別是進程語句)有更深刻的理解。