衡阳派盒市场营销有限公司

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

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

3天內不再提示

關于VHDL編碼風格

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-07-04 09:33 ? 次閱讀

挺久沒有更新,今天更新一篇小文章。最近正在整理一個SDRAM控制器教程(VHDL),現在更新的小文章是想為后續的SDRAM教程以及其它比較大的教程做鋪墊。本文主要講關于VHDL編碼風格(Verilog也可以用同樣的思想),這篇文章的核心思想就是:設計中的所有狀態都應該被明確聲明在寄存器中。

這句話什么意思先不談,直接上兩段代碼,第一段如下:

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.ff.all; -- 一些常用的元件包,這里面是可以自己寫的

-- 這篇文章主要就調用了基本的D觸發器,里面還有什么可以先忽略

entity Bad_Counter is generic( n: integer := 4 ); port( clk, rst: in std_logic;

output: buffer std_logic_vector(n-1 downto 0) );end Bad_Counter;

architecture impl of Bad_Counter issignal nxt: std_logic_vector(n-1 downto 0);begin process(clk) begin

if rising_edge(clk) then

if rst then

output 《= (others =》 ‘0’);

else

output 《= output + 1;

end if;

end if; end process;end impl;

一個4位計數器,能實現設計的功能,但其中output 《= output + 1存在一點問題,這種寫法非常C語言化,這也是很多人習慣的寫法。為什么說這種寫法不好,因為它混淆了當前狀態和下一狀態。先不多解釋,看下一段代碼如下:

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.ff.all; -- 一些常用的元件包,這里面是可以自己寫的

-- 這篇文章主要就調用了基本的D觸發器,里面還有什么可以先忽略

entity Good_Counter is generic( n: integer := 4 ); port( clk, rst: in std_logic;

output: buffer std_logic_vector(n-1 downto 0) );end Good_Counter;

architecture impl of Good_Counter is signal nxt: std_logic_vector(n-1 downto 0);begin nxt 《= (others=》‘0’) when rst else output+1;

count: vDFF generic map(n) port map(clk, nxt, output);end impl;

這段代碼同樣的是4位計數器,為什么用這兩段代碼做比較,非常典型,第一段代碼的思想就是C語言的思想來寫的,很多人可能沒有注意自己在寫“數字電路”,也沒有特別關注寫出來的代碼綜合出來是什么樣子。第二段代碼明確表明nxt是下一狀態,并且nxt是通過當前狀態output得到的,這很重要,與此同時還調用了一個D觸發器元件,這個D觸發器為什么用,之前在異步FIFO(二)中有談到:在實現所有的狀態變量都應該被明確的聲明位D觸發器,不要讓編譯器去推斷應該用什么觸發器。

講到這里,可能還是不懂這兩份代碼有什么具體的差別,我做了一個實驗,把兩份代碼都綜合了一遍,使用了兩個不同的版本,Quartus20.3和Quartus13.1(不同版本的軟件,無論是效率還是開發便捷程度還是有一定差別的)

先看Quartus13.1綜合出的兩份原理圖

940b584a-fb2e-11ec-ba43-dac502259ad0.png

這幅原理圖是第一份代碼綜合出來了,大概看一下沒什么問題,代碼也是這樣寫的。

再看第二份代碼綜合出來的原理圖

9425db3e-fb2e-11ec-ba43-dac502259ad0.png

區別來了,很明顯,第一份代碼因為用output <= output + 1的原因,左右兩端使用了相同的信號,混淆當前狀態和下一狀態,下一狀態被隱藏起來。但第二份代碼綜合出來的很明顯,nxt是下一狀態,并且nxt是通過當前狀態output得到的。當然還要個比較好的地方,第二份代碼直接調用D觸發器元件(在package里面寫了),告訴編譯器狀態變量要聲明為D觸發器,而不是讓編譯器自己判斷(盡管它可以)。

再看Quartus20.3綜合出來的原理圖

94400d92-fb2e-11ec-ba43-dac502259ad0.png

這個原理圖是第一份代碼Bad_Counter 綜合出來的,很顯然現在的EDA真行,可以把不那么優秀的代碼綜合出優秀代碼才能綜合出的原理圖了。當然這是很簡單代碼的情況下。

945799f8-fb2e-11ec-ba43-dac502259ad0.png

這個原理圖是第二份代碼Good_Counter綜合出來的,除了下一狀態的命名和位數區間不一樣外,其它的兩個代碼綜合出來的沒有區別!

小結:從上面的四幅原理圖看,盡管隨著EDA的發展讓不那么優秀的代碼綜合出和優秀代碼一樣的原理圖,但良好編碼風格的代碼仍然非常必要,即使是13.1和20.3巨大版本差異的情況下,良好編碼風格的代碼綜合出來的原理圖也是一樣的。但在代碼風格不好的情況下,13.1和20.3卻有比較大的差距。人作為設計的主體,不能完全依靠EDA的優化,編譯器也不是萬能的,有些其它地方未必會優化的那么好,在大型復雜項目中不太好的編碼風格可能編譯器也未必能夠給出比較好的優化,好的編碼風格可以讓我們更好的理解一些底層的設計,也能知道代碼會如何綜合。更重要的是需要知道自己數字設計師!用數字的思想去設計FPGA。這些只是自己的意見,大家可以做一個參考,有不對的地方也歡迎批評指正。

審核編輯 :李倩

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

    關注

    31

    文章

    5363

    瀏覽量

    121199
  • vhdl
    +關注

    關注

    30

    文章

    817

    瀏覽量

    128346

原文標題:VHDL的編碼風格(Verilog也可參考思想)

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

收藏 人收藏

    評論

    相關推薦

    信道編碼和信源編碼的區別

    信道編碼和信源編碼是數字通信系統中兩個至關重要的環節,它們各自承擔著不同的功能和角色。
    的頭像 發表于 01-29 16:29 ?149次閱讀

    MT-HIL(4):如何在Simulink下使用HDL Coder導出FPGA/VHDL代碼

    vhdl
    芒果樹數字
    發布于 :2025年01月10日 17:22:17

    Verilog與VHDL的比較 Verilog HDL編程技巧

    Verilog 與 VHDL 比較 1. 語法和風格 Verilog :Verilog 的語法更接近于 C 語言,對于有 C 語言背景的工程師來說,學習曲線較平緩。它支持結構化編程,代碼更直觀,易于
    的頭像 發表于 12-17 09:44 ?362次閱讀

    FPGA編碼風格介紹

    組合邏輯環路(Combinational Loops):指組合邏輯的輸出信號不經過任何時序邏輯電路(FF等),而直接反饋到輸入節點,從而構成的電路環路。
    的頭像 發表于 11-15 10:49 ?279次閱讀
    FPGA<b class='flag-5'>編碼</b><b class='flag-5'>風格</b>介紹

    求助vhdl

    vhdl 技術
    發表于 11-13 11:35

    風華貼片電容物料編碼如何看?

    風華貼片電容的物料編碼規則通常包含多個部分,每個部分都代表了不同的信息。以下是關于如何解讀風華貼片電容物料編碼的分點表示和歸納: 1、電容數值: 編碼的第一至第三位數字表示電容的數值,
    的頭像 發表于 11-04 15:33 ?313次閱讀
    風華貼片電容物料<b class='flag-5'>編碼</b>如何看?

    增量編碼器和絕對值編碼器是什么

    工業編碼器是一類傳感器,是在工業自動化閉環控制和數字化轉型物理感知重要的傳感器。關于傳感器的宣傳已很多,但是對于編碼器這么重要的傳感器,大家的認識還是模糊的。
    的頭像 發表于 10-22 14:23 ?475次閱讀
    增量<b class='flag-5'>編碼</b>器和絕對值<b class='flag-5'>編碼</b>器是什么

    有沒有關于PDM信號編碼格式輸出的IC呢?

    請教一下大家,有沒有關于PDM信號編碼格式輸出的IC呢? 比如PCM轉PDM或者I2S什么的轉PDM?
    發表于 10-15 07:37

    磁電編碼器和光電編碼器的區別

    磁電編碼器和光電編碼器是兩種不同類型的編碼器,它們在原理、結構、性能和應用領域上都有所不同。 磁電編碼器和光電編碼器的區別 1. 引言
    的頭像 發表于 10-12 09:54 ?1636次閱讀

    【招聘】verilog vhdl FPGA

    1.熟悉FPGA架構及應用,熟悉圖像算法的FPGA實現。 2.熟悉verilog vhdl,熟悉Xilinx或Intel等開發工具。 3.有AI算法 fpga實現經驗優先。 4.本科及以上學歷,碩士優先。具有強烈的責任心,執行力,良好的溝通能力和團隊合作能力。
    發表于 09-02 15:50

    編碼器在機器人系統中的應用

    隨著科技的飛速發展,機器人技術已廣泛應用于工業、醫療、服務等多個領域。在機器人系統中,編碼器作為核心的位置和速度檢測裝置,發揮著至關重要的作用。本文將從編碼器的原理、分類及其在機器人系統中的應用等方面進行詳細闡述,旨在為讀者提供關于
    的頭像 發表于 06-13 14:51 ?966次閱讀

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

    Verilog與VHDL語法是互通且相互對應的,如何查看二者對同一硬件結構的描述,可以借助EDA工具,如Vivado,打開Vivado后它里面的語言模板后,也可以對比查看Verilog和VHDL之間的差異。
    的頭像 發表于 04-28 17:47 ?2672次閱讀
    Verilog到<b class='flag-5'>VHDL</b>轉換的經驗與技巧總結

    伺服編碼器分辨率越高越快嗎?

    。較高的分辨率意味著編碼器能夠提供更精確的位置或運動反饋信息。 然而,關于伺服編碼器分辨率與速度之間的關系,并沒有直接的等號關系。分辨率高主要代表編碼器的精度和位置信息的細致程度,而速
    的頭像 發表于 03-21 08:43 ?1197次閱讀
    伺服<b class='flag-5'>編碼</b>器分辨率越高越快嗎?

    請問Systemverilog中如何使用VHDL的package?

    現在需要使用system verilog寫代碼,但是想復用之前VHDL的package,里面有寫的現成的function等,請問如何調用呢。總是報錯說找不到_pkg
    發表于 03-12 15:37

    基于VHDL的組合邏輯設計

    電子發燒友網站提供《基于VHDL的組合邏輯設計.ppt》資料免費下載
    發表于 03-11 09:23 ?2次下載
    百家乐官网桌14人| 大发888娱乐能借钱| 重庆百家乐团购百嘉乐量贩KTV地址| 百家乐官网娱乐城地址| 百家乐官网送彩金平台| 百家乐官网视频双扣游戏| 速博娱乐| 博狗娱乐场| 皇冠网热门小说| 百家乐官网注册开户| 电子百家乐官网博彩正网| 贡山| 广州市| 澳门百家乐官网赢钱窍门| 柘荣县| 百家乐官网分析绿色版| 百家乐官网公开| 神话百家乐官网的玩法技巧和规则 | 百家乐官网三宝| 缅甸百家乐官网娱乐场开户注册 | 百盛百家乐的玩法技巧和规则| 现金百家乐官网伟易博| 百家乐官网园棋牌| 百家乐官网百战百胜| 太阳百家乐官网代理| 使用的百家乐软件| 大发888真人游戏| 网络博彩公司| 百家乐官网起步多少| 百家乐官网能战胜吗| 免佣百家乐官网规则| 百家乐官网二路珠无敌稳赢打法| 真人百家乐官网斗地主| 罗盘24方位| 百家乐看图赢钱| 六合彩现场报码| 百家乐官网台布兄弟 | 韩国百家乐官网的玩法技巧和规则| 赌百家乐官网的玩法技巧和规则 | 视频棋牌游戏| 澳门百家乐官网娱乐城怎么样|