在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在Verilog中利用函數將重復性的行為級設計進行提取

冬至子 ? 來源:數字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-06-02 11:39 ? 次閱讀

Verilog 中,可以利用任務(關鍵字為 task)或函數(關鍵字為 function),將重復性的行為級設計進行提取,并在多個地方調用,來避免重復代碼的多次編寫,使代碼更加的簡潔、易懂。

函數

函數只能在模塊中定義,位置任意,并在模塊的任何地方引用,作用范圍也局限于此模塊。函數主要有以下幾個特點:

1)不含有任何延遲、時序或時序控制邏輯

2)至少有一個輸入變量

3)只有一個返回值,且沒有輸出

4)不含有非阻塞賦值語句

5)函數可以調用其他函數,但是不能調用任務

Verilog 函數聲明格式如下:

function [range-1:0]     function_id ;
input_declaration ;
 other_declaration ;
procedural_statement ;
endfunction

函數在聲明時,會隱式的聲明一個寬度為 range、 名字為 function_id 的寄存器變量,函數的返回值通過這個變量進行傳遞。當該寄存器變量沒有指定位寬時,默認位寬為 1。

函數通過指明函數名與輸入變量進行調用。函數結束時,返回值被傳遞到調用處。

函數調用格式如下:

function_id(input1, input2, …);

下面用函數實現一個數據大小端轉換的功能。

當輸入為 4’b0011 時,輸出為 4’b1100。例如:

module endian_rvs
    #(parameter N = 4)
       (
           input             en,     //enable control
           input [N-1:0]     a ,
           output [N-1:0]    b
    );

       reg [N-1:0]          b_temp ;
       always @(*) begin
        if (en) begin
               b_temp =  data_rvs(a);
           end
           else begin
               b_temp = 0 ;
           end
    end
       assign b = b_temp ;

    //function entity
       function [N-1:0]     data_rvs ;
           input     [N-1:0] data_in ;
           parameter         MASK = 32'h3 ; 
           integer           k ;
           begin
               for(k=0; k< N; k=k+1) begin
                   data_rvs[N-k-1]  = data_in[k] ;  
               end
           end
    endfunction

endmodule

函數里的參數也可以改寫,例如:

defparam data_rvs.MASK = 32'd7 ;

但是仿真時發現,此種寫法編譯可以通過,仿真結果中,函數里的參數 MASK 實際并沒有改寫成功,仍然為 32’h3。這可能和編譯器有關,有興趣的學者可以用其他 Verilog 編譯器進行下實驗。

函數在聲明時,也可以在函數名后面加一個括號,將 input 聲明包起來。

例如上述大小端聲明函數可以表示為:

function [N-1:0]     data_rvs (
input     [N-1:0] data_in 
    ......
       );

常數函數

常數函數是指在仿真開始之前,在編譯期間就計算出結果為常數的函數。常數函數不允許訪問全局變量或者調用系統函數,但是可以調用另一個常數函數。

這種函數能夠用來引用復雜的值,因此可用來代替常量。

例如下面一個常量函數,可以來計算模塊中地址總線的寬度:

parameter    MEM_DEPTH = 256 ;
reg  [logb2(MEM_DEPTH)-1: 0] addr ; //可得addr的寬度為8bit

    function integer     logb2;
    input integer     depth ;
       //2569bit,我們最終數據應該是8,所以需depth=2時提前停止循環
    for(logb2=0; depth >1; logb2=logb2+1) begin
        depth = depth > > 1 ;
    end
endfunction

automatic函數

在 Verilog 中,一般函數的局部變量是靜態的,即函數的每次調用,函數的局部變量都會使用同一個存儲空間。若某個函數在兩個不同的地方同時并發的調用,那么兩個函數調用行為同時對同一塊地址進行操作,會導致不確定的函數結果。

Verilog 用關鍵字 automatic 來對函數進行說明,此類函數在調用時是可以自動分配新的內存空間的,也可以理解為是可遞歸的。因此,automatic 函數中聲明的局部變量不能通過層次命名進行訪問,但是 automatic 函數本身可以通過層次名進行調用。

下面用 automatic 函數,實現階乘計算:

wire [31:0]          results3 = factorial(4);
function automatic   integer         factorial ;
    input integer     data ;
    integer           i ;
    begin
        factorial = (data >=2)? data * factorial(data-1) : 1 ;
    end
endfunction // factorial

下面是加關鍵字 automatic 和不加關鍵字 automatic 的仿真結果。

由圖可知,信號 results3 得到了我們想要的結果,即 4 的階乘。

而信號 results_noauto 值為 1,不是可預知的正常結果,這里不再做無用分析。

圖片

數碼管譯碼

上述中涉及的相關函數知識似乎并沒有體現出函數的優越性。下面設計一個 4 位 10 進制的數碼管譯碼器,來說明函數可以簡化代碼的優點。

◆數碼管控制示意圖如下。

每位數碼顯示端有 8 個光亮控制端(如圖中 a-g 所示),可以用來控制顯示數字 0-9 。

而數碼管有 4 個片選(如圖中 1-4),用來控制此時哪一位數碼顯示端應該選通,即應該發光。倘若在很短的時間內,依次對 4 個數碼顯示端進行片選發光,同時在不同片選下給予不同的光亮控制(各對應 4 位十進制數字),那么在肉眼不能分辨的情況下,就達到了同時顯示 4 位十進制數字的效果。

圖片

◆下面,我們用信號 abcdefg 來控制光亮控制端,用信號 csn 來控制片選,4 位 10 進制的數字個十百千位分別用 4 個 4bit 信號 single_digit, ten_digit, hundred_digit, kilo_digit 來表示,則一個數碼管的顯示設計可以描述如下:

module digital_tube
     (
      input             clk ,
      input             rstn ,
      input             en ,

      input [3:0]       single_digit ,
      input [3:0]       ten_digit ,
      input [3:0]       hundred_digit ,
      input [3:0]       kilo_digit ,

      output reg [3:0]  csn , //chip select, low-available
      output reg [6:0]  abcdefg        //light control
      );

    reg [1:0]            scan_r ;  //scan_ctrl
    always @ (posedge clk or negedge rstn) begin
        if(!rstn)begin
            csn            <= 4'b1111;
            abcdefg        <= 'd0;
            scan_r         <= 3'd0;
        end
        else if (en) begin
            case(scan_r)
            2'd0:begin
                scan_r    <= 3'd1;
                csn       <= 4'b0111;     //select single digit
                abcdefg   <= dt_translate(single_digit);
            end
            2'd1:begin
                scan_r    <= 3'd2;
                csn       <= 4'b1011;     //select ten digit
                abcdefg   <= dt_translate(ten_digit);
            end
            2'd2:begin
                scan_r    <= 3'd3;
                csn       <= 4'b1101;     //select hundred digit
                abcdefg   <= dt_translate(hundred_digit);
            end
            2'd3:begin
                scan_r    <= 3'd0;
                csn       <= 4'b1110;     //select kilo digit
                abcdefg   <= dt_translate(kilo_digit);
            end
            endcase
        end
    end

    /*------------ translate function -------*/
    function [6:0] dt_translate;
        input [3:0]   data;
        begin
        case(data)
            4'd0: dt_translate = 7'b1111110;     //number 0 - > 0x7e
            4'd1: dt_translate = 7'b0110000;     //number 1 - > 0x30
            4'd2: dt_translate = 7'b1101101;     //number 2 - > 0x6d
            4'd3: dt_translate = 7'b1111001;     //number 3 - > 0x79
            4'd4: dt_translate = 7'b0110011;     //number 4 - > 0x33
            4'd5: dt_translate = 7'b1011011;     //number 5 - > 0x5b
            4'd6: dt_translate = 7'b1011111;     //number 6 - > 0x5f
            4'd7: dt_translate = 7'b1110000;     //number 7 - > 0x70
            4'd8: dt_translate = 7'b1111111;     //number 8 - > 0x7f
            4'd9: dt_translate = 7'b1111011;     //number 9 - > 0x7b
        endcase
        end
    endfunction

endmodule

◆仿真結果如下。

由圖可知,片選、譯碼等信號,均符合設計。實際中,4 位數字應當在一定的時間內保持不變,而片選信號不停的循環掃描,數碼管才能給肉眼呈現一種靜態顯示的效果。

圖片

◆小結

如果譯碼器設計沒有使用函數 dt_translate,則在每個 case 選項里對信號 abcdefg 進行賦值時,還需要對 single_digit,ten_digit, hundred_digit, kilo_digit 進行判斷。這些判斷語句又會重復 4 次。雖然最后綜合出的實際硬件電路可能是一樣的,但顯然使用函數后的代碼更加的簡潔、易讀。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5357

    瀏覽量

    120586
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110143
  • 數碼管
    +關注

    關注

    32

    文章

    1882

    瀏覽量

    91208
  • 譯碼器
    +關注

    關注

    4

    文章

    311

    瀏覽量

    50369
收藏 人收藏

    評論

    相關推薦

    測量系統分析:測量系統的的重復性和重現性

    測量系統分析:測量系統的的重復性和重現性
    發表于 08-16 13:44

    大規模中文搜索日志查詢重復性分析

    分析大規模中文搜索日志的查詢重復性,通過對查詢重復率和用戶個體查詢重復率等數據的統計發現:查詢串的查詢頻率、文檔的點擊頻率及用戶查詢頻率均符合Zipf分布,查詢重
    發表于 04-11 09:25 ?8次下載

    測量系統的的重復性和重現性

    測量系統的的重復性和重現性:MSA的相當重要的一部分是研究測量系統的重復性(Repeatability)和重現性(Reproducibility).
    發表于 08-16 13:14 ?17次下載

    相控陣探頭的重復性與可靠性

    相控陣探頭的重復性與可靠性 Over the past few years, new procedures involving phased array technology were
    發表于 03-20 10:45 ?24次下載

    并行傳感器如何提高傾斜測量的精度和可重復性

    并行傳感器如何提高傾斜測量的精度和可重復性?具體的跟隨小編通過本文來詳細的了解下。
    的頭像 發表于 07-11 13:27 ?3385次閱讀

    15年內人工智能將取代50%的重復性崗位

    創新工場CEO李開復近日表示,15年內,人工智能和自動化具備取代40-50%崗位的技術能力,主要集中重復性勞動、有固定臺本和對白內容的各種互動、不需要與人進行大量面對面交流的工作等
    的頭像 發表于 09-11 11:02 ?3523次閱讀

    計量標準重復性的測量方法

    計量標準的重復性規定用測量結果的分散性來定量地表示,即用單次測量結果yi的實驗標準差s(yi)來表示。當測量結果由單次測量得到時,它直接就是由重復性引入的不確定度分量。
    的頭像 發表于 11-12 14:19 ?2w次閱讀

    流量計重復性差的解決方法

    實際使用過程,流量計常會出現重復性差的問題,困惑了不少現場工程師。經過現場觀察和總結,發現流量計和體積管內有氣體,系統的壓力、溫度、流量不穩定,四通閥轉換密封不合適,計量球的圓度和尺寸等情況都會
    發表于 01-05 11:37 ?1575次閱讀

    計量標準的重復性考核要求

    計量標準的重復性規定用測量結果的分散性來定量地表示,即用單次測量結果yi的實驗標準差s(yi)來表示。當測量結果由單次測量得到時,它直接就是由重復性引入的不確定度分量。當
    的頭像 發表于 03-18 10:21 ?3386次閱讀

    Verilog函數實現一個數據大小端轉換的功能

    Verilog ,可以利用任務(關鍵字為 task)或函數(關鍵字為 function),
    的頭像 發表于 06-01 16:31 ?1826次閱讀
    用<b class='flag-5'>Verilog</b><b class='flag-5'>函數</b>實現一個數據大小端轉換的功能

    計量標準的重復性考核要求

    進行重復性測量時,相同的測量程序,相同的觀測者,使用相同的儀器,以及相同地點等要求一般均能得到滿足而不會有任何問題。關鍵是如何理解“相同的條件下”以及“
    的頭像 發表于 07-19 15:52 ?2398次閱讀
    計量標準的<b class='flag-5'>重復性</b>考核要求

    PySnooper:替代print的重復性工作

    麻煩。 現在,有了PySnooper,您并不需要配置那么復雜的Debug工具,就能夠完成對整個代碼的分析。它能告訴您哪些代碼正在運行,以及局部變量的值是什么。 其實,PySnooper 就是替代了一行一行print的重復性工作,給你的代碼一個pysnooper裝飾器,它能自動識別到語句和變量
    的頭像 發表于 10-30 10:41 ?418次閱讀

    verilog function函數的用法

    Verilog 中被廣泛用于對電路進行模塊化設計,以簡化和組織代碼。 本文詳細介紹 Verilog 函數的用法,并探討
    的頭像 發表于 02-22 15:49 ?5803次閱讀

    立儀科技光譜共焦應用之金屬隔膜靜態重復性測量

    01|檢測需求:金屬隔膜重復性測量 ? 立儀科技光譜共焦應用之金屬隔膜靜態重復性測量 02|檢測方式 為了保證精度,首先先用千分尺進行測量,得出相應的厚度數據,選擇合適的側頭,根據結
    的頭像 發表于 08-09 14:33 ?275次閱讀
    立儀科技光譜共焦應用之金屬隔膜靜態<b class='flag-5'>重復性</b>測量

    MFC測量重復性不高怎么回事?

    真實案例: 某客戶使用我們的MFC330時,發現重復性不佳;他多次測試,發現有時候重復性很好控制氣流穩定,但有時候無法達標,,覺得這個現象非常奇怪,于是聯系了我們的技術人員進行排查。 故障排查
    的頭像 發表于 10-23 10:40 ?179次閱讀
    MFC測量<b class='flag-5'>重復性</b>不高怎么回事?
    主站蜘蛛池模板: 97人人射| 午夜视频免费| 色视频大全| 四虎影院台湾辣妹| 日韩欧美亚洲综合一区二区| 色婷婷欧美| 明日花在线观看| 黄色大毛片| 亚洲综合激情另类专区| 6080yy午夜不卡一二三区| 一区二区免费| 国产尤物在线视频| 五月婷婷影院| 欧美激情亚洲色图| 国产美女主播在线观看| 亚洲精品午夜久久aaa级久久久| 网站大全黄免费| 国内精品久久久久影院免费| 六月丁香激情网| 高h道具触手play肉男男| 天堂网在线资源www最新版| 日本不卡高清免费v日本| 久久国产伦三级理电影| 夜夜se| 久久婷五月综合| 91在线免费观看网站| 伊人网狠狠干| 青娱乐啪啪| www.久久综合| 美女视频久久| 亚洲区一二三四区2021| 亚州人成网在线播放| 免费一级欧美片在线观看| 在线视频播放大全| 国产高清免费在线观看| 九九re热| 日本成片免费高清| 一级一片一a一片| 五月sese| 香焦视频在线观看黄| 黄视频在线观看免费|