• 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内有效的定义,可用于参数传递;
                   如果在模块内部定义时无法进行参数传递,
                   若在模块名后照下面这样写则可以进行传递

  • 相关阅读:
    [转]关于ORA00979 不是 GROUP BY 表达式错误的解释
    【转】mongodb简介及源码编译安装mongo2.0.0服务器
    mysql 缓存(转)
    iostat命令详解(转)
    C++虚函数,纯虚函数,抽象基类,虚基类(转)
    C++虚类的作用(转)
    C++ 纯虚类(转)
    虚函数的应用特性(转)
    2、Linux多线程,线程的分离与结合(转)
    mongodb js shell不能使用退格键的问题(转)
  • 原文地址:https://www.cnblogs.com/xuqing125/p/8884413.html
Copyright © 2020-2023  润新知