• parameter与localparam的使用


    :parameter可用作在顶层模块中例化底层模块时传递参数的接口,localparam的作用域仅仅限于当前module,不能作为参数传递的接口。

    [plain] view plain copy
     
    1. `timescale 1ns/100ps  
    2.   
    3. module mem (  
    4.   
    5.   clka,  
    6.   wea,  
    7.   addra,  
    8.   dina,  
    9.   
    10.   clkb,  
    11.   addrb,  
    12.   doutb);  
    13.   
    14.   parameter       DATA_WIDTH = 16;  
    15.   parameter       ADDR_WIDTH =  5;  
    16.   localparam      DW = DATA_WIDTH - 1;  
    17.   localparam      AW = ADDR_WIDTH - 1;  
    18.   
    19.   input           clka;  
    20.   input           wea;  
    21.   input   [AW:0]  addra;  
    22.   input   [DW:0]  dina;  
    23.   
    24.   input           clkb;  
    25.   input   [AW:0]  addrb;  
    26.   output  [DW:0]  doutb;  
    27.   
    28.   reg     [DW:0]  m_ram[0:((2**ADDR_WIDTH)-1)];  
    29.   reg     [DW:0]  doutb;  
    30.   
    31.   always @(posedge clka) begin  
    32.     if (wea == 1'b1) begin  
    33.       m_ram[addra] <= dina;  
    34.     end  
    35.   end  
    36.   
    37.   always @(posedge clkb) begin  
    38.     doutb <= m_ram[addrb];  
    39.   end  
    40.   
    41. endmodule  


    在顶层文件中例化mem module时可以这样做:

    [plain] view plain copy
     
    1. mem #(.DATA_WIDTH(DATA_WIDTH), .ADDR_WIDTH(6))  
    2.  i_mem (  
    3.   .clka (adc_clk),  
    4.   .wea (adc_wr),  
    5.   .addra (adc_waddr),  
    6.   .dina (adc_wdata),  
    7.   .clkb (dma_clk),  
    8.   .addrb (dma_raddr),  
    9.   .doutb (dma_rdata_s));  


    也可以将底层模块的parameter参数置于module端口声明之前,例如:

    [plain] view plain copy
     
      1. `timescale 1ns/100ps  
      2. module mem   
      3.           #(parameter DATA_WIDTH = 16  
      4.             parameter ADDR_WIDTH =  5)  
      5.            (    
      6.             input    clka,  
      7.             input    wea,  
      8.             input   [AW:0]  addra,  
      9.             input   [DW:0]  dina,  
      10.             input           clkb,  
      11.             input   [AW:0]  addrb,  
      12.             output  [DW:0]  doutb  
      13.            );   
      14.   
      15.   localparam      DW = DATA_WIDTH - 1;  
      16.   localparam      AW = ADDR_WIDTH - 1;  
      17.   
      18.   reg     [DW:0]  m_ram[0:((2**ADDR_WIDTH)-1)];  
      19.   reg     [DW:0]  doutb;  
      20.   
      21.   always @(posedge clka) begin  
      22.     if (wea == 1'b1) begin  
      23.       m_ram[addra] <= dina;  
      24.     end  
      25.   end  
      26.   
      27.   always @(posedge clkb) begin  
      28.     doutb <= m_ram[addrb];  
      29.   end  
      30.   
      31. endmodule  
  • 相关阅读:
    洛谷1280 尼克的任务
    洛谷1140 相似基因
    洛谷1133 教主的花园
    洛谷1130 红牌
    洛谷1122 最大子树和
    洛谷1103 书本整理
    洛谷1077 摆花
    【数学】数学知识习题小结(模板)
    python中的深拷贝和浅拷贝(面试题二)
    python中的深拷贝和浅拷贝(面试题)
  • 原文地址:https://www.cnblogs.com/Helloworld666/p/7325856.html
Copyright © 2020-2023  润新知