本文將討論 verilog 中常用的數據類型,包括對數據表示、線網類型、變量類型和數組,分享一下使用方法和注意事項。
一、Verilog 中的數值表示
編寫 verilog代碼 時,經常需要在代碼中表示數據值,可以將這些數據表示為2進制、8進制、10進制或16進制值。
特別是verilog中需要定義數據的位寬,因為verilog 本質上是在描述硬件電路。
語法:
說明:
- bits:位寬,可省略,則默認是32bit
- representation:進制, b或B表示2進制,o或O表示8進制,d或D表示10進制,h或H表示16進制,可省略,則默認是十進制?
- value :具體數值
示例:
8'b1000_1000; //2進制表示
4'o10; //8進制表示
4'd8; //10進制表示
4'h8; //十六進制表示
每一個bit位不同值表示:
二、Verilog 中的基本數據類型
verilog 中的基本數據類型可以分為兩大類:線網類型(net)和變量類型(variable )
net類型用來對數字電路中的連接關系建模,無法存儲數值,表示數據驅動路線。
variable類型用來對寄存器或觸發器建模,可以存儲數據。
1、Verilog 中的net類型
用來描述設計中不同組件之間的物理連接,net類型本身不能用于存儲數據或驅動數據。
通常使用連續賦值(continuous assignment)語句來將數據驅動到線型(wire)上,如assign 語句。
verilog 中最常用的net類型就是wire類型。 使用wire類型來聲明設計中基本的點對點連接信號,顧名思義,它們大致相當于傳統電路中的電線(wire英文原意)。
wire a; //聲明一個1位寬wire類型信號a
assign a = c; //使用assign關鍵字來賦值
assign b = d; //使用assign關鍵字來賦值
2、Verilog 中的變量類型
verilog 中使用變量類型來存儲數據,可以一直保持這個值直到被再次賦值。
verilog中最常用的變量類型是reg類型,用于always語句塊內,如下面的代碼片段所示,實現了一個D觸發器。
reg q;
//D觸發器
always @(posedge clock)
q <= d;
end
雖然reg 類型常被用來建模觸發器,但在某些情況下,reg 類型也可用于在 verilog 中對組合邏輯進行建模。
reg q;
always @(*)
q = d;
end
verilog 中最常用的數值數據類型是integer類型。 但是,integer類型通常用于模塊中的內部信號而不是端口。
注意:integer默認是32bit的有符號數。
integer a = 255; //聲明一個值為255的integer類型變量a
3、Verilog 中的有符號(Signed)和無符號數據(Unsigned)
Verilog-2001 標準引入了signed 和 unsigned關鍵字,在Verilog-2001標準發布之前,所有net類型和variable類型都只能用于存儲無符號(Unsigned)數據類型。
默認情況下,integer類型是有符號的,而 reg 和 wire 類型都是無符號的。 如果希望修改此默認行為,則需要使用這些關鍵字(signed 和 unsigned),在 verilog 代碼中將變量類型聲明為signed時,會是補碼。
示例:
//聲明無符號reg變量a、有符號reg變量b
reg [31:0] a;
reg signed [31:0] b;
//聲明無符號wire變量a、有符號wire變量b
wire [31:0] a;
wire signed [31:0] b;
//聲明無符號integer變量a、有符號integer變量b
integer unsigned a;
integer b;
4、Verilog 中的數組(Arrays )
在 verilog 中可以創建和使用Arrays(數組)類型,在FPGA中實際是使用LUT或BRAM來實現的。
(1)一維數組
語法:
說明:
- type表示數組元素的類型
- size表示數據元素的位寬大小
- variable_name表示數組名稱
- elements是表示數組的大小
示例:
//定義一個共有8個元素的數組example,每個元素的位寬為3位
wire [2:0] example [7:0];
可以使用帶有數組下標的方括號來訪問數組中的單個元素,如:
//將5賦值給數組example中的最后一個元素
assign example[7] = 3'h5;
(2)多維數組
在Verilog-1995標準中,只能創建一維數組。 verilog 2001 標準則可以創建多于一維的數組。 為此,只需添加另一個字段來定義需要的元素數量。
語法:
說明:
- type表示數組元素的類型
- size表示數據元素的位寬大小
- variable_name表示數組名稱
- elements0是表示數組第一層的大小
- elements1表示數組第二層的大小
示例:
wire [3:0] example2d [7:0][1:0];
//賦值操作
assign example2d [7][1] = 4'ha;
assign example2d [7][0] = 4'ha;
verilog數組還是挺好用的,可以用于簡化寫代碼的邏輯,適用于循環復制的模塊或代碼。
genvar i;
wire [1:0] data_in [0:4];
wire [1:0] data_out [0:4];
generate
for(i = 0; i < 5; i = i + 1) begin: module_test
mod_test u_mod_test(
.clk(clk),
.reset(reset),
.data_in(data_in[i]),
.data_out(data_out[i])
);
end
endgenerate
integer j;
reg [2:0] shift_add_index [0:8];
always@(posedge clk) begin
shift_add_index[0] <= 'd2;
end
always@(posedge clk) begin
for(j = 1; j < 9; j = j+1) begin
shift_add_index[j] <= shift_add_index[j-1] + j;
end
end
-
寄存器
+關注
關注
31文章
5363瀏覽量
120933 -
Verilog
+關注
關注
28文章
1351瀏覽量
110258 -
數值
+關注
關注
0文章
80瀏覽量
14385 -
觸發器
+關注
關注
14文章
2003瀏覽量
61286 -
數據類型
+關注
關注
0文章
236瀏覽量
13649
發布評論請先 登錄
相關推薦
評論