Verilog中`define、parameter、localparam三者的區別及舉例

1、概述
define:作用 -> 常用於定義常量可以跨模塊、跨文件;
範圍 -> 整個工程;
parameter: 作用 -> 常用於模塊間參數傳遞;
範圍 -> 本module內有效的定義;
localparam 作用 -> 常用於狀態機的參數定義;
範圍 -> 本module內有效的定義,不可用於參數傳遞

2、應用舉例

(1) define
概念:可以跨模塊的定義,寫在模塊名稱上面,在整個設計工程都有效。
一旦define指令被編譯,其在整個編譯過程中都有效。例如,通
過另一個文件中的define指令,定義的常量可以被其他文件調用,
直到遇到 `undef;
舉例:定義 define UART_CNT 10’d1024
使用 UART_CNT

(2) parameter
概念:本module內有效的定義,可用於參數傳遞;
如果在模塊內部定義時無法進行參數傳遞,
若在模塊名後照下面這樣寫則可以進行傳遞
舉例:定義->

module video_in  
           #(  
          parameter MEM_DATA_BITS = 64,  
          parameter INTERLACE     = 1      // 0  
          )  
          (  
           input     clk,  
           input     rst_n,  

           output    burst_finsh  
          );  

使用 -> 調用此模塊的時候可以像端口信號傳遞一樣進行參數傳遞

video_in  
       #( .MEM_DATA_BITS ( 64 ),  
          .INTERLACE     ( 1  )  
        )  
       u_video_in (  
        .clk             (clk_50m),  
        .rst_n          (rst_n),  

        .burst_finsh (burst_finsh)  
        );  

(3) localparam:
概念:本module內有效的定義,不可用於參數傳遞;
localparamcannot be used within the module port parameter list.
一般情況下,狀態機的參數都是用localparam的。
舉例:

localparam BURST_LEN               = 10'd64;     /*一次寫操作數據長度 */  

localparam BURST_IDLE              = 3'd0;       /*狀態機狀態:空閒 */  
localparam BURST_ONE_LINE_START    = 3'd1;       /*狀態機狀態:視頻數據一行寫開始 */  
localparam BURSTING                = 3'd2;       /*狀態機狀態:正在處理一次ddr2寫操作 */  
localparam BURST_END               = 3'd3;       /*狀態機狀態:一次ddr2寫操作完成*/  
localparam BURST_ONE_LINE_END      = 3'd4;       /*狀態機狀態:視頻數據一行寫完成*/  

reg[2:0]  burst_state              = 3'd0;       /*狀態機狀態:當前狀態 */  
reg[2:0]  burst_state_next         = 3'd0;       /*狀態機狀態:下一個狀態*/  
發佈了46 篇原創文章 · 獲贊 141 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章