中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Verilog HDL簡介&基礎(chǔ)知識1

        Verilog HDL簡介&基礎(chǔ)知識1

        作者: 時間:2024-01-29 來源:電子森林 收藏

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

        本文引用地址:http://www.antipu.com.cn/article/202401/455162.htm

        基礎(chǔ)概念

        • 四值邏輯

        首先我們先來講一下 Verilog 的四值邏輯系統(tǒng)。

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

        邏輯 0:表示低電平,也就對應(yīng)我們電路 GND;

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

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

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

        • 常數(shù)

          • 整數(shù)

          整數(shù)常數(shù)的定義規(guī)則如下。

          1. 整數(shù)可以用十進(jìn)制(decimal)、十六進(jìn)制(hexadecimal)、八進(jìn)制(octal)、二進(jìn)制(binary)形式表示,表現(xiàn)形式為:
            <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. 最簡單的整數(shù)是沒有size、sign和base的十進(jìn)制數(shù),只用0~9,可選+或-,表示的是符號數(shù)(signed integer)。
          3. sign必須和base一起使用。當(dāng)base前面有sign標(biāo)志時,表示的是符號數(shù)(signed integer);當(dāng)base前面沒有sign標(biāo)志時,表示的是無符號數(shù)(unsigned integer)。
          4. 負(fù)數(shù)以2的補(bǔ)碼形式表示。
          5. x表示不可知值(unknown),z表示高阻值(Hiz),在十進(jìn)制數(shù)中不能使用x和z。其中z可以用?代替,在使用casex和casez時,為了便于理解常用?代替z。
            當(dāng)z作為邏輯門的輸入或在表達(dá)式中出現(xiàn)時,通常把z當(dāng)做x處理,但是當(dāng)z出現(xiàn)在MOS的原語(primitive)中,還是當(dāng)做z,因?yàn)镸OS可以傳送高阻(HiZ)。
          6. 如果無符號數(shù)的位數(shù)小于size,那么就在左端擴(kuò)展:如果最左邊的位是0或1,左端就補(bǔ)0擴(kuò)展;如果最左邊的位是x,左端就補(bǔ)x擴(kuò)展;如果最左邊的位是z,左端就補(bǔ)z擴(kuò)展。
          7. 如果無符號數(shù)的位數(shù)大于size,那么就在左端截去多余的位。
          8. 在Verilog-2001中,對于沒有size限定的數(shù),那么就在左端按照表達(dá)式的size根據(jù)最左邊的位進(jìn)行擴(kuò)展(0、x或z),擴(kuò)展多少位都沒有問題。但是在Verilog-1995中,如果最左邊位是x或z,那么x或z最多只能擴(kuò)展到32位,超出的位按0擴(kuò)展。
          9. 對于<sign>、<base>、a~f、x和z,大寫和小寫都可以使用(case insensitive)。
          10. 為了閱讀方便,可以在數(shù)字之間加(下劃線)分割數(shù)字。 -注意:當(dāng)把帶有size 的負(fù)常數(shù)(sized signed constant numbers)賦給一個reg類型的變量時,不管這個變量是否是signed,對這個負(fù)常數(shù)做符號擴(kuò)展(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
            我們要避免如下書寫錯誤: case (sel[1:0]) 00: y = a; 01: y = a; 10: y = a; not execute 11: y = a; not execute endcase
            </code>
          • 實(shí)數(shù)

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

          例如:
          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
          
          當(dāng)把實(shí)數(shù)賦給一個整數(shù)變量時,按四舍五入轉(zhuǎn)換后賦值。
          例如,35.7和35.5都轉(zhuǎn)換成36,而35.2則轉(zhuǎn)換成35。
          例如,-1.5轉(zhuǎn)換成-2,而1.5則轉(zhuǎn)換成2.
          • 字符串

          字符串的定義規(guī)則如下。

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

          2. 字符串在表達(dá)式中或在賦值時,被當(dāng)做一個由8-bit ASCII碼序列組成的無符號數(shù)。

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

          4. 使用reg變量操作字符串時,每8-bit存一個字符。

          5. 因?yàn)樽址划?dāng)做無符號數(shù),所以在用整數(shù)的補(bǔ)齊和截去規(guī)則,就是如果字符串的位長小于變量的位長,那么字符串做右對齊存放到變量的右側(cè),變量的左側(cè)補(bǔ)0;如果字符串的位長大于變量的位長,那么字符串做右對齊存放到變量的右側(cè),多余的位截去。

          • 標(biāo)識符

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

        • 數(shù)據(jù)類型

          • 線網(wǎng)

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

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

          1.1 wire和tri

          wire和tri是一樣的,具有同樣的語法和功能,提供兩個名字是用于不同方面的建模:wire用于邏輯門的驅(qū)動或連續(xù)賦值的驅(qū)動,而tri用于多driver驅(qū)動。

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

          1.2 wor、wand、trior、triand

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

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

          1.3 tr0、tr1

          tri0用于表示帶有下拉電阻(pulldown)的線網(wǎng)。當(dāng)沒有driver驅(qū)動tri0線網(wǎng)時,它的值是0,強(qiáng)度是pull。

          tri1用于表示帶有上拉電阻(pullup)的線網(wǎng)。當(dāng)沒有driver驅(qū)動tri1線網(wǎng)時,它的值是1,強(qiáng)度是pull。

          1.4 uwire

          Verilog-2005增加了uwire,只能被一個driver驅(qū)動,如果被多個driver驅(qū)動,那么編譯時就會出錯。但是不知為什么VCS現(xiàn)在還不支持uwire。

          1.5 supply0、supply1

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

          1.6 驅(qū)動強(qiáng)度

          線網(wǎng)驅(qū)動強(qiáng)度(drive strength)包括:

          1. 用于表示0的強(qiáng)度:highz0、supply0、strong0、pull0、weak0。

          2. 用于表示1的強(qiáng)度:highz1、supply1、strong1、pull1、weak1。

          1.7 默認(rèn) net

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

          • 變量

          變量是數(shù)據(jù)存儲單元的抽象。變量具有如下特性。

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

          • 向量

          標(biāo)量(scalar)是沒有范圍聲明的1-bit的線網(wǎng)(net)或reg。

          向量(vector)是帶有范圍聲明的multi-bit的線網(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ù)專區(qū)

        關(guān)閉