轉 verilog hdl中常數宣告

2021-09-25 17:48:49 字數 1747 閱讀 9307

1、語法

宣告:parameter xx = yy;

`define xx yy

使用:xx

`xx2、作用域

parameter 作用於宣告的那個檔案;`define 從編譯器讀到這條指令開始到編譯結束都有效,或者遇到`undef命令使之失效。

如果想讓parameter或`define作用於整個專案,可以將如下宣告寫於單獨檔案,並用`include讓每個檔案都包含宣告檔案:

`ifndef xx

`define xx yy // or parameter xx = yy;

`endif

`define也可以寫在編譯器最先編譯的檔案頂部。通常編譯器都可以定義編譯順序,或者從最底層模組開始編譯。因此寫在最底層就可以了。

3、作用

parameter可以用作例化時的引數傳遞。具體方法參見《verilog例化時的引數傳遞》一文

數字宣告

verilog中有兩種數字生命:指明位數的數字不指明位數的數字

指明位數的數字表示形式:』

size用來指明數字位寬度,只能用十進位制整數表示

base format包括十進位制(』d或』d),二進位制(』b或』b),八進位制(『o或』o),十六進製制(『h或』h)

例如4』b1111       //4位2進製數

12』h3ac      

要注意的是這不是表示12位16進製制數,表示12位二進位制顯示是16進製制數

例子parameter lineperiod =12'd1040;

parameter h_syncpulse=8'd120;

parameter h_backporch=10'd1040;

parameter h_activepix=706;

綜合(synthesize)後

lineperiod = "010000010000"

h_syncpulse = "01111000"

h_backporch = "0000010000"

h_activepix = "00000000000000000000001011000010"

可以看出12』d 不是表示有12位十進位制,而是表示有12位二進位制。如果沒有限定位數,ise綜合時預設為32位,所以編verilog的時候不要超過32位。

如果限定多餘32位的話,綜合時會報錯。

如parameter h_activepix=33'b706;

會報錯,報錯資訊如下:

error:hdlcompilers:34 - "vga_800x600.v" line 19 illegal digit(s) in binary constant '706'

還有注意的乙個問題是lineperiod和h_backporch都是1040(十進位制),1040二進位制為11位(2的十次方為1024),但「h_backporch」沒有因為位數不夠報錯,但是把高位截掉了,變成「0000010000」,所以在verilog程式設計的時候要注意賦值問題。

不限定位數,預設為32位,這很浪費暫存器資源。

限定位數小於常數的位數時,賦值就不正確了。

所以賦值的位數要有富裕但不至於太浪費暫存器資源。

整數乘法優化問題(乘以常數) 轉

如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。其實這個問題就是如何將整數變數乘上整數常數問題轉化為最少的移位運算和加法運算問題.假設乙個計算機只提供加減法和移位一位的指令,那麼這個問題就相當於如何用最少的加減法和移位指令來計算乘上乙...

轉 VC中常用的巨集

我們在vs環境中開發的時候,會遇到很多巨集定義,這些巨集可以應用到 中,或用於編譯 工程選項等設定,總之是我們開發中必不可少的工具,有必要做乙個總結。有些巨集是c c 定義的,有些巨集是vc環境預定義的。1 c c 中的巨集 cplusplus如果當前編譯器為c 該值為1。date 當前原始碼的編譯...

VC中常用的巨集 轉

我們在vs環境中開發的時候,會遇到很多巨集定義,這些巨集可以應用到 中,或用於編譯 工程選項等設定,總之是我們開發中必不可少的工具,有必要做乙個總結。有些巨集是c c 定義的,有些巨集是vc環境預定義的。1 c c 中的巨集 cplusplus如果當前編譯器為c 該值為1。date 當前原始碼的編譯...