在FPGA中,我们有时候会面临将一批数据送入某个模块(就像c语言中向函数传入传出数组一样),然而FPGA中数据接口并不能传送数组,那此时我们要怎么做呢?其实可以用到generate语句,对数据进行打包(pack)和解包(unpack)。
比如下面这个模块,该模块对是并行加法的一个子模块,使用自底向上设计的归并方法,计算两相邻加数的和。该模块中,首先使用for循环语句,将数据datas_packed解包,获取所有输入的加数(存入数组datas_unpacked),在计算完和(数组sum_arr)后,再使用for语句将结果数组sum_arr打包为数据sums_packed,作为模块的输出。
module ADD_Layer(
datas_packed,
sums_packed
);
parameter dataWidth=16;
parameter N=4;
input [0:dataWidthN-1]datas_packed;
output [0:(dataWidth+1)(N%2==0?N/2:N/2+1)-1]sums_packed;
generate
genvar i;
//数据解包
wire [dataWidth-1:0]datas_unpacked[1:N];
for(i=1;i<=N;i=i+1)
begin: unpack
assign datas_unpacked[i]=datas_packed[(i-1)*dataWidth:i*dataWidth-1];
end
//两两相加
wire [dataWidth:0]sum_arr[1:(N%2==0?N/2:N/2+1)]; //sum的位数为dataWidth+1
for(i=1;i<=N/2;i=i+1)
begin: sum_layer
assign sum_arr[i]=datas_unpacked[2*i-1]+datas_unpacked[2*i];
end
if(N%2==1)begin
assign sum_arr[N/2+1]=datas_unpacked[N];
end
//打包sum_arr
for(i=1;i<=(N%2==0?N/2:N/2+1);i=i+1)
begin: pack
assign sums_packed[(i-1)*(dataWidth+1):i*(dataWidth+1)-1]=sum_arr[i];
end
endgenerate
endmodule
因此,只要在模块中用generate语句实现数据打包与解包,那么其之间的数据处理过程,就可以像c语言一样使用数组了!
原作者:今朝无言
|