|
本帖最后由 fpgaw 于 2010-7-12 17:18 编辑
做FFT实现的时候,要用并行处理,16个蝶形单元并行运行,但是一直没有处理好。
大家帮帮忙,指点一下。
大体思路见下面的代码:
module bufly_array (clk, In, P, Out);
input clk;
//全部将寄存器值付给线值,一次性输入
input [255:0] In;
input [2:0] P;
output wire [255:0] Out;
reg [15:0] In_reg [16];
reg [3:0] alm, ahm, al, ah;
wire [15:0] Out_wire [16]; //bufly输出赋值
always @ (posedge clk)
begin
In_reg[0]<=In[7:0];
In_reg[1]<=In[15:8];
...
In_reg[15]<=In[255:248];
end
/*地址产生器,计算节点数据地址add_up,add_down
P为级数
al为地地址,ah为高地址
add_up_out为高节点地址
add_down_out为低节点地址
*/
add add_0 (.P(P), .al(al), .ah(ah), .add_up(add_up_out), .add_down(add_down_out));
always @ (p)
begin
alm<=4'b1<<(p-3'b1);
ahm<=4'b1<<(3'b100-p);
end
always @ (posedge clk)
begin
for (i=0;i<=5'h0f;i=i+5'b1)
begin
if(ah<ahm)
ah<=ah+4'b1;
else if (al<alm)
begin
ah<=4'b0;
al<=al+4'b1;
end
else
al<=4'b0;
//完成赋值
count<=count+4'b1;
//通过地址来选择操作数和旋转因子
add_up[count]<=add_up_out;
add_down[count]<=add_down_out;
end
// if (count<=9'h0ff) //通过count来依次选择蝶形单元
//else
//count<=9'b0;
end
bufly bufly_00 (.In_up(In_reg[add_up[0]])
.In_down(In_reg[add_down[0]])
.Out_up(Out_wire[add_up[0]])
.Out_down(Out_wire[add_down[0]])
);
...
bufly bufly_15 (.In_up(In_reg[add_up[15]])
.In_down(In_reg[add_down[15]])
.Out_up(Out_wire[add_up[15]])
.Out_down(Out_wire[add_down[15]])
);
assign Out={Out_wire[15],...,Out_wire[0]};
endmodule
module bufly (In_up, In_down, Out_up, Out_down);
input [15:0] In_up, In_down;
output [15:0] Out_up, Out_down;
......
endmodule
module add (P, al, ah, add_up, add_down);
input [2:0] P;
input [3:0] al, ah;
output [3:0] add_up, add_down;
......
endmodule |
|