溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Verilog語言數(shù)據(jù)類型基礎(chǔ)知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2023-04-11 15:32:30 來源:億速云 閱讀:124 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Verilog語言數(shù)據(jù)類型基礎(chǔ)知識(shí)點(diǎn)有哪些”,在日常操作中,相信很多人在Verilog語言數(shù)據(jù)類型基礎(chǔ)知識(shí)點(diǎn)有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Verilog語言數(shù)據(jù)類型基礎(chǔ)知識(shí)點(diǎn)有哪些”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

線網(wǎng)(wire)

Verilog 最常用的 2 種數(shù)據(jù)類型就是線網(wǎng)(wire)與寄存器(reg),其余類型可以理解為這兩種數(shù)據(jù)類型的擴(kuò)展或輔助。

wire 類型表示硬件單元之間的物理連線,由其連接的器件輸出端連續(xù)驅(qū)動(dòng)。如果沒有驅(qū)動(dòng)元件連接到 wire 型變量,缺省值一般為 "Z"。舉例如下:

實(shí)例

wire   interrupt ;

wire   flag1, flag2 ;

wire   gnd = 1'b0 ;  

線網(wǎng)型還有其他數(shù)據(jù)類型,包括 wand,wor,wri,triand,trior,trireg 等。這些數(shù)據(jù)類型用的頻率不是很高,這里不做介紹。

寄存器(reg)

寄存器(reg)用來表示存儲(chǔ)單元,它會(huì)保持?jǐn)?shù)據(jù)原有的值,直到被改寫。聲明舉例如下:

實(shí)例

reg    clk_temp;

reg    flag1, flag2 ;

例如在 always 塊中,寄存器可能被綜合成邊沿觸發(fā)器,在組合邏輯中可能被綜合成 wire 型變量。寄存器不需要驅(qū)動(dòng)源,也不一定需要時(shí)鐘信號(hào)。在仿真時(shí),寄存器的值可在任意時(shí)刻通過賦值操作進(jìn)行改寫。例如:

實(shí)例

reg rstn ;

initial begin

    rstn = 1'b0 ;

    #100 ;

    rstn = 1'b1 ;

end

向量

當(dāng)位寬大于 1 時(shí),wire 或 reg 即可聲明為向量的形式。例如:

實(shí)例

reg [3:0]      counter ;    //聲明4bit位寬的寄存器counter

wire [32-1:0]  gpio_data;   //聲明32bit位寬的線型變量gpio_data

wire [8:2]     addr ;       //聲明7bit位寬的線型變量addr,位寬范圍為8:2

reg [0:31]     data ;       //聲明32bit位寬的寄存器變量data, 最高有效位為0

對(duì)于上面的向量,我們可以指定某一位或若干相鄰位,作為其他邏輯使用。例如:

實(shí)例

wire [9:0]     data_low = data[0:9] ;

addr_temp[3:2] = addr[8:7] + 1'b1 ;

Verilog 支持可變的向量域選擇,例如:

實(shí)例

reg [31:0]     data1 ;

reg [7:0]      byte1 [3:0];

integer j ;

always@* begin

    for (j=0; j<=3;j=j+1) begin

        byte1[j] = data1[(j+1)8-1 : j8];

        //把data1[7:0]&hellip;data1[31:24]依次賦值給byte1[0][7:0]&hellip;byte[3][7:0]

    end

end

Verillog 還支持指定 bit 位后固定位寬的向量域選擇訪問。

  • [bit+: width] : 從起始 bit 位開始遞增,位寬為 width。

  • [bit-: width] : 從起始 bit 位開始遞減,位寬為 width。

實(shí)例

//下面 2 種賦值是等效的

A = data1[31-: 8] ;

A = data1[31:24] ;

//下面 2 種賦值是等效的

B = data1[0+ : 8] ;

B = data1[0:7] ;

對(duì)信號(hào)重新進(jìn)行組合成新的向量時(shí),需要借助大括號(hào)。例如:

實(shí)例

wire [31:0]    temp1, temp2 ;

assign temp1 = {byte1[0][7:0], data1[31:8]};  //數(shù)據(jù)拼接

assign temp2 = {32{1'b0}};  //賦值32位的數(shù)值0

整數(shù),實(shí)數(shù),時(shí)間寄存器變量

整數(shù),實(shí)數(shù),時(shí)間等數(shù)據(jù)類型實(shí)際也屬于寄存器類型。

整數(shù)(integer)

整數(shù)類型用關(guān)鍵字 integer 來聲明。聲明時(shí)不用指明位寬,位寬和編譯器有關(guān),一般為32 bit。reg 型變量為無符號(hào)數(shù),而 integer 型變量為有符號(hào)數(shù)。例如:

實(shí)例

reg [31:0]      data1 ;

reg [3:0]       byte1 [7:0]; //數(shù)組變量,后續(xù)介紹

integer j ;  //整型變量,用來輔助生成數(shù)字電路

always@* begin

    for (j=0; j<=3;j=j+1) begin

        byte1[j] = data1[(j+1)8-1 : j8];

        //把data1[7:0]&hellip;data1[31:24]依次賦值給byte1[0][7:0]&hellip;byte[3][7:0]

        end

end

此例中,integer 信號(hào) j 作為輔助信號(hào),將 data1 的數(shù)據(jù)依次賦值給數(shù)組 byte1。綜合后實(shí)際電路里并沒有 j 這個(gè)信號(hào),j 只是輔助生成相應(yīng)的硬件電路。

實(shí)數(shù)(real)

實(shí)數(shù)用關(guān)鍵字 real 來聲明,可用十進(jìn)制或科學(xué)計(jì)數(shù)法來表示。實(shí)數(shù)聲明不能帶有范圍,默認(rèn)值為 0。如果將一個(gè)實(shí)數(shù)賦值給一個(gè)整數(shù),則只有實(shí)數(shù)的整數(shù)部分會(huì)賦值給整數(shù)。例如:

實(shí)例

real        data1 ;

integer     temp ;

initial begin

    data1 = 2e3 ;

    data1 = 3.75 ;

end

initial begin

    temp = data1 ; //temp 值的大小為3

end

時(shí)間(time)

Verilog 使用特殊的時(shí)間寄存器 time 型變量,對(duì)仿真時(shí)間進(jìn)行保存。其寬度一般為 64 bit,通過調(diào)用系統(tǒng)函數(shù) $time 獲取當(dāng)前仿真時(shí)間。例如:

實(shí)例

time       current_time ;

initial begin

       #100 ;

       current_time = $time ; //current_time 的大小為 100

end

數(shù)組

在 Verilog 中允許聲明 reg, wire, integer, time, real 及其向量類型的數(shù)組。

數(shù)組維數(shù)沒有限制。線網(wǎng)數(shù)組也可以用于連接實(shí)例模塊的端口。數(shù)組中的每個(gè)元素都可以作為一個(gè)標(biāo)量或者向量,以同樣的方式來使用,形如:<數(shù)組名>[<下標(biāo)>]。對(duì)于多維數(shù)組來講,用戶需要說明其每一維的索引。例如:

實(shí)例

integer          flag [7:0] ; //8個(gè)整數(shù)組成的數(shù)組

reg  [3:0]       counter [3:0] ; //由4個(gè)4bit計(jì)數(shù)器組成的數(shù)組

wire [7:0]       addr_bus [3:0] ; //由4個(gè)8bit wire型變量組成的數(shù)組

wire             data_bit[7:0][5:0] ; //聲明1bit wire型變量的二維數(shù)組

reg [31:0]       data_4d[11:0][3:0][3:0][255:0] ; //聲明4維的32bit數(shù)據(jù)變量數(shù)組

下面顯示了對(duì)數(shù)組元素的賦值操作:

實(shí)例

flag [1]   = 32'd0 ; //將flag數(shù)組中第二個(gè)元素賦值為32bit的0值

counter[3] = 4'hF ;  //將數(shù)組counter中第4個(gè)元素的值賦值為4bit 十六進(jìn)制數(shù)F,等效于counter[3][3:0] = 4'hF,即可省略寬度;

assign addr_bus[0]        = 8'b0 ; //將數(shù)組addr_bus中第一個(gè)元素的值賦值為0

assign data_bit[0][1]     = 1'b1;  //將數(shù)組data_bit的第1行第2列的元素賦值為1,這里不能省略第二個(gè)訪問標(biāo)號(hào),即 assign data_bit[0] = 1'b1; 是非法的。

data_4d[0][0][0][0][15:0] = 15'd3 ;  //將數(shù)組data_4d中標(biāo)號(hào)為[0][0][0][0]的寄存器單元的15~0bit賦值為3

雖然數(shù)組與向量的訪問方式在一定程度上類似,但不要將向量和數(shù)組混淆。向量是一個(gè)單獨(dú)的元件,位寬為 n;數(shù)組由多個(gè)元件組成,其中每個(gè)元件的位寬為 n 或 1。它們?cè)诮Y(jié)構(gòu)的定義上就有所區(qū)別。

存儲(chǔ)器

存儲(chǔ)器變量就是一種寄存器數(shù)組,可用來描述 RAM 或 ROM 的行為。例如:

實(shí)例

reg               membit[0:255] ;  //256bit的1bit存儲(chǔ)器

reg  [7:0]        mem[0:1023] ;    //1Kbyte存儲(chǔ)器,位寬8bit

mem[511] = 8'b0 ;                  //令第512個(gè)8bit的存儲(chǔ)單元值為0

參數(shù)

參數(shù)用來表示常量,用關(guān)鍵字 parameter 聲明,只能賦值一次。例如:

實(shí)例

parameter      data_width = 10'd32 ;

parameter      i=1, j=2, k=3 ;

parameter      mem_size = data_width * 10 ;

但是,通過實(shí)例化的方式,可以更改參數(shù)在模塊中的值。此部分以后會(huì)介紹。

局部參數(shù)用 localparam 來聲明,其作用和用法與 parameter 相同,區(qū)別在于它的值不能被改變。所以當(dāng)參數(shù)只在本模塊中調(diào)用時(shí),可用 localparam 來說明。

字符串

字符串保存在 reg 類型的變量中,每個(gè)字符占用一個(gè)字節(jié)(8bit)。因此寄存器變量的寬度應(yīng)該足夠大,以保證不會(huì)溢出。

字符串不能多行書寫,即字符串中不能包含回車符。如果寄存器變量的寬度大于字符串的大小,則使用 0 來填充左邊的空余位;如果寄存器變量的寬度小于字符串大小,則會(huì)截去字符串左邊多余的數(shù)據(jù)。例如,為存儲(chǔ)字符串 "run.runoob.com", 需要 14*8bit 的存儲(chǔ)單元:

實(shí)例

reg [0: 14*8-1]       str ;

initial begin

    str = "run.runoob.com";

end  

有一些特殊字符在顯示字符串中有特殊意義,例如換行符,制表符等。如果需要在字符串中顯示這些特殊的字符,則需要在前面加前綴轉(zhuǎn)義字符 \ 。例如下表所示:

Verilog語言數(shù)據(jù)類型基礎(chǔ)知識(shí)點(diǎn)有哪些

其實(shí),在 SystemVerilog(主要用于 Verilog 仿真的編程語言)語言中,已經(jīng)可以直接用關(guān)鍵字 string 來表示字符串變量類型,這為 Verilog 的仿真帶來了極大的便利。

到此,關(guān)于“Verilog語言數(shù)據(jù)類型基礎(chǔ)知識(shí)點(diǎn)有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI