教程 引數例化時自動計算位寬的解決辦法

2021-10-01 22:07:55 字數 1384 閱讀 8891

在工程中,引數化設計是非常常見的。模組介面的位寬,常見的有8位、16位、32位、64位和128位等;雖然功能相同,僅因為位寬不同,就要另外寫乙個模組,那設計工作就很繁複了。為此,我們可以採用引數化來實現,即用parameter來定義常數。

但是引數化會遇到乙個問題,就是某些訊號的位寬跟此引數有著密切的關係。例如,我們可以使用parameter來定義fifo的深度,但是表示fifo深度的訊號usedw,其位寬是跟引數相關的。如果深度為512,usedw位寬是9位,如果深度為1024,其位寬是10位。這時如果此模組可以自己計算位寬那就再好不過了。

其實位寬的計算就是求以2為底的對數,那我們可以寫乙個實現此功能的函式。把這個函式命名為clogb2,輸入的引數命名為depth,這個函式的輸入輸出都是整型的資料。當輸入depth為0時,clogb2輸出1,fpga中最小的位寬就是1bit,一般這種情況就不需要定義位寬了,所以可能這個函式的輸入就是0。如果depth不為0,那麼如果depth不等於0,那麼會讓depth不斷除以2,每除以2一次,clogb2就會自增1,直到depth除不動為止,這個時候clogb2輸出的就是這個數以2為底的對數。

注意一下,該函式要求depth必須是2的n次方,否則會計算不正確。

下面我們以引數化fifo來看一下。fifo是我們工程中常用的ip核,但是可能在不同的模組**中,需要用到fifo的深度以及位寬都不一樣,那是否需要每次都生成乙個對應的ip核呢?其實使用altera平台的話,是不需要的,這個完全可以通過引數化的方法來解決。如下圖所示是乙個已經生成的fifo的檔案,這裡面我們把fifo的深度以及輸入輸出的位寬引數化為dept_w和_data_w,而下面對應深度的位寬,我們則呼叫上面設計的函式clogb2來計算,注意這裡需要先把這個函式的**寫進來。

下面將這個fifo的輸入輸出位寬data_w例化為1bit,儲存深度dept_w例化為32。

從下面綜合之後的結果可以看出,輸入輸出位寬變為了1bit,usedw訊號的位寬變為了5bit。

通過以上驗證可以看出,這個自動計算位寬的函式可以解決我們引數化例化一些模組的時候位寬變化的問題。

verilog引數例化

verilog引數例化 1 引數定義parameter module ram 1r1w parameter width 128,parameter deepth 32 input wclk,input width 1 0 wdin,input rclk,output width 1 0 dout,e...

creatprocess 傳入引數例子

procedure tmainform.test varupdatefilepath string si startupinfo pi process information begin updatefilepath c a b c.exe zeromemory si,sizeof startupi...

boost bind引數例子使用

bind並不是乙個單獨的類或函式,而是非常龐大的家族,依據繫結的引數個數和要繫結的呼叫物件型別,總共有十個不同的形式,但它們的名字都叫bind.bind接受的第乙個引數必須是乙個可呼叫物件f,包括函式,函式指標,函式物件和成員函式,之後bind接受最多9個引數,引數的數量必須與f的引數數量相等 1,...