VHDL的一個(gè)強(qiáng)大功能是用庫(kù)來(lái)組織RTL的不同部分。通過(guò)使用庫(kù),不同的設(shè)計(jì)人員可以做這個(gè)工程中自己負(fù)責(zé)的那部分工作,而不必?fù)?dān)心會(huì)在命名方面與其他設(shè)計(jì)師發(fā)生沖突。在例化期間,這可以通過(guò)手動(dòng)指定要使用的庫(kù)或者通過(guò)配置語(yǔ)句來(lái)完成。
例如,已經(jīng)在一個(gè)名為“my_lib1”的庫(kù)中創(chuàng)建并編譯了一個(gè)名為“bottom”的實(shí)體。
編譯到任何庫(kù)中的頂層可以輕松地通過(guò)直接實(shí)體例化來(lái)引用底層:
u0 : entity my_lib1.bottom port map (in1 => in1, out1 => out1);
通過(guò)采用上面的編碼方式,需要哪個(gè)版本的底層就顯而易見(jiàn)了。“my_lib1”庫(kù)中的版本是正確無(wú)誤的版本。
一個(gè)常見(jiàn)的誤解與何時(shí)使用名為“work”的庫(kù)有關(guān)。許多設(shè)計(jì)師將“work”用作庫(kù),假設(shè)它與其他庫(kù)一樣,是一個(gè)物理庫(kù)。但情況并非如此。名為“work”的庫(kù)在VHDL中的用法比較特殊。
它不是一個(gè)物理庫(kù),實(shí)際上它指的是“當(dāng)前庫(kù)”。
當(dāng)一個(gè)文件被編譯到一個(gè)特定的庫(kù)中,然后被告知從“work”中獲取邏輯時(shí),它不會(huì)在名為“work”的物理庫(kù)查找,而是會(huì)在例化的文件被編譯到的庫(kù)中查找。這一點(diǎn)可以通過(guò)幾個(gè)例子來(lái)展示。
實(shí)例 #1
在此示例中,有三個(gè)文件,top.vhd、bottom1.vhd和bottom2.vhd。 Top.vhd是設(shè)計(jì)中的頂層,例化了一個(gè)名為“bottom”的實(shí)體。底層的兩個(gè)文件都有一個(gè)名為“bottom”的實(shí)體。在bottom1.vhd中,有一個(gè)輸出是由一個(gè)通過(guò)反相器過(guò)驅(qū)動(dòng)的的輸出。在bottom2.vhd,中,輸出直接由輸入驅(qū)動(dòng)。

頂層被編譯到名為y_lib1、bottom1.vhd的庫(kù)中(也在my_lib1庫(kù)中),而且,bottom2.vhd在名為my_lib2的庫(kù)里。
在頂層,例化看起來(lái)類似于以下內(nèi)容:
u0 : entity work.bottom port map (in1=> in1, out1 => out1);
查看詳細(xì)視圖,該示意圖如下所示:

這正是我們期待看到的結(jié)果。更重要的是,當(dāng)使用相同的建立運(yùn)行仿真時(shí),波形圖如下例所示:

接下來(lái),如果top.vhd文件的庫(kù)從my_lib1轉(zhuǎn)換到my_lib2,則對(duì)詳細(xì)視圖所做的更改如下所示:

并且,仿真波形圖也會(huì)發(fā)生變化:

這正是我們預(yù)期的結(jié)果。因?yàn)閠op.vhd文件在my_lib2中,并且在實(shí)體例化中使用了“work”,所以它將從my_lib2中獲取底層。
示例 #2
此示例將顯示假設(shè)“work”是物理庫(kù)所帶來(lái)的危險(xiǎn)。這是與示例#1類似的測(cè)試。在此示例中,top.vhd和bottom1.vhd將被編譯到“my_lib1”庫(kù)中,bottom2.vhd將被編譯到名為“work”的庫(kù)中。

與前面的示例一樣,頂層例化底部,如下所示:
u0: entity work.bottom port map (in1 => in1, out1 => out1)
這個(gè)設(shè)計(jì)的詳細(xì)視圖類似于以下示例:

仿真如下所示:

因此,即使bottom2.vhd已被編譯為一個(gè)名為“work”的物理庫(kù),并且頂層由“work”庫(kù)例化了底部,但該工具仍然會(huì)使用bottom1.vhd中與top.vhd編譯到同一個(gè)庫(kù)中的行為。
Vivado默認(rèn)庫(kù):
默認(rèn)情況下,將VHDL文件輸入Vivado工程時(shí),該工具會(huì)將這些文件放入一個(gè)名為“xil_defaultlib”的庫(kù)中。這樣做的原因是讓只使用庫(kù)的用戶能夠輕松地將舊的工程移植到VHDL中,同時(shí)還能幫助設(shè)置有更多組合結(jié)構(gòu)的用戶以恰當(dāng)?shù)姆绞皆赩ivado中對(duì)他們的工程進(jìn)行設(shè)置。
結(jié)論:
選擇VHDL文件的庫(kù)名時(shí)應(yīng)小心。雖然名為“work”的庫(kù)是許多工程公用的庫(kù)名,但該工具處理這個(gè)庫(kù)名的方式與處理其他庫(kù)名的方式略有不同。如果將頂層文件編譯到不同的庫(kù)中并引用“work”,那么它就不會(huì)從名為“work”的物理庫(kù)中獲取行為。如果這不是所期望的,就可能會(huì)導(dǎo)致混亂的行為。
我的建議是永遠(yuǎn)不要使用“work”庫(kù)。相反,在例化較低層時(shí),始終應(yīng)指定要使用的庫(kù)。
這樣做有點(diǎn)費(fèi)事,但通常會(huì)給你想要的行為。
-
仿真
+關(guān)注
關(guān)注
54文章
4482瀏覽量
138251 -
Vivado
+關(guān)注
關(guān)注
19文章
857瀏覽量
71106
發(fā)布評(píng)論請(qǐng)先 登錄
TI官方BLE Bridge串口轉(zhuǎn)藍(lán)牙源碼+簡(jiǎn)要說(shuō)明文檔
請(qǐng)問(wèn)參與競(jìng)標(biāo)時(shí)應(yīng)該做什么類型的簡(jiǎn)要說(shuō)明?
熔絲位簡(jiǎn)要說(shuō)明
手機(jī)充電協(xié)議BC1.2簡(jiǎn)要說(shuō)明
Socket API簡(jiǎn)要說(shuō)明
簡(jiǎn)要說(shuō)明四線SPI接口應(yīng)用中需要掌握的一些關(guān)鍵知識(shí)
接口技術(shù)-USB驅(qū)動(dòng)程序簡(jiǎn)要說(shuō)明及應(yīng)用例子
交換機(jī)6000簡(jiǎn)要說(shuō)明
6000A-CQ1用戶手冊(cè)簡(jiǎn)要說(shuō)明
漢邦7000SDK V3.0.11.610開(kāi)發(fā)軟件簡(jiǎn)要說(shuō)明
儲(chǔ)能連接器制造工藝的簡(jiǎn)要說(shuō)明
通過(guò)解剖一個(gè)邊沿觸發(fā)器簡(jiǎn)要說(shuō)明setup和hold產(chǎn)生原因
簡(jiǎn)要說(shuō)明如何使用“work” 庫(kù)
評(píng)論