Verilog語言和VHDL語言是兩種不同的硬件描述語言,但并非所有人都同時(shí)精通兩種語言,所以在某些時(shí)候,需要把Verilog代碼轉(zhuǎn)換為VHDL代碼。本文以通用的XHDL工具為例對(duì)Verilog轉(zhuǎn)換到VHDL過程中存在的問題進(jìn)行了總結(jié),歡迎批評(píng)指正。
當(dāng)我們剛開始學(xué)習(xí)FPGA時(shí),一定會(huì)遇到一個(gè)問題:
學(xué)習(xí)Verilog還是VHDL?
等我們學(xué)習(xí)FPGA到一定程度參加面試時(shí),面試者也會(huì)問你一個(gè)問題:
你以前用Verilog還是VHDL開發(fā)?
你已經(jīng)習(xí)慣某種語言,也發(fā)現(xiàn)語言不是學(xué)習(xí)FPGA時(shí)需要考慮的問題,它僅僅是硬件描述語言工具而已。可是,當(dāng)你發(fā)現(xiàn)一份和你使用語言不同的代碼作為參考時(shí),你又開始想:
我以后的工作是不是要二種語言都會(huì),這樣工作才會(huì)得心應(yīng)手?
事實(shí)上,兩種語言之間是可以相互轉(zhuǎn)換的。
對(duì)于我們做FPGA開發(fā)人員來說,如何快速在Verilog和VHDL之間互轉(zhuǎn),加快開發(fā)產(chǎn)品的進(jìn)度,而不是因?yàn)橹欢骋环N語言而局限了自己的開發(fā)。
Vivado可以看兩種語言的差異
Verilog與VHDL語法是互通且相互對(duì)應(yīng)的,如何查看二者對(duì)同一硬件結(jié)構(gòu)的描述,可以借助EDA工具,如Vivado,打開Vivado后它里面的語言模板后,也可以對(duì)比查看Verilog和VHDL之間的差異。
XHDL軟件
轉(zhuǎn)換所用軟件如下圖所示:
上圖是把轉(zhuǎn)換成VHDL格式的代碼,再轉(zhuǎn)換回verilog后與原代碼對(duì)比的圖,可以看出,一些注釋之類的信息都沒有了,原來的代碼規(guī)范和風(fēng)格也發(fā)生了變化。
在轉(zhuǎn)換的過程,該軟件對(duì)代碼中的漢語注釋不支持,如果出現(xiàn)漢字就無法轉(zhuǎn)換。
筆者之前就曾試著寫過Verilog轉(zhuǎn)VHDL代碼的工具,見:Verilog HDL代碼轉(zhuǎn)VHDL代碼,無奈因?yàn)椴皇擒浖_發(fā)出身,寫出來的東西通用性和完善性很差。寫到此處,再次想起漢天下董事長楊清華所說的話,互聯(lián)網(wǎng)講究的是差異化的商業(yè)模式,很牛的產(chǎn)品定義,早期不看銷售額而看流量,越快越好。這對(duì)IC是很可怕的事情,讓整個(gè)產(chǎn)業(yè)變得很浮躁。互聯(lián)網(wǎng)的模式,在某種程度上是毒瘤。發(fā)展集成電路芯片,需要把互聯(lián)網(wǎng)的模式認(rèn)知去除。芯片行業(yè)需要長期積累、持續(xù)關(guān)注,需要八年、十年的積累,這個(gè)耐心和耐性很重要。
試想一下,如果這么一個(gè)簡單的小軟件是互聯(lián)網(wǎng)領(lǐng)域經(jīng)常用到的,估計(jì)早已經(jīng)遍地都是了吧,并且也都很好用呢!
以下僅對(duì)Verilog轉(zhuǎn)VHDL過程中出現(xiàn)的問題進(jìn)行說明。
Xhdl軟件轉(zhuǎn)換后狀態(tài)機(jī)的問題
含有狀態(tài)機(jī)的Verilog代碼被xhdl軟件轉(zhuǎn)換后會(huì)出現(xiàn)兩種情況:
1、當(dāng)verilog代碼中parameter常量寫在緊挨著端口位置時(shí),xhdl軟件會(huì)將其轉(zhuǎn)換為vhdl中的generic內(nèi)的可傳遞的參數(shù),如圖:
2、當(dāng)parameter在其它地方出現(xiàn)時(shí),xhdl會(huì)將其轉(zhuǎn)換為constant常量,如圖:
無論哪種方式,將其中有錯(cuò)誤的地方改正后,都不會(huì)出現(xiàn)狀態(tài)機(jī)運(yùn)行出錯(cuò),也就是不用將這種狀態(tài)機(jī)書寫方式更改為vhdl語法中專門的狀態(tài)機(jī)書寫方式。
function轉(zhuǎn)換位置出現(xiàn)問題
在用xhdl軟件完成轉(zhuǎn)換后會(huì)出現(xiàn)function寫在了process塊內(nèi)的情況,出現(xiàn)此問題應(yīng)將function改在architecture下面(與定義信號(hào)在相同的位置)。
信號(hào)只能賦值給與它位寬類型相同的信號(hào)
如下圖中的兩個(gè)信號(hào):
b <= a;
在verilog中此種賦值方式意思是將a的前3位賦值給b,但是在vhdl中此種賦值方式會(huì)報(bào)出位寬不匹配的錯(cuò)誤,應(yīng)將其更改為:
b <= a(2 downto 0);
同時(shí)需要注意a、b的數(shù)據(jù)類型必須相同,如圖中必須都為std_logic_vector類型。
沒有邏輯與,需用其它辦法解決
在vhdl中沒有邏輯與(verilog中的&&),只有按位與(verilog中的&,vhdl中的and),所以verilog中的邏輯與,在vhdl中有時(shí)需要用等價(jià)的方式替換,比如:
需要替換為:
注意數(shù)據(jù)類型轉(zhuǎn)換符號(hào)使用的是否正確
在vhdl中有多種數(shù)據(jù)類型,它們之間可以通過數(shù)據(jù)類型轉(zhuǎn)換符號(hào)相互轉(zhuǎn)換。在xhdl軟件中,數(shù)據(jù)類型轉(zhuǎn)換一般都會(huì)出現(xiàn)錯(cuò)誤,具體的原因是轉(zhuǎn)換符號(hào)使用錯(cuò)誤,而在vhdl的語法書上介紹的并不全面。下面介紹幾中常用的數(shù)據(jù)類型轉(zhuǎn)換符號(hào):
1、IEEE.std_logic_1164.all庫中包含的:
(1)bit_vector to std_logic_vector :
(2)std_logic_vector to bit_vector :
2、IEEE.std_logic_arith.all庫中包含的:
integer to std_logic_vector :
3、IEEE.std_logic_signed.all庫中包含的:
std_logic_vector to integer :
注意:選用某種數(shù)據(jù)類型轉(zhuǎn)換符號(hào)的時(shí)候一定要確認(rèn)是否包含了相應(yīng)的庫。
其它轉(zhuǎn)換符號(hào)可以在如下圖的ise軟件相應(yīng)的目錄下查找
if后的判斷語句在某些情況會(huì)出現(xiàn)語法沒錯(cuò)誤邏輯出現(xiàn)錯(cuò)誤
此種情況比較少見,但是一般很難發(fā)現(xiàn),只有通過大量仿真找到錯(cuò)誤。具體情況如下圖:
原verilog代碼:
if((MDR_port_i&outport)==32'b0)
Xhdl軟件轉(zhuǎn)換后語法無錯(cuò)誤邏輯出現(xiàn)錯(cuò)誤:
IF((MDR_port_i/="0000000000000000000000000000000")ANDoutport/="0000000000000000000000000000000"=false)
修改后:
IF((MDR_port_iANDoutport)="0000000000000000000000000000000")
個(gè)人總結(jié):在原verilog代碼中,當(dāng)if后的判斷句出現(xiàn)按位與(&)時(shí),Xhdl軟件轉(zhuǎn)換成vhdl后很大可能會(huì)出現(xiàn)語法正確邏輯錯(cuò)誤。
并置運(yùn)算時(shí)遇到的問題
由于在verilog語法中,位寬不同的兩個(gè)信號(hào)也可以相互賦值,但是在vhdl中對(duì)此有嚴(yán)格要求位寬相同,而xhdl軟件在轉(zhuǎn)換的時(shí)候不會(huì)檢測(cè)這些,所以經(jīng)常會(huì)出現(xiàn)位寬不匹配的情況,尤其是在并置運(yùn)算時(shí),所以要嚴(yán)格檢查并置后的位寬與所賦值信號(hào)是否相同。
在verilog中某一信號(hào)可以賦值給幾個(gè)并置的信號(hào),但是在vhdl中不允許這么做,除非左側(cè)并置的都為std_logic類型信號(hào),右側(cè)為std_logic_vector類型信號(hào),注意此時(shí)在vhdl中并不是用“&”這個(gè)并置運(yùn)算符,而是“,”。(bit以及bit_vector是否有相似功能暫時(shí)未知)具體情況如圖:
錯(cuò)誤,因?yàn)閎是std_logic_vector類型
正確情況如下圖:
Bool類型的運(yùn)用以及會(huì)出現(xiàn)的問題
在verilog中幾個(gè)信號(hào)經(jīng)過關(guān)系運(yùn)算后返回的值是1或者0,但是在vhdl中返回的確是bool類型的值,也就是說返回的是true或者false。
1、vhdl中在if后的判斷條件最后必須為布爾類型,如圖:
2、verilog和vhdl中信號(hào)經(jīng)過關(guān)系運(yùn)算后返回值的區(qū)別,如圖:
When-else語句不能用在process塊內(nèi)
軟件轉(zhuǎn)換后的when-else語句常常被放在process塊內(nèi),導(dǎo)致出現(xiàn)問題。因?yàn)閣hen-else語句是并行信號(hào)賦值語句,它本身就相當(dāng)于一個(gè)進(jìn)程process,因此不能放在進(jìn)程體中。進(jìn)程是不能夠嵌套的。
位移操作左側(cè)為bit類型,右側(cè)為integer類型
Verilog中的位移運(yùn)算經(jīng)xhdl軟件轉(zhuǎn)換后必出現(xiàn)錯(cuò)誤,錯(cuò)誤的原因是轉(zhuǎn)換成vhdl代碼后位移符號(hào)兩側(cè)數(shù)據(jù)類型出錯(cuò),如圖
錯(cuò)誤情況:
修改后的正確格式:
位移符號(hào)左側(cè)應(yīng)該是bit類型,所以將std_logic_vector類型的信號(hào)轉(zhuǎn)換為bit類型,數(shù)字“63”默認(rèn)為integer類型,位移后的結(jié)果仍然為bit類型,所以需要將其裝換為std_logic_vector類型,并賦值給相同類型的信號(hào)。
真雙口RAM的IP核的使能信號(hào)
注意真雙口RAM的IP核的使能信號(hào)的數(shù)據(jù)類型,在頂層例化時(shí)要注意要只取使能信號(hào)第0位的與信號(hào)連接的方式。
由于真雙口RAM在例化后“wea”“web”為std_logic_vector(0 downto 0),所以要取這兩個(gè)端口的0位與信號(hào)連接。
while循環(huán)
在vhdl中不要使用while循環(huán),會(huì)出現(xiàn)問題,將while循環(huán)換為for循環(huán)
top層輸入輸出端口不接信號(hào)的情況
1、在top層,例化的某個(gè)模塊輸出端口不連信號(hào)時(shí),只需要在例化此模塊處將此端口刪除或注釋掉即可,如圖:
2、當(dāng)在top層例化的某一模塊的輸入端口無信號(hào)連接時(shí),必須將此端口處連接“U(未初始化)”狀態(tài)(理論上講將“U”換為“Z”也可以,但實(shí)際上會(huì)報(bào)出語法錯(cuò)誤,在vhdl語法書上說是連接“open”狀態(tài),實(shí)際測(cè)試也會(huì)報(bào)錯(cuò)),如圖:
case語句的注意事項(xiàng)
在vhdl的case語句的語法中,只有分支將所有條件都覆蓋后才可以不使用“when others =>”(相當(dāng)于verilog的default),但是實(shí)際中幾乎不可能包括所有情況(因?yàn)楸仨氝B高阻,不定態(tài)等狀態(tài)都包含進(jìn)去),所以需要在case語句分支條件增加“when others =>”。對(duì)于原verilog代碼中default后沒有任何表達(dá)式的情況,在vhdl中對(duì)應(yīng)的地方寫上“null”,如圖:
組合邏輯轉(zhuǎn)換時(shí)遇到的問題
當(dāng)含有“always(*)”這類組合邏輯的verilog代碼經(jīng)xhdl軟件轉(zhuǎn)換后以下兩種情況需要注意:
1、當(dāng)是三段式狀態(tài)機(jī)中的“always(*)”被轉(zhuǎn)換時(shí),注意去除其中的狀態(tài)常量。
2、由于vhdl規(guī)定case后的判斷條件必須是單一信號(hào),所以當(dāng)原verilog代碼中,case后面的判斷條件不是單一信號(hào),而是幾個(gè)信號(hào)的組合時(shí),xhdl軟件會(huì)將這幾個(gè)信號(hào)的組合用組合邏輯賦給一個(gè)新的信號(hào),后將新的信號(hào)放在case的判斷邏輯處,此時(shí)需要注意查看組合邏輯塊的觸發(fā)信號(hào)是否包含此新生成的信號(hào),具體如圖:
仿真時(shí)注意時(shí)鐘的問題(上板不會(huì)出現(xiàn)此問題)
在使用modelsim對(duì)vhdl代碼進(jìn)行仿真時(shí),會(huì)出現(xiàn)如圖的情況:
具體的操作就是對(duì)c_o信號(hào)打拍,可以發(fā)現(xiàn)第一拍沒有打上(實(shí)際是打上了),該測(cè)試程序的原理圖如圖:
C將時(shí)鐘clk_c_to_b和一個(gè)信號(hào)c_o傳遞給b,c_o使用時(shí)鐘clk生成的,在b內(nèi)用c給的時(shí)鐘來給c_o打拍。最后發(fā)現(xiàn)仿真之所以會(huì)出現(xiàn)上面的情況,主要是因?yàn)樵谀Kc內(nèi)對(duì)時(shí)鐘clk進(jìn)行了一次處理后賦給b(如在c內(nèi)部進(jìn)行了clk_c_to_b <= clk),導(dǎo)致出現(xiàn)了如下的波形情況:
如果你在使用VHDL與Verilog轉(zhuǎn)換過程中遇到了上面沒有提到的問題,歡迎留言討論。或者你有更好的辦法完成兩種語言之間的轉(zhuǎn)換,也請(qǐng)不吝賜教!
審核編輯:黃飛
-
RAM
+關(guān)注
關(guān)注
8文章
1354瀏覽量
114438 -
Verilog
+關(guān)注
關(guān)注
28文章
1343瀏覽量
109924 -
eda
+關(guān)注
關(guān)注
71文章
2685瀏覽量
172729 -
vhdl
+關(guān)注
關(guān)注
30文章
816瀏覽量
128045
原文標(biāo)題:Verilog代碼轉(zhuǎn)VHDL代碼經(jīng)驗(yàn)總結(jié)
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論