注意:后續(xù)技術(shù)分享,第一時間更新,以及更多更及時的技術(shù)資訊和學(xué)習(xí)技術(shù)資料,將在公眾號CTO Plus發(fā)布,請關(guān)注公眾號:CTO Plus
在Verilog中,有多種數(shù)據(jù)類型可供使用,包括位向量類型、整數(shù)類型、實數(shù)類型、布爾型、時間類型和字符串類型等。下面詳細(xì)介紹Verilog的所有數(shù)據(jù)類型、常量和變量的定義和使用方法。
整型和實型用于表示數(shù)字,布爾型用于表示邏輯值。向量型用于表示多位數(shù)據(jù),例如:
reg [7:0] data; // 8位向量型寄存器
wire [3:0] addr; // 4位向量型線網(wǎng)
Verilog中的變量有線網(wǎng)類型和寄存器類型。線網(wǎng)型變量綜合成wire,而寄存器可能綜合成WIRE,鎖存器和觸發(fā)器,還有可能被優(yōu)化掉。
1、所有類型的作用、特點(diǎn)和代碼示例介紹
以下將詳細(xì)介紹FPGA設(shè)計中Verilog數(shù)據(jù)類型的定義、作用、特點(diǎn)和詳細(xì)的代碼示例。
1. bit
bit類型用于表示單個二進(jìn)制位。在FPGA設(shè)計中,bit類型通常用于表示FPGA的輸入輸出、寄存器等信號的值。
作用:用于表示單個比特位(二進(jìn)制位),只能取0或1。
特點(diǎn):占用存儲空間最小。
代碼示例:
module bit_module (
??? input bit a,
??? input bit b,
??? output bit c
);
assign c = a & b;
endmodule
2. logic
logic類型用于表示邏輯值。在FPGA設(shè)計中,logic類型通常用于表示數(shù)據(jù)的真假值。與bit類型不同的是,logic類型可以取三態(tài)邏輯值(0、1、X),可用于檢測與模擬器中的信號值。
作用:用于表示單個比特位,可以取0、1、X、Z、L、H等值。
特點(diǎn):適用于仿真和綜合。
代碼示例:
module logic_module (
??? input logic a,
??? input logic b,
??? output logic c
);
assign c = a & b;
endmodule
3. reg
reg類型用于表示可賦值的寄存器。在FPGA設(shè)計中,reg類型通常用于存儲邏輯電路中的狀態(tài)(狀態(tài)機(jī)的狀態(tài))或者存儲數(shù)據(jù)(RAM控制器的數(shù)據(jù)緩存區(qū))。
作用:用于表示存儲器或寄存器中的數(shù)據(jù),可以在always塊中賦值。
特點(diǎn):只能在always塊中賦值。
代碼示例:
module reg_module (
??? input bit a,
??? input bit b,
??? output reg c
);
always @(a or b)
begin
??? c = a & b;
end
endmodule
在“always”塊內(nèi)被賦值的每一個信號都必須定義成reg型。
reg型數(shù)據(jù)的缺省初始值是不定值。
reg型只表示被定義的信號將用在“always”塊內(nèi),理解這一點(diǎn)很重要。并不是說reg型信號一定是寄存器或觸發(fā)器的輸出。雖然reg型信號常常是寄存器或觸發(fā)器的輸出,但并不一定總是這樣。
4. wire
wire類型用于連接模塊中的端口。在FPGA設(shè)計中,wire類型通常用于模塊之間的信號連接,如模塊之間的輸入輸出信號連接。
作用:用于表示連線或線路中的數(shù)據(jù),只能在模塊實例化時賦值。
特點(diǎn):只能在模塊實例化時賦值。
代碼示例:
module wire_module (
??? input bit a,
??? input bit b,
??? output wire c
);
and gate1(c, a, b);
endmodule
5. integer
integer類型用于表示整數(shù)值。在FPGA設(shè)計中,integer類型通常用于計數(shù)器、延時器等電路中。
作用:用于表示整數(shù)。
特點(diǎn):占用存儲空間為32位。
代碼示例:
module integer_module (
??? input integer a,
??? input integer b,
??? output integer c
);
assign c = a + b;
endmodule
6. time
time類型用于表示時間。在FPGA設(shè)計中,time類型通常用于表示延遲器、時鐘周期等時間。
作用:用于表示時間。
特點(diǎn):占用存儲空間為64位。
代碼示例:
module time_module (
??? input time a,
??? input time b,
??? output time c
);
assign c = a + b;
endmodule
7. real
real類型用于表示實數(shù)。在FPGA設(shè)計中,real類型通常用于表示浮點(diǎn)數(shù)的計算。
作用:用于表示實數(shù)。
特點(diǎn):占用存儲空間為64位。
代碼示例:
module real_module (
??? input real a,
??? input real b,
??? output real c
);
assign c = a + b;
endmodule
8. realtime
realtime類型用于表示當(dāng)前的時間。在FPGA設(shè)計中,realtime類型通常用于設(shè)計模擬器中,表示仿真當(dāng)前的時間。
作用:用于表示實時數(shù)。
特點(diǎn):占用存儲空間為64位。
代碼示例:
module realtime_module (
??? input realtime a,
??? input realtime b,
??? output realtime c
);
assign c = a + b;
endmodule
9. shortint
shortint類型用于表示帶符號的16位整數(shù)值。在FPGA設(shè)計中,shortint類型通常用于計數(shù)器等電路中。
作用:用于表示短整數(shù)。
特點(diǎn):占用存儲空間為16位。
代碼示例:
module shortint_module (
??? input shortint a,
??? input shortint b,
??? output shortint c
);
assign c = a + b;
endmodule
10. int
int類型用于表示帶符號的32位整數(shù)值。在FPGA設(shè)計中,int類型通常用于計算邏輯、內(nèi)部數(shù)據(jù)儲存等。
作用:用于表示整數(shù)。
特點(diǎn):占用存儲空間為32位。
代碼示例:
module int_module (
??? input int a,
??? input int b,
??? output int c
);
assign c = a + b;
endmodule
11. longint
longint類型用于表示帶符號的64位整數(shù)值。在FPGA設(shè)計中,longint類型通常用于精度要求很高的計算邏輯。
作用:用于表示長整數(shù)。
特點(diǎn):占用存儲空間為64位。
代碼示例:
module longint_module (
??? input longint a,
??? input longint b,
??? output longint c
);
assign c = a + b;
endmodule
12. byte
byte類型用于表示帶符號的8位數(shù)值。在FPGA設(shè)計中,byte類型通常用于存儲壓縮和圖像數(shù)據(jù)等。
作用:用于表示字節(jié)。
特點(diǎn):占用存儲空間為8位。
代碼示例:
module byte_module (
??? input byte a,
??? input byte b,
??? output byte c
);
assign c = a + b;
endmodule
13. wand
wand類型用于實現(xiàn)與邏輯。在FPGA設(shè)計中,wand類型適合表示AND電路。
作用:用于表示與非門輸出的值。
特點(diǎn):只能取0或1。
代碼示例:
module wand_module (
??? input bit a,
??? input bit b,
??? output wand c
);
assign c = ~(a & b);
endmodule
14. wor
wor類型用于實現(xiàn)或邏輯。在FPGA設(shè)計中,wor類型適合表示OR電路。
作用:用于表示或非門輸出的值。
特點(diǎn):只能取0或1。
代碼示例:
module wor_module (
??? input bit a,
??? input bit b,
??? output wor c
);
assign c = ~(a | b);
endmodule
15. tri
tri類型用于表示三態(tài)緩沖器。在FPGA設(shè)計中,tri類型適合表示總線信號。
作用:用于表示三態(tài)門輸出的值。
特點(diǎn):可以取0、1、Z、X等值。
代碼示例:
module tri_module (
??? input bit a,
??? input bit b,
??? output tri c
);
assign c = a ? b : 1'bz;
endmodule
16. triand
triand類型用于表示與邏輯+三態(tài)輸出。在FPGA設(shè)計中,triand類型適合表示總線信號。
作用:用于表示三態(tài)與門輸出的值。
特點(diǎn):可以取0、1、Z、X等值。
代碼示例:
module triand_module (
??? input bit a,
??? input bit b,
??? output triand c
);
assign c = a & b;
endmodule
17. trior
trior類型用于表示或邏輯+三態(tài)輸出。在FPGA設(shè)計中,trior類型適合表示總線信號。
作用:用于表示三態(tài)或門輸出的值。
特點(diǎn):可以取0、1、Z、X等值。
代碼示例:
module trior_module (
??? input bit a,
??? input bit b,
??? output trior c
);
assign c = a | b;
endmodule
18. trireg
trireg類型用于表示三態(tài)輸出+存儲器。在FPGA設(shè)計中,trireg類型適合表示內(nèi)存存儲器控制器的數(shù)據(jù)輸出。
作用:用于表示三態(tài)寄存器輸出的值。
特點(diǎn):只能在always塊中賦值。
代碼示例:
module trireg_module (
??? input bit a,
??? input bit b,
??? output trireg c
);
always @(a or b)
begin
??? c <= a ? b : 1'bz;
end
endmodule
19. supply0/supply1
supply0/supply1類型用于表示邏輯值。在FPGA設(shè)計中,用于保證在仿真器中存在的常量值(供電值)。
作用:用于表示電源和地。
特點(diǎn):只能取0或1。
代碼示例:
module supply_module (
??? input supply0 a,
??? input supply1 b,
??? output supply0 c
);
assign c = a & b;
endmodule
20. small
small類型用于表示帶符號的8位整數(shù)值。
作用:small型是一種數(shù)據(jù)類型,用于表示帶符號的8位整數(shù)值。在FPGA設(shè)計中,small型通常用于計數(shù)器等電路中。
特點(diǎn):small型的取值范圍為-128到127,占用8位二進(jìn)制位。
代碼示例:
module counter(
??? input clk,
??? input rst,
??? output reg [7:0] count
);
always @(posedge clk or posedge rst) begin
??? if(rst) begin
??????? count <= 8'sd0;
??? end else begin
??????? count <= count + 1;
??? end
end
endmodule
21. trio
trio類型用于表示與或非邏輯組合,支持三態(tài)輸出。在FPGA設(shè)計中,trio類型適合表示總線信號。
作用:trio型是一種數(shù)據(jù)類型,用于表示與或非邏輯組合,支持三態(tài)輸出。在FPGA設(shè)計中,trio型適合表示總線信號。
特點(diǎn):trio型的取值范圍為0、1和Z,其中Z表示高阻態(tài)。
代碼示例:
module tri_buffer(
??? inout tri [7:0] data,
??? input enable
);
assign data = enable ? data : 'z;
endmodule
22. large
large類型用于表示大整數(shù)值。在FPGA設(shè)計中,large類型通常用于高精度計算、加密解密等應(yīng)用中。
作用:large型是一種數(shù)據(jù)類型,用于表示大整數(shù)值。在FPGA設(shè)計中,large型通常用于高精度計算、加密解密等應(yīng)用中。
特點(diǎn):large型的取值范圍很大,可達(dá)到2^63-1。
代碼示例:
module rsa(
??? input clk,
??? input [63:0] p,
??? input [63:0] q,
??? input [63:0] e,
??? input [63:0] m,
??? output reg [63:0] c
);
reg [127:0] n;
reg [127:0] d;
reg [127:0] phi;
reg [127:0] temp1;
reg [127:0] temp2;
always @(p or q) begin
??? n = p * q;
??? phi = (p - 1) * (q - 1);
end
always @(e or phi) begin
??? d = e^-1 % phi;
end
always @(posedge clk) begin
??? temp1 = m^e % n;
??? temp2 = temp1^d % n;
??? c <= temp1;
end
endmodule
23. signed
signed類型用于表示帶符號的整數(shù)值。在FPGA設(shè)計中,signed類型通常用于計算機(jī)算術(shù)運(yùn)算、數(shù)字信號處理等應(yīng)用中。
1. Verilog中signed型是一種數(shù)據(jù)類型,用于表示帶符號的標(biāo)量類型。
2. signed型通常用于表示帶符號的數(shù)值類型,其取值范圍為-2^(n-1)到2^(n-1)-1,其中n為位寬。
3. signed型的特點(diǎn)是可以進(jìn)行帶符號的運(yùn)算,如加減乘除等。
4. signed型的代碼示例:
代碼示例
module signed_adder(
??? input signed [31:0] a,
??? input signed [31:0] b,
??? output reg signed [31:0] sum
);
always @(a or b) begin
??? sum = a + b;
end
endmodule
24. unsigned
unsigned類型用于表示無符號的整數(shù)值。在FPGA設(shè)計中,unsigned類型通常用于計算機(jī)算術(shù)運(yùn)算、數(shù)字信號處理等應(yīng)用中。
作用:unsigned型是一種數(shù)據(jù)類型,用于表示無符號的標(biāo)量類型。在FPGA設(shè)計中,unsigned型通常用于表示無符號的數(shù)值類型。
特點(diǎn):unsigned型的取值范圍為0到2^32-1。
代碼示例:
module unsigned_adder(
??? input [31:0] a,
??? input [31:0] b,
??? output reg [31:0] sum
);
always @(a or b) begin
??? sum = a + b;
end
endmodule
25. enum
enum類型用于表示枚舉類型。在FPGA設(shè)計中,enum類型通常用于表示狀態(tài)機(jī)的狀態(tài)、控制信號等。
1. Verilog中enum型是一種數(shù)據(jù)類型,用于表示枚舉類型。
2. enum型通常用于定義一組有限的取值范圍,如狀態(tài)機(jī)的狀態(tài)等。
3. enum型的特點(diǎn)是可以使用可讀性更高的名稱來表示取值,而不是使用數(shù)字。
4. enum型的代碼示例:
代碼示例
typedef enum logic [1:0] {IDLE, READ, WRITE} state;
module state_machine(
??? input clk,
??? input reset,
??? output reg [1:0] current_state
);
state next_state;
always @(posedge clk, posedge reset) begin
??? if (reset) begin
??????? current_state <= IDLE;
??? end else begin
??????? case (current_state)
??????????? IDLE: next_state = READ;
??????????? READ: next_state = WRITE;
??????????? WRITE: next_state = IDLE;
??????? endcase
??????? current_state <= next_state;
??? end
end
endmodule
26. medium
medium類型用于表示中等精度的整數(shù)值。在FPGA設(shè)計中,medium類型通常用于計算邏輯、內(nèi)部數(shù)據(jù)儲存等應(yīng)用中。
作用:medium型是一種數(shù)據(jù)類型,用于表示中等精度的整數(shù)值。在FPGA設(shè)計中,medium型通常用于計算邏輯、內(nèi)部數(shù)據(jù)儲存等應(yīng)用中。
特點(diǎn):medium型的取值范圍為-2^23到2^23-1。
代碼示例:
module multiplier(
??? input clk,
??? input [23:0] a,
??? input [23:0] b,
??? output reg [47:0] p
);
always @(posedge clk) begin
??? p <= a * b;
end
endmodule
27. scalared
scalared類型用于表示帶時間戳的信號值。在FPGA設(shè)計中,scalared類型通常用于仿真器中,用于記錄仿真器中的信號值及其變化時間。
作用:scalared型是一種數(shù)據(jù)類型,用于表示帶符號的標(biāo)量類型。在FPGA設(shè)計中,scalared型通常用于表示帶符號的數(shù)值類型。
特點(diǎn):scalared型的取值范圍為-2^31到2^31-1。
代碼示例:
module signed_adder(
??? input signed [31:0] a,
??? input signed [31:0] b,
? ??output reg signed [31:0] sum
);
always @(a or b) begin
??? sum = a + b;
end
endmodule
28. tril
作用:tril型是一種數(shù)據(jù)類型,用于表示與邏輯+三態(tài)輸出。在FPGA設(shè)計中,tril型適合表示總線信號。
特點(diǎn):tril型的取值范圍為0和Z,其中Z表示高阻態(tài)。
代碼示例:
module tri_and(
??? inout tri out,
??? input [3:0] in
);
assign out = ∈
endmodule
29. vectored
作用:vectored型是一種數(shù)據(jù)類型,用于表示向量類型。在FPGA設(shè)計中,vectored型通常用于表示寄存器、存儲器等。
特點(diǎn):vectored型的取值范圍為多個位,可以使用冒號(:)表示范圍。
代碼示例:
module reg_file(
??? input clk,
??? input [4:0] addr1,
??? input [4:0] addr2,
??? input [31:0] data_in,
??? output reg [31:0] data_out1,
??? output reg [31:0] data_out2
);
reg [31:0] regs [0:31];
always @(posedge clk) begin
??? regs[addr1] <= data_in;
??? regs[addr2] <= data_in;
end
assign data_out1 = regs[addr1];
assign data_out2 = regs[addr2];
endmodule
30. parametr
作用:parametr是一種數(shù)據(jù)類型,用于表示常量值。在FPGA設(shè)計中,parametr通常用于定義常量、參數(shù)等。
特點(diǎn):parametr的值在編譯時確定,不能被修改。
代碼示例:
module adder(
??? input [7:0] a,
??? input [7:0] b,
??? output [7:0] sum
);
parameter WIDTH = 8;
assign sum = a + b;
endmodule
31. real
作用:real型是一種數(shù)據(jù)類型,用于表示浮點(diǎn)數(shù)類型。在FPGA設(shè)計中,real型通常用于模擬器中的仿真計算。
特點(diǎn):real型的取值范圍為IEEE 754標(biāo)準(zhǔn)的單精度浮點(diǎn)數(shù)。
代碼示例:
module floating_point_multiplier(
??? input [31:0] a,
??? input [31:0] b,
??? output reg [31:0] product
);
real r_a;
real r_b;
real r_product;
always @(a or b) begin
??? r_a = $bitstoreal(a);
??? r_b = $bitstoreal(b);
??? r_product = r_a * r_b;
??? product = $realtobits(r_product);
end
endmodule
32. memory
1. Verilog中memory型是一種數(shù)據(jù)類型,用于表示存儲器類型。
2. memory型通常用于表示隨機(jī)訪問存儲器(RAM)或只讀存儲器(ROM)。
3. memory型的特點(diǎn)是可以使用二維數(shù)組來表示存儲器,其中第一維表示存儲器的地址,第二維表示存儲器的數(shù)據(jù)。
4. memory型數(shù)據(jù)是通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來生成的。其格式如下:
reg [n-1:0] 存儲器名[m-1:0];
或
reg [n-1:0] 存儲器名[m:1];
在這里,reg[n-1:0]定義了存儲器中每一個存儲單元的大小,即該存儲單元是一個n位的寄存器。存儲器名后的[m-1:0]或[m:1]則定義了該存儲器中有多少個這樣的寄存器。
reg [7:0] mema[255:0];
這個例子定義了一個名為mema的存儲器,該存儲器有256個8位的存儲器。該存儲器的地址范圍是0到255。注意:對存儲器進(jìn)行地址索引的表達(dá)式必須是常數(shù)表達(dá)式。
盡管memory型數(shù)據(jù)和reg型數(shù)據(jù)的定義格式很相似,但要注意其不同之處。如一個由n個1位寄存器構(gòu)成的存儲器組是不同于一個n位的寄存器的。見下例:?
reg [n-1:0] rega;??? //一個n位的寄存器
reg mema [n-1:0];??? //一個由n個1位寄存器構(gòu)成的存儲器組?
一個n位的寄存器可以在一條賦值語句里進(jìn)行賦值,而一個完整的存儲器則不行。見下例:
rega =0; //合法賦值語句
mema =0;????? //非法賦值語句
?
如果想對memory中的存儲單元進(jìn)行讀寫操作,必須指定該單元在存儲器中的地址。下面的寫法是正確的。
mema[3]=0; //給memory中的第3個存儲單元賦值為0。
memory型的代碼示例:
module memory_controller(
??? input clk,
??? input [7:0] address,
??? input [7:0] write_data,
??? input read_enable,
??? input write_enable,
??? output reg [7:0] read_data
);
reg [7:0] memory [255:0];
always @(posedge clk) begin
??? if (write_enable) begin
??????? memory[address] <= write_data;
??? end
??? if (read_enable) begin
??????? read_data <= memory[address];
??? end
end
endmodule
在這個示例中,我們使用了一個256字節(jié)的存儲器,每個字節(jié)都是8位寬。存儲器的地址和寫入數(shù)據(jù)都是8位寬,讀取數(shù)據(jù)也是8位寬。我們使用了二維數(shù)組memory來表示存儲器,其中第一維表示存儲器的地址,第二維表示存儲器的數(shù)據(jù)。在時鐘上升沿處,如果寫使能信號write_enable為高電平,我們將寫入數(shù)據(jù)write_data寫入存儲器的地址address處。如果讀使能信號read_enable為高電平,我們從存儲器的地址address處讀取數(shù)據(jù),并將其輸出到read_data信號上。
2、數(shù)據(jù)類型
VerilogHDL數(shù)據(jù)類型是用來表示數(shù)字電路硬件中的數(shù)據(jù)儲存和傳送元素的。其中4個最基本的數(shù)據(jù)類型,它們是:reg類型、wire類型、integer類型和parameter類型。
其他的類型是:large類型、medium類型、scalared類型、time類型、small類型、tri類型、trio類型、tril類型、triand類型、trior類型、trireg類型、vectored類型、wand類型、wor類型。這14種數(shù)據(jù)類型除time型外都與基本邏輯單元建庫有關(guān),與系統(tǒng)設(shè)計沒有很大的關(guān)系。
1. 位向量類型
位向量類型是Verilog中最常用的數(shù)據(jù)類型之一,用于表示二進(jìn)制數(shù)值。位向量類型包括有符號位向量(signed)、無符號位向量(unsigned)和邏輯位向量(wire)。位向量類型的定義語法格式如下:
//有符號位向量
reg signed [n-1:0] 變量名;
//無符號位向量
reg [n-1:0] 變量名;
//邏輯位向量
wire [n-1:0] 變量名;
其中,n為位數(shù),可以是任意正整數(shù)。有符號位向量表示帶符號的二進(jìn)制數(shù)值,無符號位向量表示無符號的二進(jìn)制數(shù)值,邏輯位向量表示邏輯電路的輸出值。
2. 整數(shù)類型
整數(shù)類型用于表示整數(shù)數(shù)值,包括有符號整數(shù)類型(integer)和無符號整數(shù)類型(unsigned)。整數(shù)類型的定義語法格式如下:
//有符號整數(shù)
integer 變量名;
//無符號整數(shù)
integer unsigned 變量名;
其中,有符號整數(shù)表示帶符號的整數(shù)數(shù)值,無符號整數(shù)表示無符號的整數(shù)數(shù)值。
3. 實數(shù)類型
實數(shù)類型用于表示實數(shù)數(shù)值,包括單精度實數(shù)類型(real)和雙精度實數(shù)類型(realtime)。實數(shù)類型的定義語法格式如下:
//單精度實數(shù)
real 變量名;
//雙精度實數(shù)
realtime 變量名;
其中,單精度實數(shù)表示單精度的實數(shù)數(shù)值,雙精度實數(shù)表示雙精度的實數(shù)數(shù)值。
4. 時間類型
時間類型用于表示時間數(shù)值,包括時鐘周期類型(timescale)和時間類型(time)。時間類型的定義語法格式如下:
//時鐘周期類型
`timescale 時間單位/時間精度
//時間類型
time 變量名;
其中,時間單位可以是ns、us、ms、s等,時間精度可以是1、10、100、1000等。時間類型表示時間數(shù)值,單位為時間單位。
5. 字符串類型
字符串類型用于表示字符串?dāng)?shù)值,包括字符串類型(string)和文件類型(file)。字符串類型的定義語法格式如下:
//字符串類型
string 變量名;
//文件類型
file 變量名;
其中,字符串類型表示字符串?dāng)?shù)值,文件類型表示文件句柄。
3、常量和變量
Verilog HDL語言中也有常量和變量之分,它們分別屬于以上這些類型。下面就最常用的幾種進(jìn)行介紹。
常量和變量的定義和使用方法
在VerilogHDL中,常量和變量都是用來存儲數(shù)據(jù)的,定義和使用方法與其他編程語言類似。常量是指在程序中不可改變的變量(數(shù)據(jù)),而變量是可以改變的變量(數(shù)據(jù))。常量和變量的定義語法格式如下:
//常量定義
parameter 常量名 = 常量值;
//變量定義
reg 變量名;
其中,常量名為常量的名稱,常量值為常量的值,變量名為變量的名稱。
常量和變量的使用方法如下:
//常量使用
常量名
//變量使用
變量名 = 值;
其中,常量名表示常量的值,變量名表示變量的值,值為常量值或變量值。
3.1 常量
常量的定義和使用方法:
在VerilogHDL中,常量通常用`parameter`關(guān)鍵字定義。`parameter`定義的常量在編譯時就確定了,不能在運(yùn)行時修改。
常量的定義格式如下:
parameter <type> <name> = <value>;
其中,`<type>`表示常量的數(shù)據(jù)類型,`<name>`表示常量的名稱,`<value>`表示常量的值。
常量的使用方法:
在VerilogHDL中,常量可以在任何地方使用,包括模塊實例化、端口連接、賦值語句等。
例如,下面是一個使用常量的示例:
module my_module (
??? input [7:0] a,
??? input [7:0] b,
??? output [7:0] c
);
parameter WIDTH = 8;
assign c = a + b + WIDTH;
endmodule
在上面的示例中,定義了一個常量`WIDTH`,并在賦值語句中使用了它。
在程序運(yùn)行過程中,其值不能被改變的量稱為常量。以下為Verilog HDL語言中使用的數(shù)字及其表示方式。
數(shù)字
(1)整數(shù)在Verilog HDL中,整型常量即整常數(shù)有以下4種進(jìn)制表示形式:
??? 1)二進(jìn)制整數(shù)(b或B);
??? 2)十進(jìn)制整數(shù)(d或D);
??? 3)十六進(jìn)制整數(shù)(h或H);
??? 4)八進(jìn)制整數(shù)(o或O)。
數(shù)字表達(dá)方式有以下3種:
??? 1) <位寬><進(jìn)制><數(shù)字> ,這是一種全面的描述方式。
??? 2)在<進(jìn)制><數(shù)字> 這種描述方式中,數(shù)字的位寬采用默認(rèn)位寬(這由具體的機(jī)器系統(tǒng)決定,但至少32位)。
??? 3)在<數(shù)字>這種描述方式中,采用默認(rèn)進(jìn)制(十進(jìn)制)。
在表達(dá)式中,位寬指明了數(shù)字的精確位數(shù)。例如:一個4位二進(jìn)制數(shù)的數(shù)字的位寬為4,一個4位十六進(jìn)制數(shù)數(shù)字的位寬為16(因為每單個十六進(jìn)制數(shù)就要用4位二進(jìn)制數(shù)來表示)。如:
8'b10101100??????????? //位寬為8的數(shù)的二進(jìn)制表示,'b表示二進(jìn)制
(2)x和z值
在數(shù)字電路中,x表示不定值,z代表高阻值。一個x可以用來定義十六進(jìn)制數(shù)的4位二進(jìn)制數(shù)的狀態(tài),八進(jìn)制數(shù)的3位,二進(jìn)制數(shù)的1位。z的表示方式同x類似。z還有一種表達(dá)方法是可以寫作“?”。在使用case表達(dá)式時建議使用這種寫法,以提高程序的可讀性。如
??? 4'b10x0??? //位寬為4的二進(jìn)制數(shù)從低位起第2位為不定值
??? 4'b101z??? //位寬為4的二進(jìn)制數(shù)從低位起第1位為高阻值
??? 12'dz????? //位寬為12的十進(jìn)制數(shù),其值為高阻值(第1種表達(dá)方式)
??? 12'd?????? //位寬為12的十進(jìn)制數(shù),其值為高阻值(第2種表達(dá)方式)
??? 8'h4x????? //位寬為8的十六進(jìn)制數(shù),其低4位值為不定值
(3) 負(fù)數(shù)
一個數(shù)字可以被定義為負(fù)數(shù),只需在位寬表達(dá)式前加一個減號,減號必須寫在數(shù)字定義表達(dá)式的最前面。
注:減號不可以放在位寬和進(jìn)制之間,也不可以放在進(jìn)制和具體的數(shù)之間。如
??? -8'd5??? //5的補(bǔ)數(shù)(用八位二進(jìn)制數(shù)表示)
??? 8'd-5??? //非法格式
(4)下劃線
下劃線可以用來分隔開數(shù)的表達(dá)以提高程序的可讀性。下劃線不可以用在位寬和進(jìn)制處,只能用在具體的數(shù)字之間。
??? 16'b1010_1011_1111_1010??? //合法格式
??? 8'b_0011_1010????????????? //非法格式
當(dāng)常量不說明位數(shù)時,默認(rèn)是32位,每個字符用8位ASCII值表示。如:
??? 10 = 32'd10 = 32'b1010
??? 1 = 32'd1 = 32'b1
??? -1 = -32'd1 = 32'hFFFFFFFF
??? `BX = 32'BX = 32'BXXXXXXX...X
??? "AB" = 16'B01000001_01000010??????? //字符串AB,為十六進(jìn)制數(shù)16'h4142
參數(shù)型
在Verilog HDL中用parameter來定義常量,即用parameter來定義一個標(biāo)識符代表一個常量,格式如下:
parameter 參數(shù)名1 = 表達(dá)式, 參數(shù)名2 = 表達(dá)式, … , 參數(shù)名n = 表達(dá)式;
parameter是參數(shù)型數(shù)據(jù)的確認(rèn)符。確認(rèn)符后跟著一個用逗號分隔開的賦值語句表。在每一個賦值語句的右邊必須是一個常數(shù)表達(dá)式。也就是說,該表達(dá)式只能包含數(shù)字或先前已定義過的參數(shù)。
??? parameter msb = 7;???????? //定義參數(shù)msb為常量7
??? parameter e = 25, f = 29;??? //定義兩個常數(shù)參數(shù)parameterr=5.7;∥聲明r為一個實型參數(shù)
??? parameter byte_size = 8, byte_msb = byte_size - 1;??? //用常數(shù)表達(dá)式賦值
??? parameter average_delay = (r + f) / 2;??? //用常數(shù)表達(dá)式賦值
3.2 變量
變量的定義和使用方法:
在VerilogHDL中,變量通常用`<type>`關(guān)鍵字定義。變量的值可以在運(yùn)行時修改。
變量的定義格式如下:
<type> <name>;
其中,`<type>`表示變量的數(shù)據(jù)類型,`<name>`表示變量的名稱。
變量的使用方法:
在VerilogHDL中,變量可以在任何地方使用,包括模塊實例化、端口連接、賦值語句等。
例如,下面是一個使用變量的示例:
module my_module (
??? input [7:0] a,
??? input [7:0] b,
??? output [7:0] c
);
reg [7:0] sum;
always @(a or b)
begin
??? sum <= a + b;
end
assign c = sum;
endmodule
在上面的示例中,定義了一個變量`sum`,并在`always`塊中對它進(jìn)行了賦值。最后,將變量`sum`賦值給輸出端口`c`。
wire型
wire型數(shù)據(jù)常用來表示用以assign關(guān)鍵字指定的組合邏輯信號。Verilog程序模塊中輸入、輸出信號類型默認(rèn)時自動定義為wire型。wire型信號可以用做任何方程式的輸入,也可以用做“assign”語句或?qū)嵗妮敵觥?/p>
wire型信號的格式同reg型信號的格式很類似。
wire[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2…數(shù)據(jù)名i;/共有i條總線,每條總線內(nèi)有n條線路,或wire[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2…數(shù)據(jù)名i。
wire是wire型數(shù)據(jù)的確認(rèn)符;[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位;最后跟著的是數(shù)據(jù)的名字。如果一次定義多個數(shù)據(jù),數(shù)據(jù)名之間用逗號隔開。聲明語句的最后要用分號表示語句結(jié)束。
??? wire a;???????????? //定義了一個1位的wire型數(shù)據(jù)
??? wire[7:0]b;??????? //定義了一個8位的wire 型數(shù)據(jù)
??? wire[4:1]c, d;???? //定義了二個4位的wire型數(shù)據(jù)
reg型
寄存器是數(shù)據(jù)儲存單元的抽象。寄存器數(shù)據(jù)類型的關(guān)鍵字是reg。通過賦值語句可以改變寄存器儲存的值,其作用與改變觸發(fā)器儲存的值相當(dāng)。Verilog HDL語言提供了功能強(qiáng)大的結(jié)構(gòu)語句,使設(shè)計者能有效地控制是否執(zhí)行這些賦值語句。這些控制結(jié)構(gòu)用來描述硬件觸發(fā)條件,例如時鐘的上升沿和多路器的選通信號。reg類型數(shù)據(jù)的默認(rèn)初始值為不定值x。
reg型數(shù)據(jù)常用來表示“always”模塊內(nèi)的指定信號,常代表觸發(fā)器。通常,在設(shè)計中要由“always”模塊通過使用行為描述語句來表達(dá)邏輯關(guān)系。在“always”模塊內(nèi)被賦值的每一個信號都必須定義成reg型。
reg型數(shù)據(jù)的格式如下:
reg[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2…,數(shù)據(jù)名i;或reg[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,…,數(shù)據(jù)名i;
reg是reg型數(shù)據(jù)的確認(rèn)標(biāo)識符;[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位(bit);最后跟著的是數(shù)據(jù)的名字。如果一次定義多個數(shù)據(jù),數(shù)據(jù)名之間用逗號隔開。聲明語句的最后要用分號表示語句結(jié)束??聪旅娴膸讉€例子:
??? reg rega;??? //定義了一個1位的名為rega的reg型數(shù)據(jù)
??? reg[3:0]regb;??? ∥定義了一個4位的名為regb的reg型數(shù)據(jù)
??? reg[4:1]regc,regd;??? ∥定義了二個4位的名為regc和regd的reg型數(shù)據(jù)
reg型數(shù)據(jù)的默認(rèn)初始值是不定值。reg型數(shù)據(jù)可以賦正值,也可以賦負(fù)值。但當(dāng)一個reg型數(shù)據(jù)是一個表達(dá)式中的操作數(shù)時,它的值被當(dāng)作是無符號值,即正值。例如,當(dāng)一個4位的寄存器用做表達(dá)式中的操作數(shù)時,如果開始寄存器被賦以值-1,則在表達(dá)式中進(jìn)行運(yùn)算時,其值被認(rèn)為是+15。
??? 注意:reg型只表示被定義的信號將用在“always”模塊內(nèi),理解這一點(diǎn)很重要。并不是說reg型信號一定是寄存器或觸發(fā)器的輸出,雖然reg型信號常常是寄存器或觸發(fā)器的輸出,但并不一定總是這樣。
memory型
Verilog HDL通過對reg型變量建立數(shù)組來對存儲器建模,可以描述RAM型存儲器、ROM存儲器和reg文件。數(shù)組中的每一個單元通過一個數(shù)組索引進(jìn)行尋址。在Verilog語言中沒有多維數(shù)組存在。memory型數(shù)據(jù)是通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來生成的。其格式如下:
reg[n-1:0]存儲器名[m一1:0];或reg[n-1:0]存儲器名[m:1];
在這里,reg[n-1:0]定義了存儲器中每一個存儲單元的大小,即該存儲單元是一個n位的寄存器;存儲器名后的[m-1:0]或[m:1]則定義了該存儲器中有多少個這樣的寄存器;最后用分號結(jié)束定義語句。下面舉例說明:
reg[7:0] mema[255:0];
這個例子定義了一個名為mema的存儲器,該存儲器有256個8位的存儲器。該存儲器的地址范圍是0到255。注意:對存儲器進(jìn)行地址索引的表達(dá)式必須是常數(shù)表達(dá)式。
另外,在同一個數(shù)據(jù)類型聲明語句里,可以同時定義存儲器型數(shù)據(jù)和reg型數(shù)據(jù)。見下例:
??? parameter wordsize=16,//定義兩個參數(shù)
????????????? memsize=256;
??? reg[wordsize-1:0]mem[memsize-1:0],writereg,readreg;
盡管memory型數(shù)據(jù)和reg型數(shù)據(jù)的定義格式很相似,但要注意其不同之處。如一個由n個1位寄存器構(gòu)成的存儲器組是不同于一個n位的寄存器的。見下例:
??? reg[n-1:0]rega;//一個n位的寄存器
??? reg mema[n-1:0];//一個由n個1位寄存器構(gòu)成的存儲器組
一個n位的寄存器可以在一條賦值語句里進(jìn)行賦值,而一個完整的存儲器則不行。見下例:
??? rega=0;??? //合法賦值語句
??? mema=0;??? //非法賦值語句
如果想對memory中的存儲單元進(jìn)行讀寫操作,必須指定該單元在存儲器中的地址。下面的寫法是正確的:
mema[3]=0; //給memory中的第3個存儲單元賦值為0
進(jìn)行尋址的地址索引可以是表達(dá)式,這樣就可以對存儲器中的不同單元進(jìn)行操作。表達(dá)式的值可以取決于電路中其他的寄存器的值。
SteveRocket的博客_CSDN博客-Python進(jìn)階,Django進(jìn)階,C進(jìn)階領(lǐng)域博主SteveRocket擅長Python進(jìn)階,Django進(jìn)階,C進(jìn)階,等方面的知識https://blog.csdn.net/zhouruifu2015/
更多資料 · 微信公眾號搜索【CTO Plus】關(guān)注后,獲取更多,我們一起學(xué)習(xí)交流。
關(guān)于公眾號的描述訪問如下鏈接
?
關(guān)于Articulate“做一個知識和技術(shù)的搬運(yùn)工。做一個終身學(xué)習(xí)的愛好者。做一個有深度和廣度的技術(shù)圈。”一直以來都想把專業(yè)領(lǐng)域的技https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q
推薦閱讀:
-
FPGA在工業(yè)缺陷檢測上的應(yīng)用實踐
-
FPGA設(shè)計Verilog基礎(chǔ)之Verilog全局變量和局部變量定義
-
FPGA設(shè)計Verilog基礎(chǔ)之Verilog中clk為什么要用posedge,而不用negedge
-
初學(xué)者必須弄懂的一些基本FPGA設(shè)計概念(1)
-
工作總結(jié)之全網(wǎng)最全的103個Verilog關(guān)鍵字總結(jié)(上)
-
工作總結(jié)之全網(wǎng)最全的103個Verilog關(guān)鍵字總結(jié)(下)?
-
5G時代的FPGA發(fā)展趨勢和應(yīng)用分析
-
FPGA結(jié)合chatgpt的應(yīng)用開發(fā)實踐
-
FPGA | FPGA設(shè)計流程指南 v2.0
-
設(shè)計規(guī)范 | 總結(jié)開發(fā)過程中DDR3和FPGA部分的設(shè)計規(guī)范
-
術(shù)語一覽 | 總結(jié)開發(fā)過程中關(guān)于FPGA的專業(yè)術(shù)語文章來源:http://www.zghlxwxcb.cn/news/detail-776447.html
-
用AI幫我寫一篇關(guān)于FPGA的文章,并推薦最熱門的FPGA開源項目文章來源地址http://www.zghlxwxcb.cn/news/detail-776447.html
到了這里,關(guān)于FPGA設(shè)計Verilog基礎(chǔ)之?dāng)?shù)據(jù)類型的作用和特點(diǎn)、常量和變量的代碼示例詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!