这是模块定义时的paramter的写法,有二个参数H_DISP, V_DISP, 初始化定义为二个值。
module vga_display
#(
parameter H_DISP = 10'd640,
parameter V_DISP = 10'd480
)
(
input clk,
input rst_n,
input [9:0] vga_xpos,
input [9:0] vga_ypos,
output reg [15:0] vga_data
);
//define colors RGB--5|6|5
localparam RED = 16'hF800;
localparam GREEN = 16'h07E0;
localparam BLUE = 16'h001F;
localparam WHITE = 16'hFFFF;
localparam BLACK = 16'h0000;
localparam YELLOW = 16'hFFE0;
localparam CYAN = 16'hF81F;
localparam ROYAL = 16'h07FF;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
vga_data <= 16'h0;
else
begin
if (vga_xpos >= 0 && vga_xpos < (H_DISP>>3))
vga_data <= RED;
else if(vga_xpos >= (H_DISP>>3)*1 && vga_xpos < (H_DISP>>3)*2)
vga_data <= GREEN;
else if(vga_xpos >= (H_DISP>>3)*2 && vga_xpos < (H_DISP>>3)*3)
vga_data <= BLUE;
else if(vga_xpos >= (H_DISP>>3)*3 && vga_xpos < (H_DISP>>3)*4)
vga_data <= WHITE;
else if(vga_xpos >= (H_DISP>>3)*4 && vga_xpos < (H_DISP>>3)*5)
vga_data <= BLACK;
else if(vga_xpos >= (H_DISP>>3)*5 && vga_xpos < (H_DISP>>3)*6)
vga_data <= YELLOW;
else if(vga_xpos >= (H_DISP>>3)*6 && vga_xpos < (H_DISP>>3)*7)
vga_data <= CYAN;
else// if(vga_xpos >= (H_DISP<<3)*7 && vga_xpos < (H_DISP<<3)*8)
vga_data <= ROYAL;
end
end
endmodule
这里是实例化时的参数。
vga_display #(...........) vga_display_inst(.....)
这样写的话比较好看些。
//-----------------------------
//vga display instantiation
wire [9:0] vga_xpos;
wire [9:0] vga_ypos;
wire [15:0] vga_data;
vga_display
#(
.H_DISP (H_DISP), // (H_DISP)是一个上层定义的parameter
.V_DISP (V_DISP)
)
vga_display_inst
(
.clk (clk_vga),
.rst_n (sys_rst_n),
.vga_xpos (vga_xpos),
.vga_ypos (vga_ypos),
.vga_data (vga_data)
);
再看网友是这样写的,
在调用DesignWare时候,通常会有dw01_add #(a_width,bwidth)这一类语法出现,当时很疑惑这是为什么,现在才查到它的出处。怀疑是不是自己基本功不够扎实。查到的用法如下
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
这个用法着实实用。如果有一个模块经常被调用,那么这种方法能让verilog的层次精简很多。