VHDL的一個(gè)強(qiáng)大功能是用庫(kù)來組織RTL的不同部分。通過使用庫(kù),不同的設(shè)計(jì)人員可以做這個(gè)工程中自己負(fù)責(zé)的那部分工作,而不必?fù)?dān)心會(huì)在命名方面與其他設(shè)計(jì)師發(fā)生沖突。在例化期間,這可以通過手動(dòng)指定要使用的庫(kù)或者通過配置語句來完成。
例如,已經(jīng)在一個(gè)名為“my_lib1”的庫(kù)中創(chuàng)建并編譯了一個(gè)名為“bottom”的實(shí)體。
編譯到任何庫(kù)中的頂層可以輕松地通過直接實(shí)體例化來引用底層:
u0 : entity my_lib1.bottom port map (in1 => in1, out1 => out1);
通過采用上面的編碼方式,需要哪個(gè)版本的底層就顯而易見了?!癿y_lib1”庫(kù)中的版本是正確無誤的版本。
一個(gè)常見的誤解與何時(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)可以通過幾個(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的庫(kù)中(也在my_lib1庫(kù)中),而且,bottom2.vhd在名為my_lib2的庫(kù)里。
在頂層,例化看起來類似于以下內(nèi)容:
u0 : entity work.bottom port map (in1=> in1, out1 => out1);
查看詳細(xì)視圖,該示意圖如下所示:
這正是我們期待看到的結(jié)果。更重要的是,當(dāng)使用相同的建立運(yùn)行仿真時(shí),波形圖如下例所示:
接下來,如果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ù)所帶來的危險(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)注
50文章
4023瀏覽量
133338 -
Vivado
+關(guān)注
關(guān)注
19文章
805瀏覽量
66226
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論