日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

C29F_xilinx_inc ? 來(lái)源:賽靈思 ? 作者:賽靈思 ? 2022-02-16 16:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1、位寬太小

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

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

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

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

endmodule

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

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

2、自己寫(xiě)一個(gè)Function

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

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

// function 實(shí)現(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;

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

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

3、無(wú)法在輸入輸出端口使用

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

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

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

//省略部分代碼

endmodule

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

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

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

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

接下來(lái)寫(xiě)個(gè)簡(jiǎn)單的模塊驗(yàn)證下Vivado對(duì)$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的位寬綜合出來(lái)到底是多少。如果以e為底向上取整,則位寬應(yīng)是6;如果以2為底向上取整,則位寬應(yīng)是9。Vivado綜合的原理圖局部如下:

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    31

    文章

    5620

    瀏覽量

    130455
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2321

    瀏覽量

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

    關(guān)注

    11

    文章

    1870

    瀏覽量

    34044
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    深度解析?RK?平臺(tái)?U-Boot?環(huán)境變量(env):原理、配置與實(shí)戰(zhàn)

    環(huán)境變量(env)是?U-Boot?的核心配置機(jī)制,無(wú)需重新編譯即可靈活調(diào)整啟動(dòng)參數(shù)。在?Rockchip(RK)平臺(tái)上,環(huán)境變量不僅繼承了?U-Boot?的通用特性,還針對(duì)?RK?芯片架構(gòu)做了大量
    的頭像 發(fā)表于 04-27 07:11 ?545次閱讀
    深度解析?RK?平臺(tái)?U-Boot?環(huán)境<b class='flag-5'>變量</b>(env):原理、配置與實(shí)戰(zhàn)

    組態(tài)屏變量地址映射 / 數(shù)據(jù)類型不匹配解決方法

    在工業(yè)自動(dòng)化領(lǐng)域,組態(tài)屏作為人機(jī)交互的核心設(shè)備,其與控制器(如PLC、單片機(jī))之間的數(shù)據(jù)交換依賴于準(zhǔn)確的變量地址映射與數(shù)據(jù)類型匹配。然而,實(shí)際工程,因地址規(guī)劃混亂或數(shù)據(jù)類型不一致導(dǎo)致的顯示異常
    的頭像 發(fā)表于 04-22 10:41 ?187次閱讀
    組態(tài)屏<b class='flag-5'>變量</b>地址映射 / 數(shù)據(jù)類型不<b class='flag-5'>匹配</b>解決方法

    面試必看!排隊(duì)自旋鎖32變量的域劃分與核心作用

    在操作系統(tǒng)面試,并發(fā)同步機(jī)制一直是高頻考點(diǎn),而排隊(duì)自旋鎖作為解決傳統(tǒng)自旋鎖“饑餓” 問(wèn)題的關(guān)鍵技術(shù),其 32 變量的域劃分更是面試官青睞的 “細(xì)節(jié)題”。不少同學(xué)能說(shuō)出排隊(duì)自旋鎖的基本概念,卻對(duì)其
    的頭像 發(fā)表于 02-09 16:54 ?936次閱讀
    面試必看!排隊(duì)自旋鎖32<b class='flag-5'>位</b><b class='flag-5'>變量</b>的域劃分與核心作用

    用戶對(duì)變量或寄存器進(jìn)行操作的方法

    嵌入式系統(tǒng)總是要用戶對(duì)變量或寄存器進(jìn)行操作。給定一個(gè)整型變量a,寫(xiě)兩段代碼,第一個(gè)設(shè)置a的bit 3,第二個(gè)清除a 的bit 3。在以上兩個(gè)操作,要保持其它
    發(fā)表于 12-23 08:16

    在Keil如何調(diào)試程序變量的值變化呢?

    在Keil,如何調(diào)試程序變量的值變化呢
    發(fā)表于 12-22 16:16

    字符串關(guān)聯(lián)數(shù)字變量如何使用?我們的地址都是16數(shù)據(jù),可以使用16數(shù)字變量顯示字符串嗎?

    字符串關(guān)聯(lián)數(shù)字變量如何使用?我們的地址都是16數(shù)據(jù),可以使用16數(shù)字變量顯示字符串嗎?
    發(fā)表于 12-15 08:24

    什么是

    數(shù)據(jù)結(jié)構(gòu),稱為“域”或“段”。 所謂“域”是把一個(gè)字節(jié)的二進(jìn)位劃分為幾個(gè)不同的區(qū)域,并說(shuō)明每個(gè)區(qū)域的位數(shù)。 每個(gè)域有一個(gè)域名,允許在程序
    發(fā)表于 12-15 08:07

    第7章 變量進(jìn)階與點(diǎn)陣LED(7.1 7.2)

    走在馬路上的時(shí)候,經(jīng)常會(huì)看到馬路兩側(cè)有一些LED點(diǎn)陣的廣告牌,這些廣告牌看起來(lái)絢爛奪目,非常吸引人,而且還會(huì)變化很多種不同的顯示方式。本章就會(huì)學(xué)習(xí)到點(diǎn)陣LED的控制方式,同時(shí)也會(huì)學(xué)習(xí)C語(yǔ)言變量的進(jìn)階
    的頭像 發(fā)表于 12-10 16:25 ?508次閱讀

    操作的常見(jiàn)錯(cuò)誤與應(yīng)對(duì)策略

    溢出或數(shù)據(jù)丟失。在進(jìn)行位移操作時(shí),必須確保位移量在數(shù)據(jù)類型的有效范圍內(nèi)。例如,對(duì)于一個(gè) 8 的無(wú)符號(hào)字符型變量unsigned char,其為 8
    發(fā)表于 11-24 07:50

    常用變量的介紹

    extern:用在全局變量上表示該變量在其他文件已經(jīng)定義;用在函數(shù)上作用同全局變量; static:用在全局變量上,和非靜態(tài)全局
    發(fā)表于 11-21 07:05

    verilog testbench運(yùn)行測(cè)試用例時(shí),運(yùn)行到make run_test出錯(cuò)怎么解決?

    按照胡老師書(shū)上的在verilog testbench運(yùn)行測(cè)試用例時(shí),在運(yùn)行到make run_test步驟時(shí)出錯(cuò),查了很多方案沒(méi)有解決。
    發(fā)表于 11-11 06:52

    NucleiStudio如何生成.verilog文件和.dasm文件,以及對(duì).dasm文件自定義指令反匯編結(jié)果分析

    文件,以及對(duì).dasm文件自定義指令反匯編結(jié)果分析。 一、如何生成.verilog和.dasm文件文件 項(xiàng)目右鍵選擇Properties 選擇C/C++ Build下面的Setting 更改
    發(fā)表于 10-24 06:33

    PLCStatic和Temp變量的區(qū)別

    大家好,收到粉絲投稿,讓博主講下Static變量和Temp變量的區(qū)別,新入行的兄弟可能會(huì)對(duì)這兩個(gè)概念不太能理解。
    的頭像 發(fā)表于 09-24 14:51 ?1657次閱讀
    PLC<b class='flag-5'>中</b>Static和Temp<b class='flag-5'>變量</b>的區(qū)別

    為什么銅塊尺寸和板槽公差匹配很關(guān)鍵

    為什么公差設(shè)計(jì)如此重要? 埋嵌銅塊看似只是把銅塊“放進(jìn)”P(pán)CB槽里,但實(shí)際卻涉及機(jī)械加工、樹(shù)脂填充、壓合、焊接等多個(gè)環(huán)節(jié)。任何尺寸不匹配都會(huì)帶來(lái)嚴(yán)重后果,例如:銅塊松動(dòng)、界面空隙、熱阻增大、甚至
    的頭像 發(fā)表于 09-15 15:36 ?5104次閱讀

    基于LockAI視覺(jué)識(shí)別模塊:C++多模板匹配

    多模板匹配是一種在圖像同時(shí)尋找多個(gè)模板的技術(shù)。通過(guò)對(duì)每個(gè)模板逐一進(jìn)行匹配,找到與輸入圖像最相似的區(qū)域,并標(biāo)記出匹配度最高的結(jié)果。本實(shí)驗(yàn)提供了一個(gè)簡(jiǎn)單的多模板
    的頭像 發(fā)表于 05-14 14:37 ?1776次閱讀
    基于LockAI視覺(jué)識(shí)別模塊:C++多模板<b class='flag-5'>匹配</b>
    紫金县| 临江市| 塔城市| 成都市| 杭锦旗| 鄂托克前旗| 沽源县| 安吉县| 鄂托克旗| 通化县| 昌黎县| 潼关县| 鲁山县| 宝坻区| 滁州市| 康乐县| 荥阳市| 迭部县| 阿城市| 德兴市| 防城港市| 五大连池市| 虎林市| 夹江县| 灵寿县| 出国| 鄂伦春自治旗| 荆州市| 泾川县| 麦盖提县| 阿拉善左旗| 宁都县| 敖汉旗| 久治县| 阳春市| 虎林市| 广东省| 岢岚县| 安陆市| SHOW| 嘉定区|