<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Verilog HDL簡(jiǎn)介&基礎知識1

Verilog HDL簡(jiǎn)介&基礎知識1

作者: 時(shí)間:2024-01-29 來(lái)源:電子森林 收藏

Verilog 是 Verilog HDL 的簡(jiǎn)稱(chēng),Verilog HDL 是一種硬件描述語(yǔ)言(HDL:Hardware Description Language),硬件描述語(yǔ)言是電子系統硬件行為描述、結構描述、數據流描述的語(yǔ)言。利用這種語(yǔ)言,數字電路系統的設計可以從頂層到底層(從抽象到具體)逐層描述自己的設計思想,用一系列分層次的模塊來(lái)表示極其復雜的數字系統。然后,利用電子設計自動(dòng)化()工具,逐層進(jìn)行仿真驗證,再把其中需要變?yōu)閷?shí)際電路的模塊組合,經(jīng)過(guò)自動(dòng)綜合工具轉換到門(mén)級電路網(wǎng)表。接下去,再用專(zhuān)用集成電路 ASIC 或現場(chǎng)可編程門(mén)陣列 自動(dòng)布局布線(xiàn)工具,把網(wǎng)表轉換為要實(shí)現的具體電路布線(xiàn)結構。在 的設計中,我們有多種設計方式,如繪制原理圖、編寫(xiě)描述語(yǔ)言代碼等。早期的工程師對原理圖的設計方式情有獨鐘,這種輸入方式能夠很直觀(guān)的看出電路的結構并快速理解電路。隨著(zhù)邏輯規模的不斷攀升,邏輯電路也越來(lái)越復雜,這種輸入方式就會(huì )顯得力不從心,應付簡(jiǎn)單的邏輯電路還算實(shí)用,應付起復雜的邏輯電路就不行了。因此取而代之的便是編寫(xiě)描述語(yǔ)言代碼的方式,現今的絕大多數設計都是采用代碼來(lái)完成的。

本文引用地址:http://dyxdggzs.com/article/202401/455162.htm

基礎概念

  • 四值邏輯

首先我們先來(lái)講一下 Verilog 的四值邏輯系統。

在Verilog 的邏輯系統中有四種值,也即四種狀態(tài)。

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

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

邏輯 X:表示未知,有可能是高電平,也有可能是低電平,仿真發(fā)生了不能解決的邏輯沖突;

邏輯 Z:表示高阻態(tài),外部沒(méi)有激勵信號是一個(gè)懸空狀態(tài)。

  • 常數

    • 整數

    整數常數的定義規則如下。

    1. 整數可以用十進(jìn)制(decimal)、十六進(jìn)制(hexadecimal)、八進(jìn)制(octal)、二進(jìn)制(binary)形式表示,表現形式為:
      <null|+|→<size><sign:s|S><base: d|D|h|H|o|O|b|B><0~9|0~f|0~7|0~1|x|z>,其中size、sign和base是可選的。
    2. 最簡(jiǎn)單的整數是沒(méi)有size、sign和base的十進(jìn)制數,只用0~9,可選+或-,表示的是符號數(signed integer)。
    3. sign必須和base一起使用。當base前面有sign標志時(shí),表示的是符號數(signed integer);當base前面沒(méi)有sign標志時(shí),表示的是無(wú)符號數(unsigned integer)。
    4. 負數以2的補碼形式表示。
    5. x表示不可知值(unknown),z表示高阻值(Hiz),在十進(jìn)制數中不能使用x和z。其中z可以用?代替,在使用casex和casez時(shí),為了便于理解常用?代替z。
      當z作為邏輯門(mén)的輸入或在表達式中出現時(shí),通常把z當做x處理,但是當z出現在MOS的原語(yǔ)(primitive)中,還是當做z,因為MOS可以傳送高阻(HiZ)。
    6. 如果無(wú)符號數的位數小于size,那么就在左端擴展:如果最左邊的位是0或1,左端就補0擴展;如果最左邊的位是x,左端就補x擴展;如果最左邊的位是z,左端就補z擴展。
    7. 如果無(wú)符號數的位數大于size,那么就在左端截去多余的位。
    8. 在Verilog-2001中,對于沒(méi)有size限定的數,那么就在左端按照表達式的size根據最左邊的位進(jìn)行擴展(0、x或z),擴展多少位都沒(méi)有問(wèn)題。但是在Verilog-1995中,如果最左邊位是x或z,那么x或z最多只能擴展到32位,超出的位按0擴展。
    9. 對于<sign>、<base>、a~f、x和z,大寫(xiě)和小寫(xiě)都可以使用(case insensitive)。
    10. 為了閱讀方便,可以在數字之間加(下劃線(xiàn))分割數字。 -注意:當把帶有size 的負常數(sized signed constant numbers)賦給一個(gè)reg類(lèi)型的變量時(shí),不管這個(gè)變量是否是signed,對這個(gè)負常數做符號擴展(sign-extend)。
      <code verilog>
      例子: 1. Unsized constant numbers 659 is a decimal number 'h 837FF is a hexadecimal number 'o7460 is an octal number 4af is illegal (hexadecimal format requires 'h)
      2. Sized constant numbers 4'b1001 is a 4-bit binary number 5 'D 3 is a 5-bit decimal number 3'b01x is a 3-bit number with the least significant bit unknown 12'hx is a 12-bit unknown number 16'hz is a 16-bit hign-impedance number
      3. Using sign with constant numbers 8 'd -6 this is illegal syntax -8 'd 6 this defines the two's complement of 6, held in 8 bits-equivalent to -(8'd 6) 4 'shf this denotes the 4-bit number '1111', to be interpreted as a 2's complement number, or '-1'. This is equivalent to -4'h 1 -4 'sd15 this is equivalent to -(-4'd 1), or '0001' 16'sd? the same as 16'sbz
      4. Automatic left padding reg [11:0] a, b, c, d; initial begin a = 'h x; yields xxx b = 'h 3x; yields 03x c = 'h z3; yields zz3 c = 'h 0z3; yields 0z3 end
      reg [84:0] e, f, g; e = 'h5; 
      yields {82{1'b0},3'b101} f = 'hx; yields {85{1'bx}} g = 'hz; yields {85{1'bz}}
      5. Use 27195000 16'b0011010100011111 32 'h 12ab_f001
      6. sign-extend reg signed [15:0] h; reg [15:0] m; h = -12'h123; 16'FEDD h = 12'shEDD; 16'FEDD m = -12'h123; 16'FEDD m = 12'shEDD; 16'FEDD
      我們要避免如下書(shū)寫(xiě)錯誤: case (sel[1:0]) 00: y = a; 01: y = a; 10: y = a; not execute 11: y = a; not execute endcase
      </code>
    • 實(shí)數

    實(shí)數常數定義符合IEEE Std 754-1985標準,采用雙精度浮點(diǎn)數(double-precision floating-point numbers)。實(shí)數有兩種方式:十進(jìn)制法和科學(xué)計數法。

    例如:
    1.2,        0.1,      2394.26331
    1.2.E12,    1.30e-2,     0.1e-0,    23E10,    29E-2
    236.123_763_e-12          //underscores are ignored
    
    當把實(shí)數賦給一個(gè)整數變量時(shí),按四舍五入轉換后賦值。
    例如,35.7和35.5都轉換成36,而35.2則轉換成35。
    例如,-1.5轉換成-2,而1.5則轉換成2.
    • 字符串

    字符串的定義規則如下。

    1. 字符串是包含在兩個(gè)“(雙引號)之間的字符。

    2. 字符串在表達式中或在賦值時(shí),被當做一個(gè)由8-bit ASCII碼序列組成的無(wú)符號數。

    3. 字符串中可以使用如下的特殊字符:n、t、、”和ddd,ddd用于表示八進(jìn)制數。

    4. 使用reg變量操作字符串時(shí),每8-bit存一個(gè)字符。

    5. 因為字符串被當做無(wú)符號數,所以在用整數的補齊和截去規則,就是如果字符串的位長(cháng)小于變量的位長(cháng),那么字符串做右對齊存放到變量的右側,變量的左側補0;如果字符串的位長(cháng)大于變量的位長(cháng),那么字符串做右對齊存放到變量的右側,多余的位截去。

    • 標識符

    標識符就是模塊、端口、任務(wù)、函數、變量、線(xiàn)網(wǎng)、參數、實(shí)例等的名字。定義標識符要花一些心思,要含義清晰、簡(jiǎn)潔明了。

  • 數據類(lèi)型

    • 線(xiàn)網(wǎng)

    線(xiàn)網(wǎng)(net)用于表示結構體(如邏輯門(mén))之間的連接。除了trireg之外,所有其他的線(xiàn)網(wǎng)類(lèi)型都不能保存值,線(xiàn)網(wǎng)的值時(shí)由driver決定的,例如由連續賦值驅動(dòng)或由邏輯門(mén)驅動(dòng)。如果driver沒(méi)有驅動(dòng)線(xiàn)網(wǎng),那么線(xiàn)網(wǎng)的值是z,但是tri0、tri1、trireg除外,tri0將是0,tri1將是1,而trireg將保持之前driver驅動(dòng)的值。

    線(xiàn)網(wǎng)有以下這些類(lèi)型:wire、wand、wor、tri、triand、trior、tri0、tri1、trireg、uwire、supply0、supply1。

    1.1 wire和tri

    wire和tri是一樣的,具有同樣的語(yǔ)法和功能,提供兩個(gè)名字是用于不同方面的建模:wire用于邏輯門(mén)的驅動(dòng)或連續賦值的驅動(dòng),而tri用于多driver驅動(dòng)。

    當多個(gè)具有相同驅動(dòng)強度的driver驅動(dòng)同一個(gè)wire或tri線(xiàn)網(wǎng)出現邏輯沖突時(shí),線(xiàn)網(wǎng)的值是x(unknown)。

    1.2 wor、wand、trior、triand

    線(xiàn)邏輯(model wired logic)類(lèi)型的線(xiàn)網(wǎng)有wor、wand、trior和triand,它們用于解決多個(gè)driver驅動(dòng)同一個(gè)線(xiàn)網(wǎng)時(shí)出現的邏輯沖突。wor和trior實(shí)現線(xiàn)或(or)邏輯,wand和triand實(shí)現線(xiàn)與(and)邏輯。

    wor和trior是一樣的,wand和triand是一樣的,都是為了不同方面的建模。

    1.3 tr0、tr1

    tri0用于表示帶有下拉電阻(pulldown)的線(xiàn)網(wǎng)。當沒(méi)有driver驅動(dòng)tri0線(xiàn)網(wǎng)時(shí),它的值是0,強度是pull。

    tri1用于表示帶有上拉電阻(pullup)的線(xiàn)網(wǎng)。當沒(méi)有driver驅動(dòng)tri1線(xiàn)網(wǎng)時(shí),它的值是1,強度是pull。

    1.4 uwire

    Verilog-2005增加了uwire,只能被一個(gè)driver驅動(dòng),如果被多個(gè)driver驅動(dòng),那么編譯時(shí)就會(huì )出錯。但是不知為什么VCS現在還不支持uwire。

    1.5 supply0、supply1

    supply0和supply1用于模型電源,就是只能提供0和1值的線(xiàn)網(wǎng),通常只在Vendor提供的標準單元庫中使用,平時(shí)不用。

    1.6 驅動(dòng)強度

    線(xiàn)網(wǎng)驅動(dòng)強度(drive strength)包括:

    1. 用于表示0的強度:highz0、supply0、strong0、pull0、weak0。

    2. 用于表示1的強度:highz1、supply1、strong1、pull1、weak1。

    1.7 默認 net

    在Verilog-1995中,由連續賦值驅動(dòng)而且不是端口的1-bit線(xiàn)網(wǎng)必須聲明,用于端口連接的1-bit線(xiàn)網(wǎng)可以不必聲明。但是在Verilog-2001中,就去掉了這個(gè)限制。

    • 變量

    變量是數據存儲單元的抽象。變量具有如下特性。

    1. 變量將保持每次賦給它的值,直到下一次賦值給它。當過(guò)程塊被觸發(fā)時(shí),過(guò)程塊中的賦值就會(huì )改變變量的值。
    2. reg、time和integer的初始化值是x,real和realtime的初始化值是0.0。如果使用變量聲明賦值(variable declaration assignment,例如reg abc = 1'b0;),那么就相當于在initial塊中使用阻塞賦值。
    3. 對reg的賦值是過(guò)程賦值,因為reg能夠保持每次賦的值,所以它能用于模型硬件寄存器(例如,邊沿敏感的觸發(fā)器或電平敏感的鎖存器)。但是reg不只用于模型硬件寄存器,它也用于模型組合邏輯。
    4. 除了用于模型硬件,變量也有其他的用途。雖然reg很通用,但是integer和time可以提供更大的方便性和可讀性。time變量常和$time函數一起使用。
    注意:可以把負值賦給線(xiàn)網(wǎng)和變量,只有integer、real、realtime、reg signed和net signed才能保持符號標志,而time、reg unsigned和net unsigned則把賦給它們的數值都當做無(wú)符號數處理。
    注意:interger等價(jià)于reg signed[31:0],time等價(jià)于reg unsigned[63:0]。
    注意:real和realtime是等價(jià)的,都是64-bit雙精度浮點(diǎn)數,只不過(guò)realtime變量常和$realtime函數一起使用。
    注意:不能對real和realtime使用位索引(bit-select)和部分索引(part-select)。
      例子:  integer i = 32'h1234_5678;
     time    t = 64'habcd_efab_1234_5678;
     $display ("%x, %x", i[15:0], t[63:60]);

    • 向量

    標量(scalar)是沒(méi)有范圍聲明的1-bit的線(xiàn)網(wǎng)(net)或reg。

    向量(vector)是帶有范圍聲明的multi-bit的線(xiàn)網(wǎng)(net)或reg。

      例子:  wand w;                              // a scalar net of type "wand"
      wire w1, w2;                          // declares two wires
      tri [15:0] busa;                      // a three-state 16-bit bus
      reg a;                                // a scalar reg
      reg [3:0] v;                          // a 4-bit vector reg made up of v[3],
                                            // v[2], v[1], and v[0]
      reg signed [3:0] signed_reg;          // a 4-bit vector in range -8 to 7
      reg [4:-1] b;                         // a 6-bit vector reg
      reg [4:0] x, y, z;                    // declares three 5-bit regs


關(guān)鍵詞: FPGA verilog HDL EDA

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>