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)類(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)?top.vhd 文件在 my_lib2 中,并且在實(shí)體例化中使用了“work”,所以它將從 my_lib2 中獲取底層。
示例 #2
此示例將顯示假設(shè)“work”是物理庫(kù)所帶來(lái)的危險(xiǎn)。這是與示例#1 類(lèi)似的測(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ì)視圖類(lèi)似于以下示例:
仿真如下所示:
因此,即使 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ù)的用戶(hù)能夠輕松地將舊的工程移植到 VHDL 中,同時(shí)還能幫助設(shè)置有更多組合結(jié)構(gòu)的用戶(hù)以恰當(dāng)?shù)姆绞皆?Vivado 中對(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ù)。
審核編輯:湯梓紅
-
反相器
+關(guān)注
關(guān)注
6文章
314瀏覽量
43693 -
vhdl
+關(guān)注
關(guān)注
30文章
819瀏覽量
128792 -
RTL
+關(guān)注
關(guān)注
1文章
386瀏覽量
60187 -
編譯
+關(guān)注
關(guān)注
0文章
668瀏覽量
33223 -
Work
+關(guān)注
關(guān)注
0文章
9瀏覽量
9103
原文標(biāo)題:如何使用 VHDL 中的 “work” 庫(kù)
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
主流的微前端的實(shí)現(xiàn)庫(kù)原理及其用法
SQLx在Rust語(yǔ)言中的基礎(chǔ)用法和進(jìn)階用法
如何生產(chǎn)VHDL 的庫(kù)文件
怎么在Vivado 2015.3中創(chuàng)建一個(gè)庫(kù)
可以將塊設(shè)計(jì)添加到庫(kù)中嗎?
ARM匯編語(yǔ)言跳轉(zhuǎn)指令的特殊用法還有嗎
模擬開(kāi)關(guān)特殊用法
簡(jiǎn)要說(shuō)明如何使用“work” 庫(kù)

如何得當(dāng)使用C語(yǔ)言的特殊的用法

如何在VHDL設(shè)計(jì)中使用庫(kù)模塊

你不可不知的STC單片機(jī)中特殊用法的IO

詳解C語(yǔ)言中特殊用法
如何使用ModelSim在VHDL中實(shí)現(xiàn)RAM

評(píng)論