Verilog 帶有parameter的模塊端口調用


如果是帶有的參數不需要本模塊以外的部分修改,則調用模塊時不需要考慮參數;如果我們希望能夠在本模塊以外修改參數,則參數調用通常有兩種方法,如下代碼:

  1、module_name #( parameter1, parameter2) inst_name( port_map);
  2、module_name #( .parameter_name(para_value),.parameter_name(para_value)) inst_name (port map);
  用#方法和port map的寫法差不多
   module multiplier (a, b, product);
      parameter a_width = 8, b_width = 8;
      localparam product_width = a_width+b_width;
      input [a_width-1:0] a;
      input [b_width-1:0] b;
      output[product_width-1:0]product;
         generate
             if((a_width < 8) || (b_width < 8))
                 CLA_multiplier #(a_width, b_width) u1 (a, b, product);
             else
                  WALLACE_multiplier #(a_width, b_width)  u1 (a, b, product);
         endgenerate
   endmodule

1、概述

`define:作用 -> 常用於定義常量可以跨模塊、跨文件;

范圍 -> 整個工程;

parameter:     作用 -> 常用於模塊間參數傳遞;

范圍 -> 本module內有效的定義;

localparam       作用 -> 常用於狀態機的參數定義;

范圍 -> 本module內有效的定義,不可用於參數傳遞;

localparam cannot be used within the module port parameter list.

2、應用舉例

(1) define     概念:可以跨模塊的定義,寫在模塊名稱上面,在整個設計工程都有效。                一旦define指令被編譯,其在整個編譯過程中都有效。例如,通
               過另一個文件中的define指令,定義的常量可以被其他文件調用,                直到遇到 undef;
    舉例:定義 define UART_CNT 10'd1024                使用 UART_CNT
需要特別注意的是:在利用`define做算數運算的時候,一定要加上括號,如下例子所示:

`define timeslice 100
module .....
......
# (2*`timeslice)    //這個是要加上括號的,如果寫成# 2*`timeslice編譯時是不會通過的;        

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM