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