verilog HDL中wire和reg類型的區別


本文參考 夜煞CSDN 的CSDN 博客 ,有改動

全文地址請點擊:https://blog.csdn.net/u010549444/article/details/50993274?utm_source=copy

基本概念的差別

wire型數據常用來表示以assign關鍵字指定的組合邏輯信號,模塊的輸入輸出端口類型都默認為wire型,wire相當於物理連線,默認初始值是z。

reg型表示的寄存器類型,用於always模塊內被賦值的信號,必須定義為reg型,代表觸發器,常用於時序邏輯電路,reg相當於存儲單元,默認初始值是x。

 

在賦值語句中的差別

        在連續賦值語句中,表達式右側的計算結果可以立即更新表達式的左側。在理解上,相當於一個邏輯之后直接連了一條線,這個邏輯對應於表達式的右側,而這條線就對應於wire。

        在過程賦值語句中,表達式右側的計算結果在某種條件的觸發下放到一個變量當中,而這個變量可以聲明成reg類型。根據觸發條件的不同,過程賦值語句可以建模不同的硬件結構:如果這個條件是時鍾的上升沿或下降沿,那么這個硬件模型就是一個觸發器;如果這個條件是某一信號的高電平或低電平,那么這個硬件模型就是一個鎖存器;如果這個條件是賦值語句右側任意操作數的變化,那么這個硬件模型就是一個組合邏輯。

總而言之,wire只能被assign連續賦值,reg只能在initial和always中賦值

 

端口信號和內部信號的差別

信號可以分為端口信號和內部信號。出現在端口列表中的信號是端口信號,其它的信號為內部信號。

對於端口信號,一旦定義位input或者output端口,默認就定義成了wire類型,輸入端口只能是net類型(wire/tri)。輸出端口可以是net類型,也可以是reg類型。若輸出端口在過程塊中賦值則為register類型;若在過程塊外賦值(包括實例化語句),則為net類型。

內部信號類型與輸出端口相同,可以是net或reg類型。判斷方法也與輸出端口相同。若在過程塊中賦值,則為reg類型;若在過程塊外如assign賦值,則為net類型。

若信號既需要在過程塊中賦值,又需要在過程塊外賦值。這種情況是有可能出現的,如決斷信號。這時需要一個中間信號轉換。

inout是一個雙向端口, inout端口不能聲明為reg類型,只能是wire類型。

 

 


參考代碼解析

  1.  
    module net_reg(
  2.  
    //input
  3.  
    A1,A2,A3,A4,A5,CLK,
  4.  
    //output
  5.  
    E1,E2,E3,E4,E5
  6.  
    );
  7.  
     
  8.  
    //端口信號
  9.  
    //1、輸入端口定義,默認定義為wire類型,省略聲明為wire A1,A2,A3;
  10.  
    input A1;
  11.  
    input A2;
  12.  
    input A3;
  13.  
    input [1:0]A4;
  14.  
    input A5;
  15.  
    input CLK;
  16.  
     
  17.  
     
  18.  
    //2、輸出端口定義,默認定義為wire類型,省略聲明為wire E1,E2,E3;
  19.  
    output E1;
  20.  
    output E2;
  21.  
    output E3;
  22.  
    output [9:0]E4;
  23.  
    output reg E5;
  24.  
    reg E2;
  25.  
    reg E3;
  26.  
    reg [9:0]E4;
  27.  
     
  28.  
    //內部信號:過程塊中賦值,則為reg類型;若在過程塊外如assign賦值,則為net類型。
  29.  
    reg [9:0]in_var1;
  30.  
    reg [5:0]in_var2;
  31.  
    reg [3:0]cc;
  32.  
     
  33.  
     
  34.  
    initial begin //E3 在initial塊中賦值,需要定義為reg
  35.  
    E3 = A3;
  36.  
    end
  37.  
     
  38.  
    assign E1 = A1; // 連續賦值語句中被賦值,定義為wire
  39.  
     
  40.  
    always @ (A1,A2,A3,A4)begin
  41.  
    E2 = A2; //E2在always過程塊中被賦值,定義為reg類型
  42.  
    if(A3 == 0)
  43.  
    E3 = A3; //E3在always過程塊中被賦值,定義為reg類型
  44.  
    if(A4 == 2'd0)begin
  45.  
    in_var1 = 10'd0;
  46.  
    in_var2 = 6'd36;
  47.  
    E4 = in_var1;
  48.  
    E4 = in_var2;
  49.  
    end
  50.  
    end
  51.  
     
  52.  
    always @ (posedge CLK)begin
  53.  
    if(A5 == 0)begin
  54.  
    E5 <= 0;
  55.  
    cc <= 4'd0;
  56.  
    end
  57.  
    else begin
  58.  
    E5 <= A5;
  59.  
    cc <= cc + 1'b1;
  60.  
    end
  61.  
    end
  62.  
     
  63.  
    endmodule

【注意】

雖然E2定義在了過程賦值語句中,但是這個條件是賦值語句右側任意操作數的變化,那么這個硬件模型就是一個組合邏輯。

雖然E3定義在了過程賦值語句中,但是這個條件是某一信號的高電平或低電平,那么這個硬件模型就是一個鎖存器;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM