Verilog HDL設計技巧——基本要素

2021-02-13 玩兒轉FPGA

轉載自:IC_learner的博客,點擊閱讀原文可查看

Verilog基本上熟悉了,繼續整理一下Verilog的學習筆記吧。前面記載了Verilog的結構,寫Verilog的結構有了,但是該怎麼寫呢?在寫之前就得了解一下Verilog的一些基本要素了,也就是Verilog是怎麼一點一點寫出來的。

 

一、標識符與注釋

前面已經說到,模塊名的定義要符合標識符的定義,那麼什麼是標識符呢?它的語法是什麼呢?

  ①標識符是賦給對象的唯一名稱,通過標識符可以提及相應的對象,Verilog語法將對轉義標識符中的字符逐個處理。

  ②標識符可以是字母、數字、下劃線和美元符$的組合,並且標識符的第一個字母必須是字母或者是下劃線。此外,在Verilog的標識符中,是區分大小寫的。

  ③Verilog中有一些關鍵字,簡單地了解就是,預定義好了的,用來說明語言節後的標識符,都是小寫的。標識符不能和關鍵字重複。

  ④Verilog中還有一種叫做轉義標識符的東西,定義為以\(反斜槓)符號開頭,以空白結尾(如一個空格)的字符。如\initial就是一個轉義字符。轉義標識符和關鍵字是不一樣的,比如\initial是非關鍵字,而initial是關鍵字。

語言中總需要一些注釋的,Verilog中兩種注釋方法:

  ①以/*開始注釋,*/結束注釋,即/* 注釋內容*/,可以多行注釋。

  ②以//開頭,這種注釋只能注釋一行

二、常量

對於一門語言,我們總可言考慮它的常量有哪些,變量有哪些,現在就讓我們看看Verilog中的常量有哪些吧。

1)數值邏輯

數字邏輯就是一種狀態,可言說說一種常量了,有下面的知識點/注意點:

  ①Verilog中有四種羅家數值:邏輯0,邏輯1,x:未知態,Z高阻態;其中x、z是不區分大小寫的;在verilog中,表達式和邏輯門輸入的z通常解釋為x,也就是不定態,不能確定這個邏輯值是1還是0。

  ②實際電路中只有0或者1,沒有x和z,當你給電路中設置為x或z時,由編譯軟體或者綜合軟體等EDA軟體決定電路最終是0或者1.

2)數值

一個數也是一種常量。

  ①Verilog中主要可以這麼對數值進行組合,整數和實數,有符號數和無符號數。在Verilog中,下劃線』_』可以隨意用在整數和實數中,沒有實際意義,只是提高了可讀性。

  ②對於Verilog中的整數,可以分為簡單的十進位數和基數表示的整數。

One:簡單的十進位格式的整數定義為帶有「+」或者「-」操作符的數字序列,你如45表示十進位數45,-45表示十進位數-45。

注意,簡單的十進位數格式的整數代表一個有符號的數,其中負數可使用兩種補碼形式表示。下面舉例子進行說明:

對於簡單的十進位32,它是一個有符號的數,由於二進位中才對有無符號進行區分,因此它在二進位中,用6位表示就是100000或者用7位表示就是0100000(最高位是符號位);對於簡單的十進位數-15,在二進位中,用5位表示就是10001,用6位表示就是110001(最高位是符號擴展位)。

Two:基數格式的整數格式是:[位寬]』基數 數值,位寬是一個數值,表示數值位長,基數可以是二進位(b)、八進位(o)、十進位(d)、十六進位(h),字母不區分大小寫,不然7』d100表示7位的十進位數100。

  ③實數有十進位計數法(如2.0)和科學計數法,但是根據Verilog的定義,實數都通過四捨五入隱式的轉換為最相近的整數。

(3)字符串

字符串是雙引號內的字符序列,不能分成多行寫。此外,字符串是8位ASCII值的序列,比如「char」這個字符串,就要8x4=32bit寄存器存儲它。一些綜合器是不支持字符串的。

(4)參數

通過parameter 、localparam等定義的參數,也可以看成是常量,它們的格式記錄在前面一篇的博文裡面了。

 

三、變量--數據類型

 

  在Verilog中,它的變量可以用另外的名稱代替:數據類型。Verilog的數據類型是一種「變量」,用來表示數字電路硬體中的數據存儲和傳送元素。Verilog中主要有兩大數據類型(變量):線網類型和寄存器類型。

(1)線網類型

  ①線網類型主要表示表示Verilog中的結構化元件之間的物理連線,其數值由驅動單元決定;如果沒有驅動元件連接到網線上,則其默認值為高阻z。此外線網類型的變量只能用assign進行賦值驅動,不能在always中進行賦值。

(可綜合的線網類型:)

  ②線網類型中的wire變量是最常用的,它可以最為任何表達式的輸入,也可以用做assign語句和模塊例化的輸出。Wire的取值是0、1、x、z。此外雖然Verilog語法允許wire類型的數據變量允許多個驅動源,但是僅用於仿真當中,綜合中任何變量連接多個驅動源都是錯誤的

  ③tri線網類型,這個類型與wire類型功能幾乎一樣,但是當總線上需要描述高阻態的特性時,用它來描述以跟wire進行區分。

  ④supply1和supply0線網類型:supply1用來對電源建模,即高電平1,;supply0用來對低電平進行建模,即低電平0。

(不可綜合,進用於仿真的線網類型:)

  ⑤wor(線或)、trior(三態或):專門用於單信號多驅動;

  Wand(線與)、triand(三態與):專門用於多驅動源;

  Trireg:具有電荷保持特性的連線;

  Tri1:上拉電阻;tri0:下拉電阻。

(2)寄存器類型

  ①寄存器型變量,都有「寄存特性」,即在接受下一個賦值之前,將保持原值不變。寄存器變量沒有強度之分,且所以的寄存器類型變量都必須明確給出類型說明(無默認狀態)。

(可綜合的寄存器類型:)

  ②最常用的是reg類型的寄存器變量。寄存器變量可以取任意長度,默認值未知,reg類型的數據可以是正值或者負值。但當一個reg類型的數據是一個表達式的操作數時,它的值被當做無符號數,即正值(比如,你定義了reg  [3:0] a;...a = -2;那麼由於-2的補碼是1110,a中存儲的值是1110,也就是值其實是14)。

  ③integer類型,這種類型是整數寄存器類型,可以作為32位的普通寄存器使用,但是不能直接取這個變量的某一位,而是通過把這個變量賦予給一個32位的reg變量,對reg變量進行操作。

  ④賦值注意:賦值總是從最右端的位向最左端的位進行;任何多餘的位將被截斷。此外由於整數的負數形式實質上是以補碼向量表示的,因此需要注意賦值的位寬。

  ⑤reg的擴展類型——memory類型:reg   [n-1:0]   存儲器名   [m-1:0] ;(表示深度是m,字寬是n的存儲器,可以存儲mxn個bit)。此外不能直接對memory進行讀寫,而是先定義一個地址寄存器,通過這個地址寄存器進行索引,再取值。

(不可綜合,僅用於仿真的寄存器變量有:)

  ⑥time類型:用於存儲和處理時間,只存儲無符號數;

  Real類型:實數類型;realtime類型;

由於這種電路設計中不常用,所以不過多記載。

 

四、運算符

 

  在Verilog中,所謂的運算符就是用來進行運算的,根據運算符所帶的操作數的個數,可以分為單目、雙目、三目。然後我們還是喜歡根據功能進行劃分,大概有9種功能類型的運算符。

(1)賦值運算符

  ①賦值運算分為連續賦值和過程賦值。

  ②連續賦值語句,也成為數據流描述方式,用assign關鍵字表示,賦值符號是「=」,只能對線網賦值。

一個線網型變量一旦被連續賦值語句賦值之後,賦值語句右端賦值表達式的值將連續對被賦值變量產生連續驅動。只要右端表達式任一個操作數的值發生變化,就會立即出發對被賦值變量的更新操作。

  ③過程賦值,主要用於initial模塊和always模塊中的賦值語句。

在過程塊中,只能使用過程賦值語句,同時過程賦值語句也只能用在過程賦值模塊中。

過程賦值的賦值符號是「=」「<=」,分別表示阻塞賦值和非阻塞賦值。這兩種賦值在後面的章節中會有講解,前面寫的博文也有一些介紹:

http://www.cnblogs.com/IClearner/p/7188875.html 。

 

(2)算術運算符

  ①算術運算符又稱為二進位運算符,有+(加)、-(減)、*(乘)、/(除)、%(取餘)。

  ②+、-、*是可以綜合的,/和%只有在除數或者模值是2的整數次(2、4、8...)的時候才是可以綜合。

  ③在進行乘除運算時,結果值會略去小數部分;在取餘操作中,結果的符號位和取餘運算第一位操作數的符號位保持一致(-12/(6/4),符號位與-12一致)。

  ④在進行基本算術運算時,如果某一操作數有不確定的值x,則運算結果也是不確定值x。

  ⑤算術表達式結果的位寬由位寬最大的操作數決定;在賦值賦值語句中(無論是連續還是過程賦值),算術操作的結果的位寬由操作符左端目標位寬決定;在較長的表達式中,中間結果的位寬應取最大操作數的位寬;此外由於位寬的關係,在運算是要進行位寬保留,也就是結果位寬取大一點,防止溢出。

  ⑥有無符號的算術運算討論:在設計中,所有的算術運算都是按照無符號數進行的;如果要完成有符號數的計算,對於加減操作,通過補碼處理即可用無符號加法完成;對於乘法操作,無符號數直接採用「*」操作,有符號數,通過定義輸入輸出和中間變量的符號類型為signed來處理。

 

(3)邏輯運算符

①邏輯運算符有:邏輯與&&、邏輯或||和邏輯非!;其中&&和||是雙目運算符,運算結果是一位;!是單目運算符,結果是一位。

 

(4)關係運算符

①關係運算符有8種:大於(>)、大於等於(>=)、小於(<)、小於等於(<=)、邏輯相等(==)、邏輯不相等(!=)、全等(===)、全不等(!==)。

②關係運算符的結果是1位(包括1、0、x、z)。

③「===」和「!==」可以比較含有x和z的操作數,但是由於實際硬體中不存在x態和z態,在綜合時將按照「==」和「!=」來進行;其實際的功能僅用在仿真中。

 

(5)條件運算符

①條件運算符,三目運算符:(條件表達式)?():();

 

(6)位運算符

①位運算符有:按位與(&)、按位或(|)、按位反(~)、按位異或(^)、按位同或(^~或者~^)。除~外,都是雙目運算符。

②運算結果可能是多位(每一個操作數的對應位進行運算,得出的結果也是各個位運算「拼」起來的結果),不僅僅是1為,注意與邏輯運算符的區別!,此外如果兩個操作數的長度不相等,將會對較短的數進行高位補0,然後進行相應的位運算,使輸出結果的長度與位寬的操作數保持一致。

 

(7)拼接運算符

①拼接運算符可以將兩個或者更多信號的某些位拼接起來進行運算操作,{a1,b1,c1...}這樣子拼接,拼接運算也可以複製一個常量或者變量。

 

(8)移位運算符

  ①移位運算符有兩個:左移(<<)、右移(>>),移位過程中都用0來填補移出的空位,左移會引起位數擴大,而右移則不會(如4』b1101<<2 = 6』b110100);因此要注意移位後變量的位數,以及存儲移位後結果的存儲器/線網位寬。

  ②左移相當於乘2,而右移相當於除2,在實際運算中,經常通過不同移位數的組合來計算簡單的乘法和除法,比如result=data*19中,因為20=16 + 2 + 1=2^4+2^1+2^0,所以result = data<<4 + data<<1+data;(當然實際代碼中不是這樣的,而是在always塊中進行不同的移位,中間寄存器進行存儲移位結果,然後用assign語句進行加起來)

 

 

(9)一元簡約/歸約運算符

  ①一元歸約運算符是單目運算符,操作數放在右邊,操作符有歸約與(&)、歸約或(|)、歸約與非(~&)、歸約或非(~|)、歸約異或(^)、歸約同或(~^),運算形式是(?):首先將操作數的第一位和第二位進行相應的與、或等操作,然後再講運算結果和第三位進行操作,依次類推直至最後一位。

跨時鐘域處理之同步器

十天學會FPGA之四——UART通信原理詳解

十天學會FPGA之三——testbench的寫法

十天學會FPGA之二——眨眼學會PWM

十天學會FPGA之一——ISE的使用

VIVADO導出抓取數據,ucf轉xdc,壓縮bit文件

ModelSim仿真實例入門

資深FPGA「老司機」設計精華總結

FPGA從零開始到大神怎麼學

時序約束到底是要幹嘛?

觸發器是怎樣實現邊沿出發的?

FPGA裡面的LUT是什麼作用?

相關焦點

  • Verilog HDL程序設計——基本要素
    在寫之前就得了解一下Verilog的一些基本要素了,也就是Verilog是怎麼一點一點寫出來的。 前面已經說到,模塊名的定義要符合標識符的定義,那麼什麼是標識符呢?它的語法是什麼呢?①標識符是賦給對象的唯一名稱,通過標識符可以提及相應的對象,Verilog語法將對轉義標識符中的字符逐個處理。
  • Verilog常見必備面試題
    使用verilog hdl實現具有同步RESET和SET的觸發器,具有異步RESET和SET的觸發器。異步reset和setalways@(posedge clk or negedge reset or posedge set)begin  if(set)  Q<=1;    else if(!
  • 編寫高效的測試設計(testbenches)
    對於大的系統,如幾百萬門的設計,工程師們一般使用一套可靠的驗證工具。當然,對於一些小的設計,設計工程師常常發現帶有測試的hdl仿真器就可以做得很好。  測試設計已經成為一個驗證高級語言設計HLL (High-Level Language) 的標準方法。
  • HDLBits:在線學習Verilog(七 · Problem 30-34)
    下面給出了一個基本的if語句和其綜合出來的電路。解答與分析// synthesis verilog_input_version verilog_2001module top_module( input a, input b, input sel_b1, input sel_b2, output wire out_assign,
  • 分享程序--Verilog HDL代碼分析及整理軟體
    同時該軟體也可用於團隊項目開發,有利於形成統一的代碼規範標準,提高設計的效率,也可以用於教學。2.2功能該軟體是一款對Verilog HDL描述的行為級代碼進行自動分析整理的軟體,具有代碼分析功能和自動整理功能。
  • 細談FPGA之Verilog HDL語法(一)
    這些抽象的級別和它們對應的模型類型共有以下五種:系統級(system): 用高級語言結構設計實現模塊的外部功能。算法級(algorithm): 用高級語言結構設計實現算法。RTL級(RegisterTransfer Level):描述數據在寄存器之間流動和如何處理和控制這些數據;門級(gate-level):描述邏輯門以及邏輯門之間的連接。
  • 零基礎學FPGA(五)Verilog語法基基礎基礎(下)
    (3)函數和任務都包含在設計層次中,可以通過層次名對他們實行調用。這句話什麼意思啊?  10、系統任務  (1)$diplay和$write任務  $display任務相當於C語言裡的printf,用於輸出信息,他的基本格式$display (p0,p1,p2);意思就是把p1、p2以p1的格式輸出,至於具體格式,C語言裡面講的很清楚,下面用一張圖幫大家回憶一下
  • Verilog代碼轉VHDL代碼經驗總結
    含有狀態機的Verilog代碼被xhdl軟體轉換後會出現兩種情況:1、當verilog代碼中parameter常量寫在緊挨著埠位置時,xhdl軟體會將其轉換為vhdl中的generic內的可傳遞的參數,如圖:
  • Verilog HDL基礎教程之:程序基本結構
    Verilog HDL是一種用於數字邏輯電路設計的語言。用Verilog HDL描述的電路設計就是該電路的Verilog HDL模型。Verilog HDL既是一種行為描述的語言,也是一種結構描述的語言。
  • 基於Verilog HDL的SVPWM算法的設計與仿真
    基於硬體的FPGA/CPLD晶片能滿足該算法對處理速度、實時性、可靠性較高的要求,本文利用Verilog HDL實現空間矢量脈寬調製算法,設計24矢量7段式的實現方法,對轉速調節和轉矩調節進行仿真,驗證了設計的實現結果與預期相符。
  • Verilog HDL基礎之:程序基本結構
    Verilog HDL是一種用於數字邏輯電路設計的語言。用Verilog HDL描述的電路設計就是該電路的Verilog HDL模型。Verilog HDL既是一種行為描述的語言,也是一種結構描述的語言。也就是說,既可以用電路的功能描述,也可以用元器件和它們之間的連接來建立所設計電路的Verilog HDL模型。
  • 學會使用Hdlbits網頁版Verilog代碼仿真驗證平臺
    點擊藍字關注我們FPGA之家-中國最好最大的FPGA純工程師社群大家推薦一款網頁版的 Verilog代碼編輯仿真驗證平臺,這個平臺是國外的一家開源FPGA學習網站,通過「https://hhdlbits.01xz.net/wiki/Main_Page」地址連結進入網頁,在該網頁上可以進行Verilog代碼的編寫、綜合,而且最後還能夠仿真出波形來驗證設計代碼的正確性,該驗證平臺是基於Icarus Verilog(簡稱iVerilog,比較著名的開源HDL仿真工具,也有對應的安裝版本)的,讓你隨時隨地只需登錄網頁就能夠享受Verilog編程仿真的樂趣!
  • 關於學習verilog
    在邏輯詳細設計方案這一級的時候,我們已經將各級模塊的接口時序都設計出來了,各級模塊內部是怎麼實現的也基本上確定下來了。  由於做到這一點,在編碼的時候自然就很快了,最重要的是這樣做後可以讓設計會一直處於可控的狀態,不會因為某一處的錯誤引起整個設計從頭進行。
  • 零基礎教你學FPGA之Verilog語法基礎(下)
    10、系統任務  (1)$diplay和$write任務  $display任務相當於C語言裡的printf,用於輸出信息,他的基本格式$display (p0,p1,p2);意思就是把p1、p2以p1的格式輸出,至於具體格式,C語言裡面講的很清楚,下面用一張圖幫大家回憶一下
  • 教學設計的基本要素和教學樣式
    教學設計的基本要素有哪些?如何優化這些要素?教學設計需要考慮的事項有很多,但一般來說,在明確教學設計基本理念的前提下,教學設計可分為六大要素:即「分析教學背景」「確定教學目標」「開發教學資源」「選用教學方法」「組織教學過程」和「開展說課活動」。其中,前面五個要素是開展教學設計必須把握的基本要素,而最後一個要素——「開展說課活動」則是優化教學設計的可選要素。
  • ​verilog相關基礎知識
    對於verilog基礎知識,這裡做簡單的介紹,對於已經熟悉verilog語言的讀者可以省略不看此部分。
  • Verilog HDL 語法學習筆記
    Verilog HDL 之所以成為和 VHDL 並駕齊驅的硬體描述語言,是因為它具有如下特點:• 基本邏輯門和開關級基本結構模型都內置在語言中;• 可採用多種方式對設計建模,這些方式包括行為描述方式、數據流方式、結構化方式;• Verilog HDL 中有線網(Wire)數據類型和寄存器(Reg)數據類型兩類數據類型,線網類型表示構件間的物理連線
  • 《小說創作基本技巧》:寫作的七大要素有哪些?
    今天,閱讀的書籍是英國作家琳恩·巴瑞特-李的《小說創作基本技巧》。如果你想寫好一篇故事,如果你想讓自己的文字變成一本書,如果你希望成為一名小說作家,不妨來看看這本《小說創作基本技巧》。本書由作者琳恩·巴瑞特-李在卡迪夫大學的暢銷課程「小說寫作工坊」精選而成,十二個小說創作基本技巧配合十個基礎寫作練習,從基本寫作技巧出發,剖開小說創作最核心的謎團,全書涉及主題、設定、視角、人物、情節、主要事件、關鍵場景、對話、線索等方方面面
  • 平面設計基本構成要素!
    內容要素內容要素包括文字、插圖、標誌等,其在轉化成畫面的過程中,必須將文字、插圖、標誌等轉化為點、線、面等,並遵循平面構成的原理。在轉化過程中,應以信息傳達為第一要務,不能單純為了形式美而忽視信息內容的傳達。
  • 華為Verilog HDL入門教程(1-2章)
    本文主要介紹了Verilog HDL 語言的一些基本知識,目的是使初學者能夠迅速掌握HDL設計方法,初步了解並掌握Verilog HDL語言的基本要素,能夠讀懂簡單的設計代碼並能夠進行一些簡單設計的Verilog HDL建模。當前業界的硬體描述語言中主要有VHDL 和Verilog HDL。