• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 硬件描述語言Verilog HDL設(shè)計(jì)進(jìn)階之:Verilog HDL高級語法結(jié)構(gòu)--函數(shù)

    硬件描述語言Verilog HDL設(shè)計(jì)進(jìn)階之:Verilog HDL高級語法結(jié)構(gòu)--函數(shù)

    作者: 時間:2017-06-05 來源:網(wǎng)絡(luò) 收藏

    4.3 Verilog HDL高級語法結(jié)構(gòu)—

    本文引用地址:http://www.czjhyjcfj.com/article/201706/348832.htm


    的目的是返回一個用于表達(dá)式的值。


    1.定義語法

    返回值的類型或范圍> (函數(shù)名);
    端口說明語句>
    變量類型說明語句> begin
    語句>
    ...
    end
    end

    請注意返回值的類型或范圍>這一項(xiàng)是可選項(xiàng),如缺省則返回值為一位寄存器類型數(shù)據(jù)。下面用例子說明:

    function [7:0] getbyte;
    input [15:0] address;
    begin
    說明語句> //從地址字中提取低字節(jié)的程序
    getbyte = result_expression; //把結(jié)果賦予函數(shù)的返回字節(jié)
    end
    endfunction


    2.函數(shù)返回值

    函數(shù)的定義蘊(yùn)含聲明了與函數(shù)同名的、函數(shù)內(nèi)部的寄存器。如在函數(shù)的聲明語句中返回值的類型或范圍>為缺省,則這個寄存器是一位的;否則是與函數(shù)定義中返回值的類型或范圍>一致的寄存器。
    函數(shù)的定義把函數(shù)返回值所賦值寄存器的名稱初始化為與函數(shù)同名的內(nèi)部變量。上面的例子說明了這個概念:getbyte被賦予的值就是函數(shù)的返回值。


    3.函數(shù)調(diào)用
    函數(shù)的調(diào)用是通過將函數(shù)作為表達(dá)式中的操作數(shù)來實(shí)現(xiàn)的,其調(diào)用格式如下:

    函數(shù)名> (表達(dá)式>,表達(dá)式>>*)

    其中函數(shù)名作為確認(rèn)符。下面的例子中通過對兩次調(diào)用函數(shù)getbyte的結(jié)果值進(jìn)行位拼接運(yùn)算來生成一個字。

    word = control? {getbyte(msbyte),getbyte(lsbyte)} : 0;


    4.函數(shù)使用規(guī)則

    與任務(wù)相比函數(shù)的使用有較多的約束,下面給出的是函數(shù)的使用規(guī)則。
    • 函數(shù)的定義不能包含有任何的時間控制語句,即任何用#、@、或wait來標(biāo)識的語句。
    • 函數(shù)不能啟動任務(wù)。
    • 定義函數(shù)時至少要有一個輸入?yún)⒘俊?br />• 在函數(shù)的定義中必須有一條賦值語句給函數(shù)中的一個內(nèi)部變量賦以函數(shù)的結(jié)果值,該內(nèi)部變量具有和函數(shù)名相同的名字。


    5.實(shí)例詳解


    下面的例子中定義了一個可進(jìn)行階乘運(yùn)算的名為factorial的函數(shù),該函數(shù)返回一個32位的寄存器類型的值,該函數(shù)可后向調(diào)用自身,并且打印出部分結(jié)果值。

    module tryfact; //模塊開始
    //函數(shù)的定義-------------------------------
    function[31:0]factorial; //函數(shù)開始
    input[3:0]operand; //函數(shù)的入口
    reg[3:0]index; //函數(shù)的寄存器
    begin
    factorial = operand? 1 : 0; //若operand全為0,則為0
    for(index=2;index=operand;index=index+1) //循環(huán)語句
    factorial = index * factorial; //乘法器
    end
    endfunction //函數(shù)結(jié)束
    //函數(shù)的測試-------------------------------------
    reg[31:0]result;
    reg[3:0]n;
    initial begin
    result=1;
    for(n=2;n=9;n=n+1) begin //循環(huán)語句(調(diào)用函數(shù))
    $display(Partial result n= %d result= %d, n, result); //每次函數(shù)的執(zhí)行結(jié)果
    result = n * factorial(n)/((n*2)+1); //調(diào)用函數(shù)
    end
    $display(Finalresult=%d,result); //打印結(jié)果
    end
    endmodule //模塊結(jié)束



    關(guān)鍵詞: VerilogHDL 函數(shù) function

    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 凯里市| 奎屯市| 罗田县| 襄城县| 彭山县| 湘阴县| 阜宁县| 广昌县| 鄂托克前旗| 镇雄县| 吴堡县| 扶风县| 天祝| 昭通市| 桦南县| 淮安市| 泗阳县| 壤塘县| 拉萨市| 通榆县| 云南省| 大冶市| 司法| 曲阳县| 吐鲁番市| 太仓市| 扎兰屯市| 民乐县| 铜川市| 乌苏市| 武平县| 白银市| 治多县| 宕昌县| 吉林省| 临澧县| 赣榆县| 南雄市| 安溪县| 潜山县| 牙克石市|