從零開始學FPGA Verilog基礎語法

2021-09-13 23:16:41 字數 3419 閱讀 5542

verilog hdl(hardware description language)是在用途最廣泛的c語言的基礎上發展起來的一種硬體描述語言,具有靈活性高、易學易用等特點。verilog容易掌握,只要有c語言的程式設計基礎,通過比較短的時間,經過一些實際的操作,可以在1個月左右掌握這種語言。

我們先看下邏輯電路中有四種值,即四種狀態:

邏輯 0:表示低電平,也就是對應我們電路的gnd;

邏輯 1:表示高電平,也就是對應我們電路的vcc;

邏輯 x:表示未知,有可能是高電平,也有可能是低電平;

邏輯 z:表示高阻態,外部沒有激勵訊號是乙個懸空狀態。

verilog數字進製包括二進位制(b)、八進位制(o)、十進位制(d)和十六進製制(h)。

例如:二進位制:4』b0101 表示4位二進位制數字0101

十進位制:4』d2 表示4位二進位制數字2 (用二進位制表示為0010)

十六進製制:4』ha 表示4位十六進製制數字a(用二進位制表示為1010)

識別符號(identifier)用於定義模組名、埠名和訊號名等。verilog的識別符號可以是任意一組字母、數字、$和_(下劃線)符號的組合,但識別符號的第乙個字元必須是字母或者下劃線。另外,識別符號是區分大小寫的。(可以看出與c語言一致)

不建議大小寫混合使用,普通內部訊號建議全部小寫,引數定義建議大寫,另外訊號命名最好體現訊號的含義(比如計數器count,數字和sum等等)。

暫存器型別

暫存器型別表示乙個抽象的資料儲存單元,它只能在always語句和initial語句中被賦值,並且它的值從乙個賦值到另乙個賦值過程中被儲存下來。如果該過程語句描述的是時序邏輯,即always語句帶有時鐘訊號,則該暫存器變數對應為暫存器;如果該過程語句描述的是組合邏輯,即always語句不帶有時鐘訊號,則該暫存器變數對應為硬體連線;暫存器型別的預設值是x(未知狀態).

暫存器資料型別有很多種,如reg、integer、real等,其中最常用的就是reg型別,它的使用方法如下:

reg [31:0] 中 [31:0] 表示定義了32位的乙個暫存器,注意高位在前,即31:0

而reg未定義位寬則預設為1位長度

線網型別

線網表示verilog結構實體(例如門)的物理連線。線網型別的變數不能儲存值,它的值由驅動元件的值決定,例如連續賦值或門的輸出。驅動線網型別變數的元件有門、連續賦值語句、assign等。如果沒有驅動元件連線到線網,線網的預設值為z(高阻態)。線網型別同暫存器型別一樣也是有很多種,如tri和wire等,其中最常用的就是wire型別,它的使用方法如下:

引數型別

我們再來看下引數型別,引數其實就是乙個常量,常被用於定義狀態機的狀態、資料位寬和延遲大小等,由於它可以在編譯時修改引數的值,因此它又常被用於一些引數可調的模組中,使使用者在例項化模組時,可以根據需要配置引數。在定義引數時,我們可以一次定義多個引數,引數與引數之間需要用逗號隔開,每個引數定義的右邊必須是乙個常數表示式。這裡我們需要注意的是引數的定義是區域性的,只在當前模組中有效。它的使用方法如下:

注意:合理使用引數定義可以增加可讀性與可維護性,例如上述例子,如果我們使用別的尺寸lcd,只需要修改上述一些引數的值,而不需要進入**內部進行維護更改,會大幅節約時間。

verilog中的運算子按照功能可以分為下述型別:1、算術運算子、 2、關係運算子、3、邏輯運算子、 4、條件運算子、 5、位運算子、 6、移位運算子、 7、拼接運算子。(大多數與c語言一致)

算術運算子

verilog實現乘除比較浪費組合邏輯資源,尤其是除法。一般2的指數次冪的乘除法使用移位運算來完成運算(學過8086、51微控制器的應該都清楚這個)。 其中 「/」 除法只能實現整除,小數部分會被省略。

關係運算子

邏輯運算子

邏輯運算子是連線多個關係表示式用的,可實現更加複雜的判斷,一般不單獨使用,都需要配合具體語句來實現完整的意思(注意邏輯運算子與位運算子的區別,很多初學者都會弄混。兩者主要區別是邏輯運算子只輸出0或1,而位運算子是按位進行相應運算,輸出的位數與原來的位數相同)

條件運算子

條件操作符一般來構建從兩個輸入中選擇乙個作為輸出的條件選擇結構,功能等同於 always中的if-else語句

例如:result = (a>=b)?a:b;

上面表示如果a>=b,則result=a;如果a位運算子

如果a與b位寬不一致,則位寬小的資料前面會補0,補到相同的位寬再進行運算。

移位運算子

移位運算子包括左移位運算子和右移位運算子,這兩種移位運算子都用0來填補移出的空位。注意左移時,位寬增加;右移時,位寬不變

例如:4』b1001<<2 = 6』b100100;

4』b1001>>1 = 4』b0100;

拼接運算子

verilog中有乙個特殊的運算子是c語言中沒有的,就是位拼接運算子。用這個運算子可以把兩個或多個訊號的某些位拼接起來進行運算操作。

c = ; 將a與b的低四位拼接起來。

運算子的優先順序

注:如果沒有自信,最好多用括號,這樣也會讓程式盡量按自己的邏輯來,畢竟括號的優先順序最高,可以避免自己的想法與程式執行時不一致。

參考:正點原子fpga開發指南

2023年3月28日 西安市沙坡村職業技術學院

零開始學python 從零開始學Python

第1章 python入門 1 1 1 什麼是python 1 1 2 python語言有什麼特點 2 1 3 python可以幹什麼 4 練一練 5 第2章 準備開發環境 6 2 1 在windows上安裝python開發環境 6 2 2 選擇和安裝開發工具 11 練一練 17 第3章 基本概念 1...

從零開始學android

相對布局管理器指的是參考某一其他控制項進行擺放,可以通過控制,將元件擺放在乙個指定參考元件的上 下 左 右等位置,這些可以直接通過各個元件提供的屬性完成。下面介紹一下各個方法的基本使用 no.屬性名稱 對應的規則常量 描述1 android layout below relativelayout.b...

從零開始學 樹

在之前做二級的題的時候,偶爾會碰見二叉樹,很自然的就想起了樹,那麼什麼是樹呢?這裡說的可不是外面的參天大樹,而是有實際概念的樹,下面就來介紹一下樹。樹是由n n 0 個結點組成的有限集合。若n 0,稱為空樹 若n 0,則 1 有乙個特定的稱為根 root 的結點。它只有直接後繼,但沒有直接前驅 2 ...