在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:dataWidth*N-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语言一样使用数组了!



