verilog HDL 重复运算的问题

最近的一个项目上需要把512个数随机采样数据,同时相加,求和。也就是说在一个是周期完成,达到一个时钟出一个求和结果。本来这个用verilog hdl来表达是一个很简单的事:

reg[15:0] addt[511:0];//定义一个512个一维数组
wire[31:0] sumd;
assign sumd=addt[0]+addt[1]+addt[2]+addt[3]+addt[4]+addt[5]+....addt[511];

但问题是,如果按上面的方法写,语句太长,写起来太麻烦了。如何简化写法呢?类似象:{8‘h22,8'h22,8'h22,8'h22,8'h22,8'h22,8'h22},可以简写成{7{8’h22}}一样。

对于这个问题,我发了帖子到altera中文论坛上请教(http://www.alteraforum.com.cn/showtopic-3458.aspx),也没有什么结果。

无奈只好采用如下方式: (希望有更好写法的高手给我留言)

wire[31:0] wsumbuf0[7:0],wsumbuf1[7:0]

generate
genvar ii
for(ii=0;ii<64; ii=ii+1)
begin:rep1
        wsumbuf0[ii]=addt[8*ii]+addt[8*ii+1]+addt[8*ii+2]+addt[8*ii+3]+addt[8*ii+4]+addt[8*ii+5]+addt[8*ii+6]+addt[8*ii+7];
end
endgenerate

generate
genvar jj
for(jj=0;jj<8; jj=jj+1)
begin:rep2
        wsumbuf1[jj]=wsumbuf0[8*jj]+wsumbuf0[8*jj+1]+wsumbuf0[8*jj+2]+wsumbuf0[8*jj+3]+wsumbuf0[8*jj+4]+wsumbuf0[8*jj+5]+wsumbuf0[8*jj+6]+wsumbuf0[8*jj+7];
end
endgenerate
///////////////////////////////
assign sumd=wsumbuf1[0]+wsumbuf1[1]+wsumbuf1[2]+wsumbuf1[3]+wsumbuf1[4]+wsumbuf1[5]+wsumbuf1[6]+wsumbuf1[7]; //8*8*8=512刚好是512个;

www.shuleikeji.com
原文地址:https://www.cnblogs.com/dongchunxiao/p/2747922.html