色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用Verilog函數(shù)實(shí)現(xiàn)一個(gè)數(shù)據(jù)大小端轉(zhuǎn)換的功能

冬至子 ? 來源:數(shù)字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-06-01 16:31 ? 次閱讀

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

函數(shù)

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

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

2)至少有一個(gè)輸入變量

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

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

5)函數(shù)可以調(diào)用其他函數(shù),但是不能調(diào)用任務(wù)

Verilog 函數(shù)聲明格式如下:

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

函數(shù)在聲明時(shí),會(huì)隱式的聲明一個(gè)寬度為 range、 名字為 function_id 的寄存器變量,函數(shù)的返回值通過這個(gè)變量進(jìn)行傳遞。當(dāng)該寄存器變量沒有指定位寬時(shí),默認(rèn)位寬為 1。

函數(shù)通過指明函數(shù)名與輸入變量進(jìn)行調(diào)用。函數(shù)結(jié)束時(shí),返回值被傳遞到調(diào)用處。

函數(shù)調(diào)用格式如下:

function_id(input1, input2, …);

下面用函數(shù)實(shí)現(xiàn)一個(gè)數(shù)據(jù)大小端轉(zhuǎn)換的功能。

當(dāng)輸入為 4’b0011 時(shí),輸出為 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

函數(shù)里的參數(shù)也可以改寫,例如:

defparam data_rvs.MASK = 32'd7 ;

但是仿真時(shí)發(fā)現(xiàn),此種寫法編譯可以通過,仿真結(jié)果中,函數(shù)里的參數(shù) MASK 實(shí)際并沒有改寫成功,仍然為 32’h3。這可能和編譯器有關(guān),有興趣的學(xué)者可以用其他 Verilog 編譯器進(jìn)行下實(shí)驗(yàn)。

函數(shù)在聲明時(shí),也可以在函數(shù)名后面加一個(gè)括號(hào),將 input 聲明包起來。

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

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

常數(shù)函數(shù)

常數(shù)函數(shù)是指在仿真開始之前,在編譯期間就計(jì)算出結(jié)果為常數(shù)的函數(shù)。常數(shù)函數(shù)不允許訪問全局變量或者調(diào)用系統(tǒng)函數(shù),但是可以調(diào)用另一個(gè)常數(shù)函數(shù)。

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

例如下面一個(gè)常量函數(shù),可以來計(jì)算模塊中地址總線的寬度:

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

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

automatic函數(shù)

在 Verilog 中,一般函數(shù)的局部變量是靜態(tài)的,即函數(shù)的每次調(diào)用,函數(shù)的局部變量都會(huì)使用同一個(gè)存儲(chǔ)空間。若某個(gè)函數(shù)在兩個(gè)不同的地方同時(shí)并發(fā)的調(diào)用,那么兩個(gè)函數(shù)調(diào)用行為同時(shí)對同一塊地址進(jìn)行操作,會(huì)導(dǎo)致不確定的函數(shù)結(jié)果。

Verilog 用關(guān)鍵字 automatic 來對函數(shù)進(jìn)行說明,此類函數(shù)在調(diào)用時(shí)是可以自動(dòng)分配新的內(nèi)存空間的,也可以理解為是可遞歸的。因此,automatic 函數(shù)中聲明的局部變量不能通過層次命名進(jìn)行訪問,但是 automatic 函數(shù)本身可以通過層次名進(jìn)行調(diào)用。

下面用 automatic 函數(shù),實(shí)現(xiàn)階乘計(jì)算:

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

下面是加關(guān)鍵字 automatic 和不加關(guān)鍵字 automatic 的仿真結(jié)果。

由圖可知,信號(hào) results3 得到了我們想要的結(jié)果,即 4 的階乘。

而信號(hào) results_noauto 值為 1,不是可預(yù)知的正常結(jié)果,這里不再做無用分析。

圖片

數(shù)碼管譯碼

上述中涉及的相關(guān)函數(shù)知識(shí)似乎并沒有體現(xiàn)出函數(shù)的優(yōu)越性。下面設(shè)計(jì)一個(gè) 4 位 10 進(jìn)制的數(shù)碼管譯碼器,來說明函數(shù)可以簡化代碼的優(yōu)點(diǎn)。

◆一個(gè)數(shù)碼管的實(shí)物圖,可以用來顯示 4 位十進(jìn)制的數(shù)字。 在比賽計(jì)分、時(shí)間計(jì)時(shí)等方面有著相當(dāng)廣泛的應(yīng)用。

◆數(shù)碼管控制示意圖如下。

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

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

圖片

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

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

◆仿真結(jié)果如下。

由圖可知,片選、譯碼等信號(hào),均符合設(shè)計(jì)。實(shí)際中,4 位數(shù)字應(yīng)當(dāng)在一定的時(shí)間內(nèi)保持不變,而片選信號(hào)不停的循環(huán)掃描,數(shù)碼管才能給肉眼呈現(xiàn)一種靜態(tài)顯示的效果。

圖片

◆小結(jié)

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120230
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110074
  • 數(shù)碼管
    +關(guān)注

    關(guān)注

    32

    文章

    1882

    瀏覽量

    91063
  • 譯碼器
    +關(guān)注

    關(guān)注

    4

    文章

    310

    瀏覽量

    50314
  • 時(shí)序控制器
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    11219
收藏 人收藏

    評論

    相關(guān)推薦

    C語言的函數(shù)如何返回多個(gè)數(shù)據(jù)

    C語言的函數(shù)如何返回多個(gè)數(shù)據(jù)?這個(gè)操作在寫代碼的時(shí)候還經(jīng)常遇到。
    發(fā)表于 07-25 10:53 ?956次閱讀

    verilog實(shí)現(xiàn)IIC。

    我想用verilog實(shí)現(xiàn)個(gè)控制AT24C08讀寫的IIC協(xié)議的狀態(tài)機(jī),現(xiàn)在出現(xiàn)了個(gè)很奇怪的問
    發(fā)表于 01-29 11:18

    verilog語言如何給個(gè)數(shù)組賦值呢,新手求助,感謝各位大佬!

    給定數(shù)據(jù),比如1024個(gè)8位數(shù)據(jù),需要在后續(xù)調(diào)用,因此希望定義個(gè)位寬為8,
    發(fā)表于 09-09 18:22

    個(gè)簡單的程序判斷系統(tǒng)的大小

    語言筆面試常見的考題,并做了詳細(xì)解答。文章目錄1、sizeof在什么階段執(zhí)行?它是函數(shù)還是啥?2、指針的指針3、什么是大小?寫個(gè)簡單的程
    發(fā)表于 12-15 08:38

    ARM自帶的大小轉(zhuǎn)換函數(shù)分別是什么?有何作用

    ARM自帶的大小轉(zhuǎn)換函數(shù):__REV(xxx)跟__REV16(XXX)第一個(gè)轉(zhuǎn)4byte類型,第二個(gè)
    發(fā)表于 05-18 11:55

    Verilog實(shí)現(xiàn)8255芯片功能

    Verilog實(shí)現(xiàn)8255芯片功能
    發(fā)表于 11-03 17:06 ?144次下載

    個(gè)數(shù)字輸出和個(gè)數(shù)字輸入來讀取溫度

    個(gè)數(shù)字輸出和個(gè)數(shù)字輸入來讀取溫度
    發(fā)表于 06-08 20:59 ?464次閱讀
    <b class='flag-5'>用</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)數(shù)</b>字輸出和<b class='flag-5'>一</b><b class='flag-5'>個(gè)數(shù)</b>字輸入來讀取溫度

    verilog實(shí)現(xiàn)定時(shí)器函數(shù)

    使用Verilog描述硬件的基本設(shè)計(jì)單元是模塊(module)。構(gòu)建復(fù)雜的電子電路,主要是通過模塊的相互連接調(diào)用來實(shí)現(xiàn)的。模塊被包含在關(guān)鍵字module、endmodule之內(nèi)。實(shí)際的電路元件。Verilog中的模塊類似C語言中
    發(fā)表于 12-08 17:20 ?1w次閱讀

    如何判斷大小大小如何使用代碼實(shí)現(xiàn)

    無論筆試還是面試都有定幾率問怎么判斷大小,那么你就很自豪的回答,大端就是數(shù)據(jù)高字節(jié)放在低地址上,小就是
    的頭像 發(fā)表于 08-04 10:41 ?5852次閱讀
    如何判斷<b class='flag-5'>大小</b><b class='flag-5'>端</b>?<b class='flag-5'>大小</b><b class='flag-5'>端</b>如何使用代碼<b class='flag-5'>實(shí)現(xiàn)</b>?

    這是個(gè)verilog寫的DC濾波器.

    這是個(gè)verilog寫的DC濾波器.(通訊電源技術(shù)的組成)-這是個(gè)
    發(fā)表于 09-16 11:41 ?10次下載
    這是<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>用</b><b class='flag-5'>verilog</b>寫的DC濾波器.

    一次數(shù)據(jù)強(qiáng)制轉(zhuǎn)換引起的思考(Mcu大小模式)

    目錄、問題:二、大小:三、結(jié)論:四、解決方案五、常見mcu的大小、問題:某次,在對某mc
    發(fā)表于 11-16 10:21 ?0次下載
    <b class='flag-5'>一次數(shù)據(jù)</b>強(qiáng)制<b class='flag-5'>轉(zhuǎn)換</b>引起的思考(Mcu<b class='flag-5'>大小</b><b class='flag-5'>端</b>模式)

    大小數(shù)據(jù)介紹

    關(guān)于大小 大小也可以理解為字節(jié)順序,或者序、尾序,也就是你們看到的大端序(Big-Endian)、小
    的頭像 發(fā)表于 09-29 18:35 ?1813次閱讀
    <b class='flag-5'>大小</b><b class='flag-5'>端</b><b class='flag-5'>數(shù)據(jù)</b>介紹

    單片機(jī)大小轉(zhuǎn)換的幾點(diǎn)小技巧

    單片機(jī)大小轉(zhuǎn)換的幾點(diǎn)小技巧
    的頭像 發(fā)表于 09-18 10:58 ?1100次閱讀
    單片機(jī)<b class='flag-5'>大小</b><b class='flag-5'>端</b><b class='flag-5'>轉(zhuǎn)換</b>的幾點(diǎn)小技巧

    python如何輸入多個(gè)數(shù)據(jù)

    用戶從鍵盤輸入數(shù)據(jù),并返回一個(gè)字符串。我們可以使用split()函數(shù)分割字符串,將其轉(zhuǎn)換為多個(gè)數(shù)據(jù)。 data = input ( "請輸入
    的頭像 發(fā)表于 11-23 15:29 ?5749次閱讀

    verilog function函數(shù)的用法

    Verilog種硬件描述語言 (HDL),主要用于描述數(shù)字電子電路的行為和結(jié)構(gòu)。在 Verilog 中,函數(shù) (Function) 是
    的頭像 發(fā)表于 02-22 15:49 ?5528次閱讀
    主站蜘蛛池模板: 国产露脸无码A区久久| 桃隐社区最新最快地址| 欧美精品成人a多人在线观看| 亚洲国产精品无码中文字满| 6080yy奇领电影在线看| 狠狠干女人| 亚洲AV午夜精品麻豆AV| 国产爱豆剧果冻传媒在线| 人人看人人看| 北岛玲手机在线观看视频观看 | 国产精品嫩草影视在线观看| 热久久免费频精品99热| av影音先锋影院男人站| 美女脱了内裤张开腿让男人桶到爽 | jzz大全18| 户外插BBBBB| 亚洲国产欧美日韩在线一区| 国产精品久久久久久熟妇吹潮软件| 色WWW永久免费视频首页| 粗壮挺进邻居人妻无码| 日韩一级精品久久久久| 成人在免费观看视频国产 | 亚洲色大成网站WWW永久麻豆| 国产欧美二区综合| 亚洲 视频 在线 国产 精品 | 男女作爱在线播放免费网页版观看| 5580免费午夜福利院| 美女白虎穴| 99久久人妻无码精品系列性欧美| 免费看成人毛片| free乌克兰性xxxxhd| 琪琪色在线播放| 成人免费观看www视频| 色婷婷综合久久久久中文一区二区 | 精品伊人久久| 伊人影院综合网| 毛片在线全部免费观看| 99九九免费热在线精品| 日本边添边摸边做边爱边| 成熟YIN荡美妞A片视频麻豆| 手机在线观看无码日韩视频|