91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

Verilog設計中如何匹配變量的位寬

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

掃碼添加小助手

加入工程師交流群

1、位寬太小

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

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

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

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

2、自己寫一個Function

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

前面說過寄存器的位寬的計算方法:以2為底取對數(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,用其求得某類寄存器的位寬,然后再對寄存器賦值時就直接使用求得的位寬來賦值,這樣復用起來就比較方便了。

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

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

自己寫Function實現(xiàn)對2取對數(shù)的功能也有一定的局限性:無法對輸入輸出端口信號使用該Function。Function是定義在模塊內部,所以若輸入輸出端口也需要根據輸入的parameter參數(shù)來以2為底取對數(shù)的話此種方法就無能為力了。比如:設計一個同步FIFO,輸出信號fifo_cnt(計數(shù)器)是對寫入FIFO的數(shù)據進行計數(shù)的寄存器,其最大值即為FIFO的深度DATA_DEPTH ,所以fifo_cnt的位寬就需要在定義模塊輸入輸出端口時確定,顯然這無法使用自己構造的 cblogb2 Function。那該當如何?
//計數(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 , //低電平有效的復位信號
input [DATA_WIDTH-1:0] data_in , //寫入的數(shù)據
input rd_en , //讀使能信號,高電平有效
input wr_en , //寫使能信號,高電平有效

output reg [DATA_WIDTH-1:0] data_out, //輸出的數(shù)據
output empty , //空標志,高電平表示當前FIFO已被寫滿
output full , //滿標志,高電平表示當前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ù),其結果向上取整(如5.5取6)。有一點需要說明的是,目前Vivado2017以上的版本都是支持這個系統(tǒng)函數(shù)的(Quartus II不清楚 )。但是百度搜索這條結果的時候有兩條結論是錯誤的:

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為底向上取整,則位寬應是6;如果以2為底向上取整,則位寬應是9。Vivado綜合的原理圖局部如下:

Verilog設計中如何匹配變量的位寬

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

其他變量的位寬設計同理。

審核編輯:湯梓紅

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

    關注

    31

    文章

    5608

    瀏覽量

    129964
  • 計數(shù)器
    +關注

    關注

    32

    文章

    2315

    瀏覽量

    98170
  • 參數(shù)
    +關注

    關注

    11

    文章

    1869

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

    用戶對變量或寄存器進行操作的方法

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

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

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

    什么是

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

    第7章 變量進階與點陣LED(7.1 7.2)

    走在馬路上的時候,經常會看到馬路兩側有一些LED點陣的廣告牌,這些廣告牌看起來絢爛奪目,非常吸引人,而且還會變化很多種不同的顯示方式。本章就會學習到點陣LED的控制方式,同時也會學習C語言變量的進階
    的頭像 發(fā)表于 12-10 16:25 ?353次閱讀

    操作的常見錯誤與應對策略

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

    常用變量的介紹

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

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

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

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

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

    為什么銅塊尺寸和板槽公差匹配很關鍵

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

    verilog模塊的調用、任務和函數(shù)

    在做模塊劃分時,通常會出現(xiàn)這種情形,某個大的模塊包含了一個或多個功能子模塊,verilog是通過模塊調用或稱為模塊實例化的方式來實現(xiàn)這些子模塊與高層模塊的連接的.
    的頭像 發(fā)表于 05-03 10:29 ?1560次閱讀
    <b class='flag-5'>verilog</b>模塊的調用、任務和函數(shù)

    Ansible Playbook變量使用技巧

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

    FPGA Verilog HDL語法之編譯預處理

    Verilog HDL語言和C語言一樣也提供了編譯預處理的功能?!熬幾g預處理”是Verilog HDL編譯系統(tǒng)的一個組成部分。Verilog HDL語言允許在程序中使用幾種特殊的命令(它們不是一般
    的頭像 發(fā)表于 03-27 13:30 ?1434次閱讀
    FPGA <b class='flag-5'>Verilog</b> HDL語法之編譯預處理

    一文詳解Verilog HDL

    Verilog HDL(Hardware Description Language)是一種硬件描述語言,用于從算法級、門級到開關級的多種抽象設計層次的數(shù)字系統(tǒng)建模?,F(xiàn)實生活多用于專用集成電路
    的頭像 發(fā)表于 03-17 15:17 ?4291次閱讀
    一文詳解<b class='flag-5'>Verilog</b> HDL

    尋找verilog高手,有報酬

    我采集了一塊電路板正常工作時的數(shù)據,基于這些數(shù)據我想用EPM7128slc84-15(sys_clk:50Mhz)測試電路板,尋求一verilog高手,有償
    發(fā)表于 03-08 16:31