VERILOG的parameter的写法

本文详细介绍了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的层次精简很多。




### Verilog 计数器的实现 在Verilog中,计数器是一种常见的硬件描述结构,广泛应用于各种数字电路设计中。下面展示了一个简单的N位二进制加法计数器的设计方法。 #### 1. 定义模块参数与输入输出端口 首先定义计数器的最大值`MAX_COUNT`以及所需的其他参数。接着声明模块的输入输出端口,包括时钟信号`clk`、复位信号`reset`和使能信号`enb`等控制线,还有表示当前计数值的一组并行数据输出`count_out`。 ```verilog module counter #(parameter N=4, MAX_COUNT = 2**N - 1)( input wire clk, input wire reset, input wire enb, output reg [N-1:0] count_out); ``` #### 2. 实现计数逻辑 通过always块来捕捉同步事件,在上升沿触发条件下更新寄存器的内容。如果设置了复位信号,则将计数清零;否则根据使能条件决定是否增加计数值,并处理溢出情况。 ```verilog // 同步过程:基于时钟边沿的动作 always @(posedge clk or posedge reset) begin : COUNT_LOGIC if (reset) count_out <= 'd0; // 复位操作 else if(enb && count_out != MAX_COUNT) count_out <= count_out + 1'b1; end ``` 此部分实现了基本的功能需求,即每当接收到有效的脉冲时就递增内部存储的状态直到达到预设上限为止[^1]。 #### 3. 测试平台构建 为了验证上述代码的行为正确性,可以创建相应的测试平台文件来进行功能仿真。这通常涉及到初始化环境设置、施加激励源给DUT(Device Under Test),并通过观察波形图确认预期的结果。 ```verilog // 测试程序 initial begin $monitor("At time %t ps, Reset=%b Clk=%b Enb=%b Count=%b", $time, reset, clk, enb, count_out); // 初始化信号电平 reset = 1; enb = 0; #5 reset = 0; enb = 1; // 取消复位并启动计数 // 运行一段时间后结束模拟 #100 $finish; end ``` 这段脚本会打印每次变化的时间戳及其对应各条线上发生的改变,帮助开发者快速定位潜在问题所在之处[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值