FPGA之Verilog语言13___生成块

FPGA之Verilog语言13___生成块

1.生成块的作用(简化代码编写)

①根据入参判断这段程序是否使用。比如你的这个程序需要对N个设备支持这N个设备只有一小部分代码不同,并且互相冲突。 这个时候你用generate就可以根据你的需要选择性的支持指定设备。

②某一个模块我需要用n次最麻烦的操作就是 复制n次代码,用generate就可以只用一段代码完成

2.循环生成语句

		module bitwise_xor(out,i1,i2);

			parameter N = 32;
			input [N-1:0] i1;
			input [N-1:0] i2;
			output[N-1:0] out;
			 
				genvar j;		//声明的此变量只用于生成块的循环计算,在电路里面并不存在
				generate
				   for(j=0;j<N;j=j+1)
				        begin:xor_loop    
				           xor g1 (out[j],i0[j],i[j]);		//调用本身模块
				        end
				endgenerate
			
		endmodule

上面代码是对两个N位总线的变量进行按位异或

3.条件生成语句

使用条件生成语句实现参数化乘法器

			module multiplier(product,a0,a1);	//参数声明,该参数可以重新定义
			
			parameter a0_width = 8;
			parameter a1_width = 8;
			 
			//本地参数不能用参数重新定义(defparam)
			//也不能在实例引用时通过传递参数语句,即#(参数1,参数2,.....)的方法修改
			localparam    product_width = a0_width + a1_width;
				 
			input [a0_width-1:0] a0;
			input [a1_width-1:0] a1;
			ouput [product_width-1:0] prduct;
 
			//有条件地调用(实例引用)不同类型的乘法器
			//根据参数a0_width和a1_width的值,在调用时引用相应的乘法器实例
			generate
			 	if(a0_width<8)||(a1_width<8)
			 		 cal_multiplier  #(a0_width,a1_width)m0(product,a0,a1);
				else
			 		 tre_multiplier  #(a0_width,a1_width)m0(product,a0,a1);
			endgenerate
		endmodule

4.caes生成语句

case生成语句实现位加法器

			module addr(co,sum,a0,a1,ci);
			 
			parameter  N = 4  		//总线位宽为4
			
			input [N-1:0]	a0,a1;
			input ci;
			output[N-1:0]sum;
			output co;
			
			//参数N在调用(实例引用)时可以重新定义,
			//不同类型(位宽)的加法器根据不同的N来决定
				generate
					case(N) 
					   //当N=1或N=2时分别选用位宽为1或者位宽为2的加法器
					    1:adder_1bit   adder1(co,sum,a0,a1,ci);//实例1位加法器模块
					    2:adder_1bit   adder1(co,sum,a0,a1,ci);//实例2位加法器模块
					    default:adder_cla #(N)  adder3(co,sum,a0,a1,ci);//实例N位加法器模块
					endcase
				endgenerate
			 
			endmodule
上一篇:FPGA always 和assign 用法


下一篇:MCU,FPGA,通信接口的一点看法