精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog到VHDL轉換的經驗與技巧總結

FPGA之家 ? 來源:網絡交換FPGA ? 2024-04-28 17:47 ? 次閱讀

Verilog語言和VHDL語言是兩種不同的硬件描述語言,但并非所有人都同時精通兩種語言,所以在某些時候,需要把Verilog代碼轉換為VHDL代碼。本文以通用的XHDL工具為例對Verilog轉換到VHDL過程中存在的問題進行了總結,歡迎批評指正。

當我們剛開始學習FPGA時,一定會遇到一個問題:

學習Verilog還是VHDL?

等我們學習FPGA到一定程度參加面試時,面試者也會問你一個問題:

你以前用Verilog還是VHDL開發?

你已經習慣某種語言,也發現語言不是學習FPGA時需要考慮的問題,它僅僅是硬件描述語言工具而已。可是,當你發現一份和你使用語言不同的代碼作為參考時,你又開始想:

我以后的工作是不是要二種語言都會,這樣工作才會得心應手?

事實上,兩種語言之間是可以相互轉換的。

對于我們做FPGA開發人員來說,如何快速在Verilog和VHDL之間互轉,加快開發產品的進度,而不是因為只懂某一種語言而局限了自己的開發。

Vivado可以看兩種語言的差異

Verilog與VHDL語法是互通且相互對應的,如何查看二者對同一硬件結構的描述,可以借助EDA工具,如Vivado,打開Vivado后它里面的語言模板后,也可以對比查看Verilog和VHDL之間的差異。

8c2786c8-04fd-11ef-a297-92fbcf53809c.jpg

8c4b4db0-04fd-11ef-a297-92fbcf53809c.jpg

8c67673e-04fd-11ef-a297-92fbcf53809c.jpg

XHDL軟件

轉換所用軟件如下圖所示:

8c81c0ac-04fd-11ef-a297-92fbcf53809c.jpg

8ca427d2-04fd-11ef-a297-92fbcf53809c.jpg

8cbf9c2e-04fd-11ef-a297-92fbcf53809c.jpg

上圖是把轉換成VHDL格式的代碼,再轉換回verilog后與原代碼對比的圖,可以看出,一些注釋之類的信息都沒有了,原來的代碼規范和風格也發生了變化。

在轉換的過程,該軟件對代碼中的漢語注釋不支持,如果出現漢字就無法轉換。

筆者之前就曾試著寫過Verilog轉VHDL代碼的工具,見:Verilog HDL代碼轉VHDL代碼,無奈因為不是軟件開發出身,寫出來的東西通用性和完善性很差。寫到此處,再次想起漢天下董事長楊清華所說的話,互聯網講究的是差異化的商業模式,很牛的產品定義,早期不看銷售額而看流量,越快越好。這對IC是很可怕的事情,讓整個產業變得很浮躁。互聯網的模式,在某種程度上是毒瘤。發展集成電路芯片,需要把互聯網的模式認知去除。芯片行業需要長期積累、持續關注,需要八年、十年的積累,這個耐心和耐性很重要。

試想一下,如果這么一個簡單的小軟件是互聯網領域經常用到的,估計早已經遍地都是了吧,并且也都很好用呢!

以下僅對Verilog轉VHDL過程中出現的問題進行說明。

Xhdl軟件轉換后狀態機的問題

含有狀態機的Verilog代碼被xhdl軟件轉換后會出現兩種情況:

1、當verilog代碼中parameter常量寫在緊挨著端口位置時,xhdl軟件會將其轉換為vhdl中的generic內的可傳遞的參數,如圖:

8ced25fe-04fd-11ef-a297-92fbcf53809c.jpg

2、當parameter在其它地方出現時,xhdl會將其轉換為constant常量,如圖:

8d030266-04fd-11ef-a297-92fbcf53809c.jpg

無論哪種方式,將其中有錯誤的地方改正后,都不會出現狀態機運行出錯,也就是不用將這種狀態機書寫方式更改為vhdl語法中專門的狀態機書寫方式。

function轉換位置出現問題

在用xhdl軟件完成轉換后會出現function寫在了process塊內的情況,出現此問題應將function改在architecture下面(與定義信號在相同的位置)。

8d163322-04fd-11ef-a297-92fbcf53809c.jpg

信號只能賦值給與它位寬類型相同的信號

如下圖中的兩個信號:

8d2ffd20-04fd-11ef-a297-92fbcf53809c.jpg

b <= a;

在verilog中此種賦值方式意思是將a的前3位賦值給b,但是在vhdl中此種賦值方式會報出位寬不匹配的錯誤,應將其更改為:

b <= a(2 downto 0);

同時需要注意a、b的數據類型必須相同,如圖中必須都為std_logic_vector類型。

沒有邏輯與,需用其它辦法解決

在vhdl中沒有邏輯與(verilog中的&&),只有按位與(verilog中的&,vhdl中的and),所以verilog中的邏輯與,在vhdl中有時需要用等價的方式替換,比如:

8d5276fc-04fd-11ef-a297-92fbcf53809c.png

需要替換為:

8d6a29a0-04fd-11ef-a297-92fbcf53809c.jpg

注意數據類型轉換符號使用的是否正確

在vhdl中有多種數據類型,它們之間可以通過數據類型轉換符號相互轉換。在xhdl軟件中,數據類型轉換一般都會出現錯誤,具體的原因是轉換符號使用錯誤,而在vhdl的語法書上介紹的并不全面。下面介紹幾中常用的數據類型轉換符號:

1、IEEE.std_logic_1164.all庫中包含的:

(1)bit_vector to std_logic_vector :

=to_stdlogicvector(bv_sig);

(2)std_logic_vector to bit_vector :

=to_bitvector();

2、IEEE.std_logic_arith.all庫中包含的:

integer to std_logic_vector :

=CONV_STD_LOGIC_VECTOR(,);

3、IEEE.std_logic_signed.all庫中包含的:

std_logic_vector to integer :

=CONV_INTEGER();

注意:選用某種數據類型轉換符號的時候一定要確認是否包含了相應的庫。

其它轉換符號可以在如下圖的ise軟件相應的目錄下查找

8d811d4a-04fd-11ef-a297-92fbcf53809c.jpg

if后的判斷語句在某些情況會出現語法沒錯誤邏輯出現錯誤

此種情況比較少見,但是一般很難發現,只有通過大量仿真找到錯誤。具體情況如下圖:

原verilog代碼:

if((MDR_port_i&outport)==32'b0)

Xhdl軟件轉換后語法無錯誤邏輯出現錯誤:

IF((MDR_port_i/="0000000000000000000000000000000")ANDoutport/="0000000000000000000000000000000"=false)

修改后:

IF((MDR_port_iANDoutport)="0000000000000000000000000000000")

個人總結:在原verilog代碼中,當if后的判斷句出現按位與(&)時,Xhdl軟件轉換成vhdl后很大可能會出現語法正確邏輯錯誤。

并置運算時遇到的問題

由于在verilog語法中,位寬不同的兩個信號也可以相互賦值,但是在vhdl中對此有嚴格要求位寬相同,而xhdl軟件在轉換的時候不會檢測這些,所以經常會出現位寬不匹配的情況,尤其是在并置運算時,所以要嚴格檢查并置后的位寬與所賦值信號是否相同。

在verilog中某一信號可以賦值給幾個并置的信號,但是在vhdl中不允許這么做,除非左側并置的都為std_logic類型信號,右側為std_logic_vector類型信號,注意此時在vhdl中并不是用“&”這個并置運算符,而是“,”。(bit以及bit_vector是否有相似功能暫時未知)具體情況如圖:

錯誤,因為b是std_logic_vector類型

8da39712-04fd-11ef-a297-92fbcf53809c.jpg

正確情況如下圖:

8db94f3a-04fd-11ef-a297-92fbcf53809c.jpg

Bool類型的運用以及會出現的問題

在verilog中幾個信號經過關系運算后返回的值是1或者0,但是在vhdl中返回的確是bool類型的值,也就是說返回的是true或者false。

1、vhdl中在if后的判斷條件最后必須為布爾類型,如圖:

8dcb7e80-04fd-11ef-a297-92fbcf53809c.jpg

2、verilog和vhdl中信號經過關系運算后返回值的區別,如圖:

8ddfc20a-04fd-11ef-a297-92fbcf53809c.jpg

When-else語句不能用在process塊內

軟件轉換后的when-else語句常常被放在process塊內,導致出現問題。因為when-else語句是并行信號賦值語句,它本身就相當于一個進程process,因此不能放在進程體中。進程是不能夠嵌套的。

位移操作左側為bit類型,右側為integer類型

Verilog中的位移運算經xhdl軟件轉換后必出現錯誤,錯誤的原因是轉換成vhdl代碼后位移符號兩側數據類型出錯,如圖

錯誤情況:

8df5fea8-04fd-11ef-a297-92fbcf53809c.jpg

修改后的正確格式:

8e0998e6-04fd-11ef-a297-92fbcf53809c.jpg

位移符號左側應該是bit類型,所以將std_logic_vector類型的信號轉換為bit類型,數字“63”默認為integer類型,位移后的結果仍然為bit類型,所以需要將其裝換為std_logic_vector類型,并賦值給相同類型的信號。

真雙口RAM的IP核的使能信號

注意真雙口RAM的IP核的使能信號的數據類型,在頂層例化時要注意要只取使能信號第0位的與信號連接的方式。

8e22226c-04fd-11ef-a297-92fbcf53809c.jpg

由于真雙口RAM在例化后“wea”“web”為std_logic_vector(0 downto 0),所以要取這兩個端口的0位與信號連接。

while循環

在vhdl中不要使用while循環,會出現問題,將while循環換為for循環

top層輸入輸出端口不接信號的情況

1、在top層,例化的某個模塊輸出端口不連信號時,只需要在例化此模塊處將此端口刪除或注釋掉即可,如圖:

8e5167c0-04fd-11ef-a297-92fbcf53809c.jpg

2、當在top層例化的某一模塊的輸入端口無信號連接時,必須將此端口處連接“U(未初始化)”狀態(理論上講將“U”換為“Z”也可以,但實際上會報出語法錯誤,在vhdl語法書上說是連接“open”狀態,實際測試也會報錯),如圖:

8e70072a-04fd-11ef-a297-92fbcf53809c.jpg

case語句的注意事項

在vhdl的case語句的語法中,只有分支將所有條件都覆蓋后才可以不使用“when others =>”(相當于verilog的default),但是實際中幾乎不可能包括所有情況(因為必須連高阻,不定態等狀態都包含進去),所以需要在case語句分支條件增加“when others =>”。對于原verilog代碼中default后沒有任何表達式的情況,在vhdl中對應的地方寫上“null”,如圖:

8e8b6330-04fd-11ef-a297-92fbcf53809c.png

組合邏輯轉換時遇到的問題

當含有“always(*)”這類組合邏輯的verilog代碼經xhdl軟件轉換后以下兩種情況需要注意:

1、當是三段式狀態機中的“always(*)”被轉換時,注意去除其中的狀態常量。

2、由于vhdl規定case后的判斷條件必須是單一信號,所以當原verilog代碼中,case后面的判斷條件不是單一信號,而是幾個信號的組合時,xhdl軟件會將這幾個信號的組合用組合邏輯賦給一個新的信號,后將新的信號放在case的判斷邏輯處,此時需要注意查看組合邏輯塊的觸發信號是否包含此新生成的信號,具體如圖:

8ea1aaaa-04fd-11ef-a297-92fbcf53809c.jpg

仿真時注意時鐘的問題(上板不會出現此問題)

在使用modelsim對vhdl代碼進行仿真時,會出現如圖的情況:

8eb7e086-04fd-11ef-a297-92fbcf53809c.jpg

具體的操作就是對c_o信號打拍,可以發現第一拍沒有打上(實際是打上了),該測試程序的原理圖如圖:

8ecfd0ce-04fd-11ef-a297-92fbcf53809c.png

C將時鐘clk_c_to_b和一個信號c_o傳遞給b,c_o使用時鐘clk生成的,在b內用c給的時鐘來給c_o打拍。最后發現仿真之所以會出現上面的情況,主要是因為在模塊c內對時鐘clk進行了一次處理后賦給b(如在c內部進行了clk_c_to_b <= clk),導致出現了如下的波形情況:

8ef02996-04fd-11ef-a297-92fbcf53809c.png

如果你在使用VHDL與Verilog轉換過程中遇到了上面沒有提到的問題,歡迎留言討論。或者你有更好的辦法完成兩種語言之間的轉換,也請不吝賜教!

審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1340

    瀏覽量

    114102
  • Verilog
    +關注

    關注

    28

    文章

    1330

    瀏覽量

    109632
  • eda
    eda
    +關注

    關注

    71

    文章

    2632

    瀏覽量

    171888
  • vhdl
    +關注

    關注

    30

    文章

    816

    瀏覽量

    127887

原文標題:Verilog代碼轉VHDL代碼經驗總結

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何快速在VerilogVHDL之間互轉

    VHDL過程中存在的問題進行了總結,歡迎批評指正。 當我們剛開始學習FPGA時,一定會遇到一個問題: 學習Verilog還是VHDL? 等我們學習FPGA
    的頭像 發表于 11-10 15:41 ?1.1w次閱讀
    如何快速在<b class='flag-5'>Verilog</b>和<b class='flag-5'>VHDL</b>之間互轉

    例說Verilog HDL和VHDL區別

    VerilogVHDL之間的區別將在本文中通過示例進行詳細說明。對優點和缺點的VerilogVHDL進行了討論。
    的頭像 發表于 12-20 09:03 ?1813次閱讀
    例說<b class='flag-5'>Verilog</b> HDL和<b class='flag-5'>VHDL</b>區別

    VHDLverilog中if判斷條件的一點小區別

    ,如果是boolean類型就能if(not a)了。verilog:if內容不論是什么類型,比如reg 或者wire ,都可以寫成if(!a)、if(a==1'b0)、if(~a)中的任何一種形式。注:上文為本人編寫邏輯時的一點經驗總結,不對之處多多指正。
    發表于 04-09 09:24

    VHDL編程的經驗總結

    VHDL編程的一些心得體會:VHDL是由美國國防部為描述電子電路所開發的一種語言,其全稱為(Very High Speed Integrated Circuit) Hardware Description Language。與另外一門硬件描述語言
    發表于 09-27 18:10 ?105次下載

    VHDLVerilog 黃金參考手冊

    這兩本書是對VHDLVerilog語言的詳細剖析,對初學者而言是快速上手的經典教材,對高手而言則是對語言深入了解的必備參考.
    發表于 07-08 15:53 ?154次下載

    VHDLVerilog HDL語言對比

    VHDLVerilog HDL語言對比 Verilog HDL和VHDL都是用于邏輯設計的硬件描述語言,并且都已成為IEEE標準。VHDL
    發表于 02-09 09:01 ?1w次閱讀

    Verilog HDL與VHDL及FPGA的比較分析

    Verilog HDL與VHDL及FPGA的比較分析. Verilog HDL優點:類似C語言,上手容易,靈活。大小寫敏感。在寫激勵和建模方面有優勢。
    發表于 01-11 10:45 ?1293次閱讀

    VHDL,Verilog,System verilog比較

    本文簡單討論并總結VHDLVerilog,System verilog 這三中語言的各自特點和區別 As the number of enhancements
    發表于 01-17 11:32 ?0次下載

    verilogVHDL相互轉化軟件

    一款基于verilogVHDL相互轉化的軟件,用著很方便,很實用。
    發表于 03-21 17:26 ?20次下載

    VHDLVerilog互轉的軟件

    VHDLVerilog互轉的軟件, X-HDL v4.21 Crack.zip
    發表于 06-03 16:16 ?10次下載

    Xilinx Sdram 參考設計:含VerilogVHDL

    Xilinx FPGA工程例子源碼:含VerilogVHDL版本級詳細說明文檔
    發表于 06-07 14:54 ?0次下載

    Verilog/VHDL語法學習是掌握基本代碼設計的技能以及經驗總結

    無論是VHDL還是Verilog,建議初學者先掌握其中一門。
    的頭像 發表于 12-19 13:09 ?7096次閱讀
    <b class='flag-5'>Verilog</b>/<b class='flag-5'>VHDL</b>語法學習是掌握基本代碼設計的技能以及<b class='flag-5'>經驗總結</b>

    vhdlverilog的區別_vhdlverilog哪個好?

    VHDL全名Very-High-Speed Integrated Circuit Hardware Description Language,誕生于1982年。1987年底,VHDL被IEEE和美
    發表于 03-23 16:43 ?12.3w次閱讀
    <b class='flag-5'>vhdl</b>和<b class='flag-5'>verilog</b>的區別_<b class='flag-5'>vhdl</b>和<b class='flag-5'>verilog</b>哪個好?

    vhdl轉換verilog_VHDLVerilog誰更勝一籌

    今天給大家分享一個VHDLVerilog的工具。很多新手初次學習FPGA都曾遇到過一個問題:是學Verilog OR VHDL
    發表于 08-25 09:22 ?6515次閱讀
    <b class='flag-5'>vhdl</b><b class='flag-5'>轉換</b>為<b class='flag-5'>verilog_VHDL</b>和<b class='flag-5'>Verilog</b>誰更勝一籌

    探討VHDLVerilog模塊互相調用的問題

    1、 關于如何在VHDL模塊調用一個Verilog模塊 在VHDL模塊聲明一個要與調用的Verilog模塊相同名稱的元件(component),元件的名稱和端口模式應與
    的頭像 發表于 04-30 14:06 ?9720次閱讀
    探討<b class='flag-5'>VHDL</b>和<b class='flag-5'>Verilog</b>模塊互相調用的問題