Verilog 帶有parameter的模塊端口調用

若是是帶有的參數不須要本模塊之外的部分修改,則調用模塊時不須要考慮參數;若是咱們但願可以在本模塊之外修改參數,則參數調用一般有兩種方法,以下代碼:設計

一、module_name #( parameter1, parameter2) inst_name( port_map);
  二、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

一、概述code

    `define:做用 -> 經常使用於定義常量能夠跨模塊、跨文件;ip

                            範圍 -> 整個工程;input

    parameter:     做用 -> 經常使用於模塊間參數傳遞;it

                           範圍 -> 本module內有效的定義;編譯

    localparam       做用 -> 經常使用於狀態機的參數定義;class

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

                                      localparam cannot be used within the module port parameter list.sed

二、應用舉例map

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

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

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

相關文章
相關標籤/搜索