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