【Verilog HDL 入門教程】 —— 學長帶你學Verilog(基礎篇)

文章目錄

  • 一、Verilog HDL 概述
    • 1、Verilog HDL 是什么
    • 2、Verilog HDL產生的背景
    • 3、Verilog HDL 和 VHDL的區別
  • 二、Verilog HDL 基礎知識
    • 1、Verilog HDL 語言要素
      • 1.1、命名規則
      • 1.2、注釋符
      • 1.3、關鍵字
      • 1.4、數值
        • 1.4.1、整數及其表示
        • 1.4.2、實數及其表示
        • 1.4.3、字符串及其表示
    • 2、數據類型
      • 2.1、線網型(wire)
      • 2.2、寄存器型(reg)
      • 2.3、存儲器型(memory)
      • 2.4、整數型(integer)
      • 2.5、時間型(time)
      • 2.6、實數型(real)
      • 2.7、參數型
    • 3、運算符
      • 3.1、算術運算符
      • 3.2、關系運算符
      • 3.3、相等關系運算符
      • 3.4、邏輯運算符
      • 3.5、按位運算符
      • 3.6、歸約運算符
      • 3.7、移位運算符
      • 3.8、連接運算符
  • 總結

一、Verilog HDL 概述

1、Verilog HDL 是什么

Verilog HDL(Hardware Description Language)是一種硬件描述語言,用于從算法級、門級到開關級的多種抽象設計層次的數字系統建模。 現實生活中多用于專用集成電路(Application Specific Integrated Circuit,ASIC)和現場可編程門陣列(Field Programmabl Gate Array,FPGA)的實現。

2、Verilog HDL產生的背景

第一只晶體管出現后,數字集成電路設計密度越來越大、電路越來越復雜,傳統的畫圖或連線的設計方法已不再適用。

例如:設計4位移位寄存器,僅需簡短幾行代碼完成。
在這里插入圖片描述

module register_four(input 	clk		,input 	Reset	,input 	din		,output reg [3:0] qout);always @(posedge clk or posedge Reset)beginif(Reset)qout <= 4'b0;else qout <= {qout[2:0],din};
end endmodule

若要將4位移位寄存器改為8位移位寄存器,僅需修改少量代碼。

在這里插入圖片描述

module register_eight(input 	clk		,input 	Reset	,input 	din		,output reg [7:0] qout);always @(posedge clk or posedge Reset)beginif(Reset)qout <= 8'b0000_0000;else qout <= {qout[6:0],din};
end endmodule

由上例可直觀發現,Verilog HDL可用較少的語句描述較為復雜的電路和靈活的可擴展性,為數字集成電路設計帶來了極大的便捷。

3、Verilog HDL 和 VHDL的區別

目前,Verilog HDL 和 VHDL(VHSIC Hardware Description Language,VHSIC 為 Very High Speed Integrated Circuit)是最為常用的硬件描述語音。
Verilog HDL:
語法靈活、寬松,多被思維活躍的美國人采用。因Verilog HDL 語法寬松,其不適合對系統要求層次嚴格的大規模設計。
VHDL:
語法結構緊湊、嚴謹,多被思維歐洲人采用。VHDL在大規模數字集成電路設計中具有一定優勢。

注:
Verilog基于C語言發展而來,語法靈活、寬松,且國內開發人員多采用Verilog,對初學者較為友好。

二、Verilog HDL 基礎知識

1、Verilog HDL 語言要素

1.1、命名規則

在Verilog HDL 中,標識符背用來命名信號、模塊、參數等,它可以是任意一組字母、數字、$符號和_(下劃線)符號的組合。

:標識符中字母區分大小寫,且第一個字必須是字母或下劃線。

1.2、注釋符

單行注釋:單行注釋以“//”開始,Verilog HDL忽略此處到行尾的內容。
多行注釋:多行注釋采用“/**/”,從“/”開始,到“/”結束,Verilog HDL忽略其中注釋的內容。

:多行注釋不允許嵌套,但單行注釋可以嵌套在多行注釋中。

例如:

非法多行注釋:/*注釋內容/*多行注釋嵌套多行注釋*/注釋內容*/
合法多行注釋:/*注釋內容//多行注釋嵌套單行注釋*/

1.3、關鍵字

Verilog HDL 內部已經使用的詞成為關鍵字或保留字,是事先定義好的確認符,用來組織語言結構。

:Verilog HDL中所有的關鍵字都是小寫的。
在這里插入圖片描述

1.4、數值

Verilog HDL 有四種基本的電平邏輯數值狀態,用數字或字符表達數字電路中傳送的邏輯狀態和存儲信息。Verilog HDL邏輯數值中,“x”和“z”都不區分大小寫,即0x1z與0X1Z等價。

在這里插入圖片描述
在數值中,下劃線符號“_”除不能放于首位外,可隨意用在整數與實數中,對數值的大小無影響,僅為提高可讀性。

例如:
8’b00110010 與8’b0011_0010的數值大小相等。

1.4.1、整數及其表示

在這里插入圖片描述
整數的表示形式:
+/-<size>'<base_format><number>
(1)“+/-”:正數和負數的標識。
(2)size:換算過后二進制的寬度。
(3)“ ’ ”:為基數格式表示固有字符,該字符不能缺省,否則為非法表示形式。
(4)base_format:基數符號。
(5)number:可使用的數字字符集。

例如:

4'b0011   
7'd32
8'hfd     
1.4.2、實數及其表示

(1)十進制表示法。
(2)科學計數發。例如:758.4e2 的值為75840.0,3e-3的值為0.003。

1.4.3、字符串及其表示

:字符串必須包含在同一行中,不能分行書寫。

字符串在Verilog HDL中看做8位的ASCII值序列,即一個字符對應8位的ASCII值。

2、數據類型

按抽象程度 Verilog HDL數據類型可分為:物理數據類型(主要包括線網型及寄存器型)和抽象數據類型(主要包括整數型、時間型、實數型及參數型)。抽象數據類型主要用于輔助設計和驗證。

2.1、線網型(wire)

wire 類型表示硬件單元之間的物理連線,由其連接的器件輸出端連續驅動。如果沒有驅動元件連接到 wire 型變量,缺省值一般為 “Z”。對wire 類型賦值用“assign”。

例如:

wire data_out ;
wire flag ;assign data_out = data_in ;
assign flag = 1'b1 ;

2.2、寄存器型(reg)

reg 用來表示存儲單元,它的數據會保持最后一次賦值,直到被改寫。reg 默認初始值為不定值“x”,缺省是數據位寬為1位。reg 一般為無符號數,若將一個負數賦值給 reg 型變量,則制動轉換其二進制補碼形式。

例如:

reg data0;
reg data1;reg [4:0] data2;

2.3、存儲器型(memory)

存儲器型本質上還是寄存器型變量陣列,可以描述RAM型、ROM型存儲器以及reg文件。存儲器中的每一個單元通過索引進行尋址。
聲明格式:
reg<range1><name_of_register><range2>
(1) range1:存儲器中寄存器的位寬,缺省,時為1,格式為[msb:lsb]。
(2)range2:寄存器的個數,缺省時為1,格式為[msb:lsb]。
(3)name_of_register:變量名稱列表,一次可以定義多個名稱,之間用逗號分開。

例如:

reg [7:0] mem1[255:0];//定義了一個有256個8位的存儲器
reg [15:0] mem2[127:0],reg1,reg2;//定義了一個具有128個16位的寄存器mem2//2個16位的寄存器reg1和reg2mem1[2] = 0; //給mem1存儲器中的第三個存儲單元賦值為0

2.4、整數型(integer)

整數類型用關鍵字 integer 來聲明。聲明時不用指明位寬,位寬和編譯器有關,一般為32 bit。reg 型變量為無符號數,而 integer 型變量為有符號數。

例如:

reg [31:0]      data1 ;
reg [3:0]       byte1 [7:0]; //數組變量,后續介紹
integer j ;  //整型變量,用來輔助生成數字電路always@* beginfor (j=0; j<=3;j=j+1) beginbyte1[j] = data1[(j+1)*8-1 : j*8]; //把data1[7:0]…data1[31:24]依次賦值給byte1[0][7:0]…byte[3][7:0]end
end

2.5、時間型(time)

Verilog 使用特殊的時間寄存器 time 型變量,對仿真時間進行保存。其寬度一般為 64 bit,通過調用系統函數 $time 獲取當前仿真時間。

例如

time current_time ;
initial begin#100 ;current_time = $time ; //current_time 的大小為 100
end

2.6、實數型(real)

實數用關鍵字 real 來聲明,可用十進制或科學計數法來表示。實數聲明不能帶有范圍,默認值為 0。如果將一個實數賦值給一個整數,則只有實數的整數部分會賦值給整數。

例如:

real        data1 ;
integer     temp ;
initial begindata1 = 2e3 ;data1 = 3.75 ;
endinitial begintemp = data1 ; //temp 值的大小為3
end

2.7、參數型

參數用來表示常量,用關鍵字parameter聲明,只能賦值一次,但可通過實例化的方式更改參數在模塊中的值。局部參數用localparam聲明,其作用和用法與parameter相同,區別在于它的值不能改變。所以當參數在本模塊中調用時,可以用localparam來說明。

3、運算符

在這里插入圖片描述

3.1、算術運算符

Verilog HDL中常用的算術運算符主要有五種,分別是加法(+)、減法(-)、乘法(*)、除法(/)和取模(%)。

注:
算術表達式結果的長度由最長的操作數決定。在賦值語句下,算術結果的長度由等號操作符左端的目標長度決定。

3.2、關系運算符

關系運算符也是雙目運算符,是對兩個操作數的大小進行比較。關系運算符有大于(>)、小于(<)、大于等于(>=)和小于等于(<=)幾種。

3.3、相等關系運算符

相等關系運算符是對兩個操作數進行比較,比較結果有三種,即真(1)、假(0)和不定值(x)。Verilog HDL 中有四種相等關系運算符:等于(==)、不等于(!=)、全等(===)、非全等(!==)。
在這里插入圖片描述

3.4、邏輯運算符

邏輯運算符有三種,分別為邏輯與(&&)、邏輯或(||)、邏輯非(!)。其中邏輯與、邏輯或是雙目運算符,邏輯非為單目運算符。在這里插入圖片描述

3.5、按位運算符

Verilog HDL 提供了五種類型位運算符:按位取反(~)、按位與(&)、按位或(|)、按位異或(^ )、按位同或(^~),按位運算符對其自變量的每一位進行操作。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3.6、歸約運算符

歸約操作符包括:歸約與(&),歸約與非(~&),歸約或(|),歸約或非(~|),歸約異或(^),歸約同或(~^)。歸約操作符只有一個操作數,它對這個向量操作數逐位進行操作,最終產生一個 1bit 結果。邏輯操作符、按位操作符和歸約操作符都使用相同的符號表示,因此有時候容易混淆。區分這些操作符的關鍵是分清操作數的數目,和計算結果的規則。

例如:

A = 4'b1010 ;
&A ;      //結果為 1 & 0 & 1 & 0 = 1'b0,可用來判斷變量A是否全1
~|A ;     //結果為 ~(1 | 0 | 1 | 0) = 1'b0, 可用來判斷變量A是否為全0
^A ;      //結果為 1 ^ 0 ^ 1 ^ 0 = 1'b0

3.7、移位運算符

移位操作符包括左移(<<),右移(>>),算術左移(<<<),算術右移(>>>)。移位操作符是雙目操作符,兩個操作數分別表示要進行移位的向量信號(操作符左側)與移動的位數(操作符右側)。算術左移和邏輯左移時,右邊低位會補 0。邏輯右移時,左邊高位會補 0;而算術右移時,左邊高位會補充符號位,以保證數據縮小后值的正確性。

A = 4'b1100 ;
B = 4'b0010 ;
A = A >> 2 ;        //結果為 4'b0011
A = A << 1;         //結果為 4'b1000
A = A <<< 1 ;       //結果為 4'b1000
C = B + (A>>>2);    //結果為 2 + (-4/4) = 1, 4'b0001

3.8、連接運算符

拼接操作符用大括號 {,} 來表示,用于將多個操作數(向量)拼接成新的操作數(向量),信號間用逗號隔開。拼接符操作數必須指定位寬,常數的話也需要指定位寬。

例如:

A = 4'b1010 ;
B = 1'b1 ;
Y1 = {B, A[3:2], A[0], 4'h3 };  //結果為Y1='b1100_0011
Y2 = {4{B}, 3'd4};  //結果為 Y2=7'b111_1100
Y3 = {32{1'b0}};  //結果為 Y3=32h0,常用作寄存器初始化時匹配位寬的賦初值

總結

該篇主要講述Verilog HDL 常用數據類型、運算符等基礎部分。受篇幅限制,此次未涉及至實際應用,后期將逐一講解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92969.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92969.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92969.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL Developer Data Modeler:一款免費跨平臺的數據庫建模工具

SQL Developer Data Modeler 是由 Oracle 公司開發的一款免費的圖形化數據建模和數據庫設計工具&#xff0c;用于創建、瀏覽和編輯邏輯模型、關系模型、物理模型、多維模型和數據類型模型。 SQL Developer Data Modeler 既是一個獨立的應用程序&#xff0c;同時也被集成到了 Or…

CSS面試題及詳細答案140道之(21-40)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

篇四 tcp,udp客戶端服務器編程模型

一 前言 本篇內容主要介紹tcp&#xff0c;udp客戶端服務器編程的基礎API和示例代碼。 二 APIAPI用途使用方socket創建套接字&#xff0c;這是網絡通信的橋梁Tcp,udp客戶端&#xff0c;服務器bind綁定本地IP地址和端口Tcp,udp客戶端&#xff0c;服務器listen監聽端口&#xff0c…

ESP32學習筆記_Components(1)——使用LED Strip組件點亮LED燈帶

LED strip ESP32-S3 的 RMT&#xff08;Remote Control Transceiver&#xff0c;遠程控制收發器&#xff09;外設最初設計用于紅外收發&#xff0c;但由于其數據格式的靈活性&#xff0c;RMT 可以擴展為通用的信號收發器&#xff0c;能夠發送或接收多種類型的信號&#xff1b;…

無人機拋投模塊分析

一、設計核心要點1. 結構輕量化與強度平衡 材料選擇&#xff1a;主體采用航空鋁、碳纖維復合材料&#xff0c;降低自重并保證承重強度。 機械傳動優化&#xff1a;齒輪-齒條傳動替代傳統絲桿結構&#xff0c;簡化機構并提升可靠性。 模塊化設計&#xff1a;支持多倉位獨立控…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-33,(知識點:二極管結溫,熱阻,二極管功耗計算)

目錄 1、題目 2、解答 步驟一&#xff1a;明確熱阻的相關公式 步驟二&#xff1a;計算二極管的功耗 步驟三&#xff1a;計算二極管的結溫 3、相關知識點 一、熱阻的定義 二、二極管功耗的計算 三、結溫的計算 題目匯總版--鏈接&#xff1a; 【硬件-筆試面試題】硬件…

【LeetCode 熱題 100】79. 單詞搜索——回溯

Problem: 79. 單詞搜索 給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內的字母構成&#xff0c;其中“相鄰”單元格…

ARM SMMUv3控制器注冊過程分析(八)

1.概述 ARM SMMUv3控制器初始化及設備樹分析&#xff08;七&#xff09;中描述了IOMMU控制器初始化過程。SMMU驅動最后調用iommu_device_register將其注冊到內核中&#xff0c;下面分析一下SMMU控制器注冊過程中都做了那些工作。 如下圖所示&#xff0c;SMMU控制器注冊過程中…

Idefics3:構建和更好地理解視覺-語言模型:洞察與未來方向

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" Idefics3&#xff1a;構建和更好地理解視覺-語言模型&#xff1a;洞察與未來方向 摘要 視覺-語言模型&#xff08;VLMs&#xff09;領域&#xff0c;接收圖像和文本作為輸入并輸出文本的模型&#xff0c;正在快…

利用DeepSeek解決kdb+x進行tpch測試的幾個問題及使用感受

上文其實沒有成功運行tpch的22個標準查詢中的任何一個&#xff0c;因為DeepSeek原始給出的導入語句有錯&#xff0c;有一些表沒有導入。 1.解決類型及長度問題導致的插入tbl文件到內存表失敗。 kdbx的Reference card()提到的基本數據類型如下&#xff1a; Basic datatypes n …

SGLang 核心技術詳解

SGLang 作為一個高性能的 LLM 服務框架&#xff0c;通過一系列先進的優化技術實現了卓越的推理性能。下面詳細解釋其核心功能組件&#xff1a; 1. RadixAttention 用于前綴緩存 核心概念 RadixAttention 是 SGLang 獨創的前綴緩存機制&#xff0c;基于 Radix Tree&#xff08;基…

精密全波整流電路(四)

精密全波整流電路&#xff08;四&#xff09; 背景說明 [[精密半波整流電路|半波整流]]雖然能實現交直流信號的轉換&#xff0c;但是半波整流只能保留信號半個周期的能量&#xff0c;導致信號能量的利用率不高。 因此&#xff0c;在一些場合需要使用到全波整流電路。 同樣的&…

深入解讀Prometheus 2.33 Series Chunks壓縮特性:原理與實踐

深入解讀Prometheus 2.33 Series Chunks壓縮特性&#xff1a;原理與實踐 隨著監控指標規模不斷增長&#xff0c;Prometheus的本地TSDB存儲壓力日益增大。為提升存儲效率&#xff0c;Prometheus 2.33引入了Series Chunks壓縮特性&#xff0c;對時間序列數據在寫入和存儲時進行深…

SpringBoot整合Liquibase提升數據庫變更的可控性、安全性、自動化程度(最詳細)

為什么要使用liquibase?- 團隊協作與版本管理- 當多人&#xff08;或多個小組&#xff09;并行開發、對同一數據庫結構進行變更時&#xff0c;如果僅靠手寫 SQL 腳本&#xff0c;很 容易產生沖突或漏掉某些變更。- Liquibase 將所有 DDL/DML 操作以“changeset”形式納入源碼管…

數據寫入因為漢字引發的異常

spark 數據寫hive表,發生 查詢分區異常問題 異常: 25107124 19 26.49 ERROR Hive: MelaException(message.Exception thrown when execuling quey. S ELECT DISTINCT ‘org apache.hadop.hive melastore .modelMpartion As"NUCLEUS TYPE,AONCREATE TIME,AO.LAST ACCE…

Springboot項目實現將文件上傳到阿里云

Springboot項目實現將文件上傳到阿里云 一、概述二、具體步驟 2.1引入阿里云工具 首先先建utils包&#xff0c;然后引入AliOSSUtils類&#xff0c;如下&#xff1a; package com.hechixueyuan.forestfiredetectionsystem.utils;import com.aliyun.oss.OSS; import com.aliyun.o…

如何理解 TCP 是字節流協議?詳解

文章目錄一、面向字節流二、粘包問題應用層如何解決粘包問題&#xff1f;一、面向字節流 使用 TCP socket 進行網絡編程&#xff0c;Linux 內核會給每個 socket 都分配一個發送緩沖區和一個接收緩沖區 由于緩沖區的存在, TCP 讀寫不需要一一匹配&#xff0c;例如&#xff1a;…

面試問題總結——關于OpenCV(二)

最近小組在面試視覺算法工程師,順便整理了一波關于OpenCV的面試題目。 有些知識點也不深入,對于寫的不對的地方,歡迎指正。 目錄 20.像素梯度如何計算? 21.關于開運算和閉運算的理解 22.開運算和閉運算有什么優缺點? 23.圖像插值有哪些? 24.圖像金字塔的原理 25.邊緣檢測…

目標導向的強化學習:問題定義與 HER 算法詳解—強化學習(19)

目錄 1、目標導向的強化學習&#xff1a;問題定義 1.1、 核心要素與符號定義 1.2、 核心問題&#xff1a;稀疏獎勵困境 1.3、 學習目標 2、HER&#xff08;Hindsight Experience Replay&#xff09;算法 2.1、 HER 的核心邏輯 2.2、 算法步驟&#xff08;結合 DDPG 舉例…

2025 XYD Summer Camp 7.21 智靈班分班考 · Day1

智靈班分班考 Day1 時間線 8:00 在濱蘭實驗的遠古機房中的一個鍵盤手感爆炸的電腦上開考。開 T1&#xff0c;推了推發現可以 segment tree 優化 dp&#xff0c;由于按空格需要很大的力氣導致馬蜂被迫改變。后來忍不住了頂著疼痛按空格。8:30 過了樣例&#xff0c;但是沒有大樣…