VERILOG的parameter的写法

这是模块定义时的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的层次精简很多。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值