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

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

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

接下來,如果top.vhd文件的庫從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”是物理庫所帶來的危險(xiǎn)。這是與示例#1類似的測(cè)試。在此示例中,top.vhd和bottom1.vhd將被編譯到“my_lib1”庫中,bottom2.vhd將被編譯到名為“work”的庫中。

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

仿真如下所示:

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