1、數(shù)值類型
? ? ? ? 在Verilog可以用4種數(shù)值來描述其構(gòu)建的電路的電平邏輯,除了event類型和real類型外,幾乎所有的數(shù)據(jù)類型都可以用這4種數(shù)值來表示。
- 0:代表邏輯0,或者條件“假”
- 1:代表邏輯1,或者條件“真”
- x或X:代表未知值。意味著不確定,可能是邏輯0,也可能是邏輯1。
- z或Z:代表高阻態(tài),一般用于3態(tài)緩沖電路(tri-state buffer)。高阻態(tài)常見于該端口沒有驅(qū)動的情況,其電平值與其所接的上拉或下拉電路有關(guān)。若連接到上拉電路,則電平值為邏輯1;反之則為邏輯0。
? ? ? ? 不同的仿真軟件對這些數(shù)值的顯示可能各不相同,在xilinx的vivado軟件這4種數(shù)值的顯示是這樣的:1是全覆蓋的綠色橫框;0 是綠色橫條;x 是半覆蓋的紅色橫框;z 是半覆蓋的藍(lán)色橫框。
2、數(shù)據(jù)類型
????????Verilog中主要有兩大類數(shù)據(jù)類型:
- Net(網(wǎng)類):Net用來表示電路中的物理鏈接,例如不同門級電路間的連接就需要使用nets,類似實際電路中的電線。
- Variable(變量類):變量用來存儲電路中的數(shù)據(jù),它會一直保存數(shù)據(jù)直到下一次改寫。
2.1、Net類型
????????Net用來構(gòu)建電路中不同元素的物理連接,自身不存儲任何數(shù)據(jù),它的值只取決于所連接的驅(qū)動電路的值(默認(rèn)值為z,即高阻態(tài))。Net類數(shù)據(jù)下有很多子類型的數(shù)據(jù),比如wire、tri、wand、wor、tri1等等,其中wire類型是最常用的,其他類型數(shù)據(jù)在實踐中幾乎不會被用到。
2.1.1、wire類型
????????下圖中的net_11就是一個net型數(shù)據(jù)(確切的說應(yīng)該是wire數(shù)據(jù)),它左邊連接著與門的輸出端、右邊連接著觸發(fā)器的輸入端。它自身不能存儲任何數(shù)據(jù),它的值取決于它左側(cè)所連接的與門的輸出端,然后它又將這個值賦給它右側(cè)所連接的觸發(fā)器。
? ? ? ? 下面是幾種wire類型的聲明方式:
wire? ? ? ? flag;? ? ? ? ? ? ? ? ? ? //聲明一個wire
wire? ? ? ? flag1,flag2;? ? ? ? ?//聲明多個wire
wire? ? ? ? flag = 1'b0;? ? ? ? ?//聲明wire的同時并賦值
??????
2.1.2、其他net類型
? ? ? ? 除了wire類型外,還有一些其他的net類型。由于verilog語言的靈活性,這些net類型幾乎都可以使用wire類型 + 門級電路來構(gòu)建,所以在實踐中,這些類型一般都不會被使用。這里稍微了解一下就可以:
2.2、Variable類型?
????????Variable(變量)類型用來存儲電路中的數(shù)據(jù),它會一直保存數(shù)據(jù)直到下一次改寫。Variable類型有reg、time、integer、real和realtime5個子類型,其中最為常用的是reg(寄存器)類型。
2.2.1、reg變量?
????????reg和wire是verilog中最為常用的兩種數(shù)據(jù)類型,它倆可以分別用來構(gòu)建組合邏輯電路和時序邏輯電路。
? ? ? ? reg以時鐘信號為基準(zhǔn),用來在電路中存儲數(shù)據(jù),觸發(fā)器(flip-flop)就是一種典型的存儲數(shù)據(jù)的電路。下面是幾種reg變量的聲明方式:
reg???????flag;? ? ? ? ? ? ? ? ? ? //聲明一個reg
reg? ? ? ?flag1,flag2;? ? ? ? ?//聲明多個reg
reg? ? ? ?flag = 1'b0;? ? ? ? ?//聲明reg的同時并賦值
?????
2.2.1、其他變量
integer(整數(shù))
????????整數(shù)變量用關(guān)鍵字 integer 來聲明,聲明時不用指明位寬--位寬和編譯器有關(guān)(一般為32 bit)。在實踐中,integer變量一般用作輔助使用(integer的引入并不會生成硬件電路),例如指定某個reg/wire的位寬(方便更改),或在循環(huán)語句中充當(dāng)循環(huán)參數(shù)等。例如:
integer i;
always@(*) begin
? ? for (i=0;i<=5;i=i+1) begin
? ? ? ? ······
? ? end
end
real(實數(shù))
????????實數(shù)用關(guān)鍵字 real 來聲明,可用十進(jìn)制或科學(xué)計數(shù)法來表示。real 聲明不能帶有范圍,默認(rèn)值為 0。real 可以用來存儲浮點數(shù)。例如:
real????????data1 =1e3;
real????????data2 = 3.14;
time、realtime(時間)
????????time/realtime變量可以用保存仿真時間,位寬多為64bit,調(diào)用系統(tǒng)函數(shù)$time/$realtime可以獲取當(dāng)前仿真時間,time和realtime的區(qū)別在于,一個是存儲整數(shù)變量(time),另一個存儲實數(shù)變量(realtime)。例如:
time ????????t1? = 25;
realtime? ?rt1 = 2.5;
3、向量
? ? ? ? 在聲明wire或reg變量時,如果不指定范圍,那么此時的wire/reg就是一個標(biāo)量(scalar);反之,如果指定了范圍,那么此時的wire/reg就是一個向量(Vector)。
? ? ? ? wire類型的向量與標(biāo)量形式:
wire? [3:0]? n0;? ? ? ? //4位寬的向量wire
wire? ? ? ? ? ?n1;? ? ? ? //單位寬的標(biāo)量wire
? ? ? ? reg類型的向量與標(biāo)量形式:
reg? [3:0]? d0;? ? ? ? //4位寬的向量reg
reg? ? ? ? ? ?d1;? ? ? ? //單位寬的標(biāo)量reg
? ? ? ? 向量最左端的值被稱為最高有效位MSB(Most Significant Bit),最右端的值被稱為最低有效位?LSB(Least Significant Bit)。MSB和LSB的值可以是任意整數(shù)(正整數(shù)、負(fù)整數(shù)和零),而且MSB即可以大于LSB,也可以小于LSB,但兩者不能相等(相等就是標(biāo)量了)
? ? ? ? 對于向量,可以根據(jù)其地址,來對某一位或某幾位進(jìn)行操作。
位操作(bit-selsct)
? ? ? ? 可以通過地址索引的方式,對向量中的某一位進(jìn)行選取和操作,這就是位操作bit-selsct。例如:
reg? [7:0] addr;? ? ? ? ?//聲明一個8位寬的reg型變量(向量)addr
addr [0] = 1'b1;? ? ? ? //直接對addr的第0位進(jìn)行操作,將其賦值為1
addr [3] = 1'b0;? ? ? ? //直接對addr的第3位進(jìn)行操作,將其賦值為0
部分操作(part-selsct)?
? ? ? ? 既然可以通過地址作為索引,來對向量的某一位進(jìn)行操作,那么必然也可以通過多位地址來對向量的多位進(jìn)行操作,這就是部分操作part-selsct。例如:
reg? [31:0] addr;????????????????//聲明一個32位寬的reg型變量(向量)addr
addr[23:16] = 8'h23;?????????//直接對addr的第16~23位進(jìn)行操作,將其賦值為8'h23,即8'b0010_0011
????????Verillog 還支持指定 bit 位后固定位寬的向量域選擇訪問。開始位可以是變化的,但是位寬必須固定為常數(shù),這個語法在循環(huán)等語句中非常實用。
- [start_bit+:width]? ? //從start_bit開始向上遞增width位
- [start_bit-:width]? ? //從start_bit開始向下遞減width位
?reg? [31-:8]? addr1;? ? ? ? //等價于?reg? [31:24] addr1。實踐中起始位31可以變化,位寬固定為8,等于選取該變量的某個8位
?reg? [0+:8]? ?addr2;? ? ? ? //等價于?reg? [0:7]? ?addr2。實踐中起始位0可以變化,位寬固定為8,等于選取該變量的某個8位
4、數(shù)組和存儲器
4.1、數(shù)組
????????在 Verilog 中可以聲明 reg, wire, integer, time, real類型的數(shù)組(Array)。數(shù)組維數(shù)沒有限制,其中的每個元素可以是標(biāo)量或者向量。
reg? ? ? ? ?y1[3:0];? ? ? ? ? ? ? ? //1維數(shù)組,共有4個元素,每個元素位寬為1(即標(biāo)量)
reg [3:0] y2[3:0];? ? ? ? ? ? ? ? //1維數(shù)組,共有4個元素,每個元素位寬為4
reg [3:0] y3[3:0][15:0];? ? ? ?//2維數(shù)組,共有4*16 = 64個元素,每個元素位寬為4
? ? ? ? ?數(shù)組與向量一樣,也可以通過地址索引的方式進(jìn)行訪問。
y1 = 0;? ? ? ? ? ? ? ? ????????//非法賦值--不能同時對4個元素賦值
y1[0] = 1'b0; ??????????????//對y1的第0個元素賦值為1'b0
y2[2] =?4'b1111;? ? ? ? ? //對y2的第2個元素賦值為4'b1010
y3[2] [1] =?4'b1100;? ? //對y3的第2行、第1個元素賦值為4'b1100
????????需要注意的是,向量是一個單獨的元件,其位寬為 n;而數(shù)組則由多個元件組成,其每個元件的位寬為 n 或 1。盡管他們的訪問方式類似,但它們在定義上就有所區(qū)別。
reg [n-1:0]? ?rega;? ?? ? ? ? // rega是一個reg向量,它只有一個元件,位寬為n
reg? mema [n-1:0]; ????????// mema 是一個數(shù)組,它有n個元件,每個元件的位寬為1
4.2、存儲器
????????存儲器(Memory)就是一種一維寄存器數(shù)組,它可以用來構(gòu)建 RAM(可讀寫) 或 ROM(僅可讀)。
文章來源:http://www.zghlxwxcb.cn/news/detail-722076.html
reg [7:0] mem [255:0];? ? ? ? //可以理解為構(gòu)建了一個256個格子的存儲器,每個格子都可以存儲8個bit的數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-722076.html
- ??您有任何問題,都可以在評論區(qū)和我交流??!
- ??本文由 孤獨的單刀 原創(chuàng),首發(fā)于CSDN平臺??,博客主頁:wuzhikai.blog.csdn.net
- ??您的支持是我持續(xù)創(chuàng)作的最大動力!如果本文對您有幫助,還請多多點贊??、評論??和收藏?!
到了這里,關(guān)于深入淺出學(xué)Verilog--數(shù)據(jù)類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!