大家好,又到了每日學(xué)習(xí)的時(shí)間了,今天我們來(lái)聊一聊FPGA verilog中的function用法與例子。
函數(shù)的功能和任務(wù)的功能類(lèi)似,但二者還存在很大的不同。在 Verilog HDL 語(yǔ)法中也存在函數(shù)的定義和調(diào)用。
1.函數(shù)的定義
函數(shù)通過(guò)關(guān)鍵詞 function 和 endfunction 定義,不允許輸出端口聲明(包括輸出和雙向端口) ,但可以有多個(gè)輸入端口。函數(shù)定義的語(yǔ)法如下:
function [range] function_id;
input_declaration
other_declarations
procedural_statement
endfunction
其中,function 語(yǔ)句標(biāo)志著函數(shù)定義結(jié)構(gòu)的開(kāi)始;[range]參數(shù)指定函數(shù)返回值的類(lèi)型或位寬,是一個(gè)可選項(xiàng),若沒(méi)有指定,默認(rèn)缺省值為 1 比特的寄存器數(shù)據(jù);function_id 為所定義函數(shù)的名稱(chēng),對(duì)函數(shù)的調(diào)用也是通過(guò)函數(shù)名完成的,并在函數(shù)結(jié)構(gòu)體內(nèi)部代表一個(gè)內(nèi)部變量,函數(shù)調(diào)用的返回值就是通過(guò)函數(shù)名變量傳遞給調(diào)用語(yǔ)句;input_declaration 用于對(duì)函數(shù)各個(gè)輸入端口的位寬和類(lèi)型進(jìn)行說(shuō)明,在函數(shù)定義中至少要有一個(gè)輸入端口;endfunction為函數(shù)結(jié)構(gòu)體結(jié)束標(biāo)志。下面給出一個(gè)函數(shù)定義實(shí)例。
定義函數(shù)實(shí)例:
function AND; //定義輸入變量
input A, B; //定義函數(shù)體
begin
AND = A && B;
end
endfunction
函數(shù)定義在函數(shù)內(nèi)部會(huì)隱式定義一個(gè)寄存器變量, 該寄存器變量和函數(shù)同名并且位寬也一致。函數(shù)通過(guò)在函數(shù)定義中對(duì)該寄存器的顯式賦值來(lái)返回函數(shù)計(jì)算結(jié)果。此外,還有下列
幾點(diǎn)需要注意:
(1)函數(shù)定義只能在模塊中完成,不能出現(xiàn)在過(guò)程塊中;
(2)函數(shù)至少要有一個(gè)輸入端口;不能包含輸出端口和雙向端口;
(3) 在函數(shù)結(jié)構(gòu)中, 不能使用任何形式的時(shí)間控制語(yǔ)句 (#、 wait 等) , 也不能使用 disable中止語(yǔ)句;
(4)函數(shù)定義結(jié)構(gòu)體中不能出現(xiàn)過(guò)程塊語(yǔ)句(always 語(yǔ)句) ;
(5)函數(shù)內(nèi)部可以調(diào)用函數(shù),但不能調(diào)用任務(wù)。
2.函數(shù)調(diào)用
和任務(wù)一樣,函數(shù)也是在被調(diào)用時(shí)才被執(zhí)行的,調(diào)用函數(shù)的語(yǔ)句形式如下: func_id(expr1, expr2, ........., exprN) ,其中,func_id 是要調(diào)用的函數(shù)名,expr1, expr2, ......exprN是傳遞給函數(shù)的輸入?yún)?shù)列表,該輸入?yún)?shù)列表的順序必須與函數(shù)定義時(shí)聲明其輸入的順序相同。下面給出一個(gè)函數(shù)調(diào)用實(shí)例。
函數(shù)調(diào)用實(shí)例:
module comb15 (A, B, CIN, S, COUT);
input [3:0] A, B;
input CIN;
output [3:0] S;
output COUT;
wire [1:0] S0, S1, S2, S3;
function signed [1:0] ADD;
input A, B, CIN;
reg S, COUT;
begin
S = A ^ B ^ CIN;
COUT = (A&B) | (A&CIN) | (B&CIN);
ADD = {COUT, S};
end
endfunction
assign S0 = ADD (A[0], B[0], CIN),
S1 = ADD (A[1], B[1], S0[1]),
S2 = ADD (A[2], B[2], S1[1]),
S3 = ADD (A[3], B[3], S2[1]),
S = {S3[0], S2[0], S1[0], S0[0]},
COUT = S3[1];
endmodule
在函數(shù)調(diào)用中,有下列幾點(diǎn)需要注意:
(1)函數(shù)調(diào)用可以在過(guò)程塊中完成,也可以在 assign 這樣的連續(xù)賦值語(yǔ)句中出現(xiàn)。
(2)函數(shù)調(diào)用語(yǔ)句不能單獨(dú)作為一條語(yǔ)句出現(xiàn),只能作為賦值語(yǔ)句的右端操作數(shù)。
今天就聊到這里,各位,加油。
-
FPGA
+關(guān)注
關(guān)注
1645文章
22050瀏覽量
618642 -
Verilog
+關(guān)注
關(guān)注
29文章
1367瀏覽量
112303
發(fā)布評(píng)論請(qǐng)先 登錄
簡(jiǎn)談FPGA的上電復(fù)位

Verilog實(shí)現(xiàn)閏年的判斷(ISE8.21中調(diào)試通過(guò))
在FPGA_CPLD中實(shí)現(xiàn)AD或DA的文章(英文Verilog)
簡(jiǎn)談FPGA verilog中的task用法
簡(jiǎn)談FPGA/Verilog中inout端口使用方法
簡(jiǎn)談FPGA verilog中的repeat用法與例子

FPGA設(shè)計(jì)中DAC控制的Verilog實(shí)現(xiàn)

FPGA CPLD中的Verilog設(shè)計(jì)小技巧

FPGA中如何使用Verilog處理圖像
FPGA和USB3.0通信-FX3硬件設(shè)計(jì)簡(jiǎn)談

評(píng)論