駱傳慧
【摘要】代碼重用是提高軟件設計效率和質量的重要手段,VHDL的庫文件能夠實現高效代碼分割、代碼共享及代碼重用。本文介紹了庫的基本結構,及其的基本構件單元元件、函數、過程的建立和調用的語法結構,從而實現結構化設計及代碼重用。
【關鍵詞】代碼重用;VHDL;軟件設計
0引言
隨著可編程邏輯器件技術的發展,芯片的性能越來越強、規模越來越大、開發的周期越來越長,使得器件應用正面臨一系列新的問題:設計質量難以控制,設計成本也越來越高。IP(Intelligence Property)技術解決了當今芯片設計業所面臨的難題。設計者可以重復使用已經設計并經過驗證的IP核,將精力集中于系統頂層及關鍵功能模塊的設計上,從而提高產品整體性能和個性化特性,加快了設計效率。
如何才能提高IP核的重復使用率,使設計資源更好地集中起來加以利用,是可編程邏輯器件應用面臨的另一個問題。在VHDL(VHSIC Hardware Description Language)語言中,庫(LIBRARY)文件很好地解決了這個問題。庫文件是專門用于存放預先編譯好的程序包(PACKAGE)和數據集合體,這些設計單元可用作其他VHDL描述的資源。用戶編寫的設計單元既可以訪問多個設計庫,又可以加入到設計庫中,被其他單元所訪問。此外,庫的使用能夠實現層次化設計和功能模塊化設計方法,有利于使復雜設計具有更清晰的結構。
1庫組成
在VHDL中,常用的庫有IEEE、STD、WORK、用戶庫等。庫文件常用的語句為元件(COMPONENT)和子程序(過程和函數),為了使程序包能夠被編譯,元件和子程序必須被添加到被稱為包集合的程序包中。用戶庫是用戶定義庫的簡稱,是由用戶自己創建并定義的庫。設計者可以把自己開發的非標準包集合和實體等匯集成在一起定義成一個庫,作為對VHDL標準庫的補充。用戶將需要重復使用的代碼以元件和子程序的形式放到包集合中,編譯到目標庫中,生成用戶庫,供其它設計單元調用。在設計中要使用某個程序包中的內容時,用USE語句即可打開該程序包。
2庫構件說明
2.1包集合
在用戶庫中,包集合放置的是用戶自己定義的元件、函數、過程。包集合包括包頭和包體兩部分。包頭用來聲明包中的類型、元件和子程序;而包體則用來存放說明中的元件源代碼和子程序。程序包聲明單元的語法格式為:
PACKAGE 程序包名 IS
說明語句
END [程序包名];
其中說明語句為:USE語句、類型定義、常量定義、元件聲明、子程序聲明及信號聲明等。程序包體單元的的語法格式為:
PACKAGE BODY程序包名 IS
說明語句
END [程序包名];
2.2元件
用戶庫通過元件定義的方式,將一些設計好的電路單元納入,其他設計體則通過元件實例化的方法調用這些元件,使得元件與其他設計實體中的端口相連接,從而為當前設計實體引入低一級的設計層次設計。
2.2.1元件定義
元件定義語句放在包集合的包頭中,指出包集合所包含的具體元件,元件源代碼可以獨立編譯,不需要納入包集合中。元器件定義語句的語法格式為:
COMPONENT元件名IS
GENERIC(常量、參數列表);
PORT(元件端口列表);
END COMPONET;
其中,常量、參數列表與元件源代碼實體中的GENERIC部分相同;元件端口列表,與元件源代碼實體中的PORT部分相同。
2.2.2元件調用
元件調用稱為元件實例化,在元件實例化過程中有位置映射和名稱映射兩種方法可以實現。
位置映射中參數、端口信號名稱在順序、端口狀態和數據類型上必須和元件源代碼保持一致,各個參數、端口意義取決于它的位置。位置映射元件實例化語句的語法格式為:
COMPONENT元件名(
GENERIC MAP (常量、參數列表)
PORT MAP(元件端口列表));
名稱映射用符號“=>”連接元件參數、端口和結構體之間的參數、端口。名稱映射元件實例化語句的語法格式為:
COMPONENT元件名(
GENERIC MAP(元件源程序常量列表=>常量值)
元件源程序參數列表=>參數量值)
PORT MAP(元件端口列表=>信號名稱));
其中,左邊列出元件源代碼中參數、端口名稱,右邊列出調用代碼中對應的參數值、端口信號名稱。左右兩邊的數值、信號名稱可以不相同,語句中位置順序可以任意。
2.3子程序
VHDL中的子程序有過程(PROCEDURE)及函數(FUNCTION)兩類,主程序和子程序之間通過端口參數列表位置關聯方式進行數據傳送,子程序可以被多次調用完成重復性的任務。子程序包含子程序聲明和主體兩部分,子程序聲明必須要在包頭中,子程序主體則放在包體中。
2.3.1函數
函數通常用來實現數據類型轉換、邏輯運算、算術運算類型的代碼共享和重用,即輸入若干參數,通過函數運算求值,最后直接返回一個值。函數應用分為建立和調用兩個過程。
1)函數建立
函數分為函數聲明和函數主體體,函數聲明是包集合與函數的接口界面,放在包集合的包頭部分,而函數主體應放在包集合的包體內。函數聲明首語句的語法格式為:
FUNCTION 函數名 (參數列表) RETURN 數據類型;
其中,參數列表中為參數名、參數類別及數據類型,函數的參數為信號或常數,默認情況為常數。
函數體語句的語法格式為:
FUNCTION 函數名 (參數列表) RETURN 數據類型 IS
[子程序聲明部分;]
BEGIN
順序語句;
END 函數名;
其中,在RETURN后面的數據類型為函數返回值的類型;子程序聲明項用來說明函數體內引用的對象和過程;順序語句就是函數體,用來定義函數的功能。
2)函數的調用
函數可以單獨構成表達式,或者作為表達式的一部分調用。函數調用語句的語法格式為:
函數名 (參數列表);
2.3.2過程
過程的作用是傳遞信息,即通過參數進行調用代碼和過程代碼的信息傳遞。其中參數需說明類別、類型及傳遞方向。
1)過程建立
過程分為聲明和過程主體,聲明應放在包集合的包頭部分,過程定義的主體代碼應放在包集合的包體內。
過程聲明的語法格式為:
PROCEDURE 過程名 (參數列表) ;
其中,參數聲列表指明了輸入、輸出端口的數目和類型。
參數聲明的語法格式為:
[數據類型 參數名:模式]
其中,參數可以有任意多個;參數模式有in、out、inout、buffer形式;參數類型,可以是常數、信號、變量,“in” 默認為常數,“out”和“inout”默認為“變量”,若需要將“out”和“inout”作為信號使用,則在過程參數定義時必須指明是信號。
過程定義的語法格式為:
PROCEDURE 過程名 (參數列表) IS
[子程序聲明部分];
BEGIN
順序語句;
END [PROCEDURE] [過程名] ;
2)過程的調用
過程的調用是一條語句,調用時通過其接口返回0個或多個值。過程可以直接調用,也可以在其他語句中調用。過程調用語句的語法格式為:
過程名 (參數);
在過程語句執行結束后,如沒有特別說明,輸出和輸入輸出參數將按變量對待將值傳遞給調用者的變量。如果調用者需要輸出和輸入輸出作為信號使用,則在過程參數定義時要指明是信號。
3庫的調用
使用庫之前,首先需要對庫進行聲明。經過聲明之后,在設計中就可以調用庫中的代碼了。用戶庫聲明的語法格式:
LIBRARY 庫名;
USE 庫名.程序包名.包集合名;
4結束語
用戶庫是VHDL語言中非常重要的代碼分割、共享、重用的方法,只要將重用的代碼按功能特性以元件、函數、過程形式構建成可重用部件放置在包集合內,經過編譯后生成用戶庫文件,在后續編碼過程中通過庫聲明即可調用用戶庫。
用戶庫的使用可以使代碼結構更加清晰,并且庫中的代碼通常要經過嚴格的測試和優化,利用用戶庫進行電路設計,可以在FPGA等可編程邏輯器件中達到最優的性能和最低的邏輯資源使用率,以保證電路的性能和質量。因而,能在降低開發成本、縮短開發周期的同時提高了設計可靠性。
【參考文獻】
[1]孫曉東.FPGA軟件設計[J].電腦編程技巧與維護,2010(12):5-6.
[2]李冰,吳金,魏同立.基于可重構核的FPGA電路設計[J].固體電子學研究與進展,2003,1(23):108-109.
[3]侯伯亨,顧新.VHDL硬件描述語言與數字邏輯電路設計[M].西安電子科技大學出版社,1999.
[4]喬廬峰,王志功.VHDL數字電路設計教程[M].電子工業出版社,2013.