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

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

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

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

Verilog設(shè)計中如何匹配變量的位寬

C29F_xilinx_inc ? 來源:賽靈思 ? 作者:賽靈思 ? 2022-02-16 16:21 ? 次閱讀

1、位寬太小

FPGA設(shè)計中,我們經(jīng)常需要用寄存器來寄存某些“數(shù)量類”的變量,比如FIFO的深度啦、或者計數(shù)器的最大值啦;又或者輸入輸出信號也需要將位寬用parameter參數(shù)化以便更好的調(diào)用等。

舉個簡單的小例子:系統(tǒng)頻率100M(周期10ns),假設(shè)需要要求設(shè)計一個計時器計時100ns,那么需要計數(shù)次數(shù)為:100ns/10ns - 1 = 9,9這個數(shù)需要用多大位寬的寄存器表示呢?很簡單,以2為底取對數(shù)就行,答案是最少4位寬。為了方便地復(fù)用這個模塊,我們把計時時間參數(shù)化并放到模塊外,如下:

module counter #(
parameter TIME = 'd10 //計時時間,單位10ns
)(
input clk_100M ,
input rst
);
reg [3:0] cnt; //計數(shù)器

//計時器
always@(posedge clk_100M)begin
if(rst)
cnt else if(cnt == TIME - 1)
cnt else
cnt end

endmodule

假設(shè)我們下次設(shè)計需要一個計時器的話,直接調(diào)用上面的counter模塊并把TIME這個參數(shù)改成自己需要的參數(shù)就可以,這樣做理論上是可以的,只是會有一個致命的隱患。不妨再假設(shè):我現(xiàn)在調(diào)用了counter模塊,并將TIME設(shè)置為20,以實現(xiàn)計時200ns的功能。當(dāng)TIME = 20這個參數(shù)傳遞到被例化模塊后,可以發(fā)現(xiàn)由于cnt寄存器的位寬僅為4位,其能表示的最大值為4'b1111(即十進制下的數(shù)字15),每次其到達15后就溢出為0重新開始了,也就是說這個200ns的計時器實際上根本就計數(shù)不到200ns。

這個隱患發(fā)生的原因就是在設(shè)計寄存器cnt時的位寬只有4位,無法滿足“大量時間的計時任務(wù)”。

2、自己寫一個Function

現(xiàn)在來想一下如何解決上述的位寬不匹配的問題。將寄存器的位寬設(shè)計為一個較大的數(shù)值(如固定為32bit)不失為一個不錯的方法,但是如果將這條規(guī)則適用到每一個寄存器,則勢必造成大量的資源浪費(你資源多你隨便玩)。而且該方法指標不治本,我們需要做的是,這個寄存器應(yīng)該有多大就設(shè)計多大的位寬(有多大的腳就穿多大的鞋,鞋子太大一定能穿,但你腳不一定舒服)。

前面說過寄存器的位寬的計算方法:以2為底取對數(shù)。所以我們只需要設(shè)計一個Function(可綜合),來實現(xiàn)此項功能即可。剛好在Xilinx的許多源碼都出現(xiàn)了這個簡單的Function,我們直接拿過來用就是的:

// function 實現(xiàn)
function integer clogb2 (input integer bit_depth);
begin
for(clogb2=0; bit_depth>0; clogb2=clogb2+1)
bit_depth = bit_depth >> 1;
end
endfunction

// 使用案例
localparam integer C_TRANSACTIONS_NUM = clogb2(C_M_AXI_BURST_LEN-1);
reg [C_TRANSACTIONS_NUM : 0] write_index;
reg [C_TRANSACTIONS_NUM : 0] read_index;

上面的代碼就是定義了一個求位寬的function,用其求得某類寄存器的位寬,然后再對寄存器賦值時就直接使用求得的位寬來賦值,這樣復(fù)用起來就比較方便了。

我們將這個代碼放到上面的計數(shù)器模塊中后,不管需要計數(shù)多大時間,都能計算出相匹配的寄存器位寬了。

3、無法在輸入輸出端口使用

自己寫Function實現(xiàn)對2取對數(shù)的功能也有一定的局限性:無法對輸入輸出端口信號使用該Function。Function是定義在模塊內(nèi)部,所以若輸入輸出端口也需要根據(jù)輸入的parameter參數(shù)來以2為底取對數(shù)的話此種方法就無能為力了。比如:設(shè)計一個同步FIFO,輸出信號fifo_cnt(計數(shù)器)是對寫入FIFO的數(shù)據(jù)進行計數(shù)的寄存器,其最大值即為FIFO的深度DATA_DEPTH ,所以fifo_cnt的位寬就需要在定義模塊輸入輸出端口時確定,顯然這無法使用自己構(gòu)造的 cblogb2 Function。那該當(dāng)如何?
//計數(shù)器法實現(xiàn)同步FIFO

module sync_fifo_cnt
#(
parameter DATA_WIDTH = 'd8 , //FIFO位寬
parameter DATA_DEPTH = 'd16 //FIFO深度
)
(
input clk , //系統(tǒng)時鐘
input rst_n , //低電平有效的復(fù)位信號
input [DATA_WIDTH-1:0] data_in , //寫入的數(shù)據(jù)
input rd_en , //讀使能信號,高電平有效
input wr_en , //寫使能信號,高電平有效

output reg [DATA_WIDTH-1:0] data_out, //輸出的數(shù)據(jù)
output empty , //空標志,高電平表示當(dāng)前FIFO已被寫滿
output full , //滿標志,高電平表示當(dāng)前FIFO已被讀空
output reg [$clog2(DATA_DEPTH) : 0] fifo_cnt //$clog2是以2為底取對數(shù)
);

//省略部分代碼

endmodule

4、$clog2系統(tǒng)函數(shù)

其實辦法也有,在上面的代碼中也展示出來了,就是使用 $clog2 這個Verilog的系統(tǒng)函數(shù)。$clog2是Verilog--2005標準新增的一個系統(tǒng)函數(shù),功能就是對輸入整數(shù)實現(xiàn)以2為底取對數(shù),其結(jié)果向上取整(如5.5取6)。有一點需要說明的是,目前Vivado2017以上的版本都是支持這個系統(tǒng)函數(shù)的(Quartus II不清楚 )。但是百度搜索這條結(jié)果的時候有兩條結(jié)論是錯誤的:

1、Vivado不支持$clog2系統(tǒng)函數(shù)

2、$clog2系統(tǒng)函數(shù)在Vivado實現(xiàn)的是以e為底取對數(shù),而不是2

接下來寫個簡單的模塊驗證下Vivado對$clog2系統(tǒng)函數(shù)的支持如何

`timescale 1ns / 1ps

module clog2_test#(
parameter integer num = 325
)
(
input clk,
input rst,
output reg [$clog2(num) - 1:0] result
);

always @(posedge clk)begin
if(rst)
result else
result end

endmodule

我們直接看reg result的位寬綜合出來到底是多少。如果以e為底向上取整,則位寬應(yīng)是6;如果以2為底向上取整,則位寬應(yīng)是9。Vivado綜合的原理圖局部如下:

Verilog設(shè)計中如何匹配變量的位寬

可以看到最后編譯出的結(jié)果是9位的,也就說明Vivado是支持這個系統(tǒng)函數(shù)的(版本:2019.2)。

其他變量的位寬設(shè)計同理。

審核編輯:湯梓紅

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

    關(guān)注

    31

    文章

    5423

    瀏覽量

    123418
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2284

    瀏覽量

    96051
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1867

    瀏覽量

    32874
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    Ansible Playbook變量使用技巧

    在inventory定義的連接變量(比如ansible_ssh_user);優(yōu)先級第二。
    的頭像 發(fā)表于 04-15 10:26 ?217次閱讀

    Verilogsigned和$signed()的用法

    嗎?其實不是的,因為有符號數(shù)和無符號數(shù)據(jù)的加法強結(jié)果和乘法器結(jié)構(gòu)是一樣的,signed的真正作用是決定如何對操作數(shù)擴的問題。 2、verilog的加法和乘法操作前,會先對操作數(shù)據(jù)擴
    的頭像 發(fā)表于 02-17 17:47 ?532次閱讀
    <b class='flag-5'>Verilog</b><b class='flag-5'>中</b>signed和$signed()的用法

    Verilog例化說明

    的例化(或說是調(diào)用)。在一個FPGA項目工程,其輸入、輸出端口命名通常在設(shè)計前期就已確定下來,但會存在一些中間變量,一個工程可能會讓不同的工程師在不同的時間段內(nèi)共同完成,不同的人對于這些變量的命名會有所不同,故例化很有必要。
    的頭像 發(fā)表于 12-17 11:29 ?1940次閱讀
    <b class='flag-5'>Verilog</b>例化說明

    Verilog 電路仿真常見問題 Verilog 在芯片設(shè)計的應(yīng)用

    。然而,在實際應(yīng)用,設(shè)計師可能會遇到各種問題,這些問題可能會影響仿真的準確性和設(shè)計的可靠性。 Verilog電路仿真常見問題 仿真環(huán)境的搭建問題 仿真環(huán)境的搭建是進行Verilog仿真的第一步。設(shè)計師需要選擇合適的仿真工具,并
    的頭像 發(fā)表于 12-17 09:53 ?1086次閱讀

    Verilog 與 ASIC 設(shè)計的關(guān)系 Verilog 代碼優(yōu)化技巧

    Verilog與ASIC設(shè)計的關(guān)系 Verilog作為一種硬件描述語言(HDL),在ASIC設(shè)計扮演著至關(guān)重要的角色。ASIC(Application Specific Integrated
    的頭像 發(fā)表于 12-17 09:52 ?920次閱讀

    Verilog 測試平臺設(shè)計方法 Verilog FPGA開發(fā)指南

    Verilog測試平臺設(shè)計方法是Verilog FPGA開發(fā)的重要環(huán)節(jié),它用于驗證Verilog設(shè)計的正確性和性能。以下是一個詳細的Verilog
    的頭像 發(fā)表于 12-17 09:50 ?1036次閱讀

    Verilog與VHDL的比較 Verilog HDL編程技巧

    Verilog 與 VHDL 比較 1. 語法和風(fēng)格 VerilogVerilog 的語法更接近于 C 語言,對于有 C 語言背景的工程師來說,學(xué)習(xí)曲線較平緩。它支持結(jié)構(gòu)化編程,代碼更直觀,易于
    的頭像 發(fā)表于 12-17 09:44 ?1482次閱讀

    圖紙模板的文本變量

    “ ?文本變量和系統(tǒng)自帶的內(nèi)置變量,可以幫助工程師靈活、高效地配置標題欄的信息,而不用擔(dān)心模板的文字對象被意外修改。 ? ” 文本變量
    的頭像 發(fā)表于 11-13 18:21 ?548次閱讀
    圖紙模板<b class='flag-5'>中</b>的文本<b class='flag-5'>變量</b>

    如何在文本字段中使用上標、下標及變量

    在KiCad的任何文本字段,都可以通過以下的方式實現(xiàn)上標、下標、上劃線以及顯示變量及字段值的描述: 文本變量“文本變量”可以在 原理圖設(shè)置->工程->文本
    的頭像 發(fā)表于 11-12 12:23 ?528次閱讀
    如何在文本字段中使用上標、下標及<b class='flag-5'>變量</b>

    如何自動生成verilog代碼

    介紹幾種自動生成verilog代碼的方法。
    的頭像 發(fā)表于 11-05 11:45 ?937次閱讀
    如何自動生成<b class='flag-5'>verilog</b>代碼

    RISC-V的指令集的幾點學(xué)習(xí)心得

    指令集的選擇具有極大的靈活性,這得益于其模塊化設(shè)計。用戶可以根據(jù)具體的應(yīng)用場景和需求,選擇合適的指令集。例如,在資源受限的嵌入式系統(tǒng)
    發(fā)表于 10-31 22:05

    Verilog語法運算符的用法

    verilog語法中使用以下兩個運算符可以簡化我們的選擇代碼。
    的頭像 發(fā)表于 10-25 15:17 ?2317次閱讀
    <b class='flag-5'>Verilog</b>語法<b class='flag-5'>中</b>運算符的用法

    Verilog表達式的確定規(guī)則

    很多時候,Verilog中表達式的都是被隱式確定的,即使你自己設(shè)計了,它也是根據(jù)規(guī)則先確定位
    的頭像 發(fā)表于 10-22 15:41 ?1381次閱讀
    <b class='flag-5'>Verilog</b>表達式的<b class='flag-5'>位</b><b class='flag-5'>寬</b>確定規(guī)則

    FPGA Verilog HDL有什么奇技巧?

    今天給大俠帶來在FPAG技術(shù)交流群里平時討論的問題答疑合集(九),以后還會多推出本系列,話不多說,上貨。 交流問題(一) Q:Verilog 有什么奇技淫巧? A:在 Verilog ,以下這些
    發(fā)表于 09-12 19:10

    Keil變量不被初始化方法

    有些時候在我們的應(yīng)用過程要求變量有連續(xù)性,或者現(xiàn)場保留,例如Bootloader跳轉(zhuǎn),某種原因的復(fù)位過程我們有些關(guān)鍵變量不能被初始化,在不同的編譯環(huán)境下有不同的設(shè)置,本文就這個操作
    的頭像 發(fā)表于 08-30 11:47 ?1322次閱讀
    Keil<b class='flag-5'>中</b><b class='flag-5'>變量</b>不被初始化方法
    主站蜘蛛池模板: 米奇精品一区二区三区 | 六月婷婷啪啪 | 亚洲天堂免费 | 九九视频这里只有精品 | 午夜影皖普通区 | 亚洲一区二区三区高清 | 国产亚洲精品免费 | 四虎国产精品成人永久免费影视 | 日本aaaa级毛片在线看 | 狠狠做深爱婷婷久久一区 | 天堂资源中文官网 | 777午夜精品免费播放 | 日本高清中文字幕在线观穿线视频 | 欧美黄色免费大片 | 四虎影院在线观看网站 | 特一级毛片| 五月综合在线 | 国模张文静啪啪私拍337p | 久久99精品久久久久久野外 | 一级片免费在线观看 | 亚洲视频在线一区二区 | 手机看片福利视频 | 色碰人色碰人视频 | 男女无遮挡一进一出性视频 | 手机在线看a | 97影院理论午夜论不卡 | 国产特黄一级毛片特黄 | 美女三级网站 | 亚洲高清一区二区三区 | 一二三区在线观看 | 欧美seav在线 | 午夜精品久视频在线观看 | 双性人皇上被c到哭 | 日本一区二区三区在线网 | 亚洲成a人伦理 | 欧美成人黄色 | 黄 色 片成 人免费观看 | 美女天天干 | 手机看片日韩国产 | 蕾丝视频成人★在线观看 | 亚洲午夜一区 |