分区组合和顺序逻辑,用于4级FFT设计的可靠和低延迟蝶形模块



我正在构建一个4级FFT,使用一个简单的蝶形模块来进行复数乘法和累加。我已经构建了简单的蝴蝶模块(见下文(。我需要一些关于最小延迟的输入,同时有一个稳定的设计。

module simple_butterfly #(parameter WIDTH =16)(
input clk, rst,
input signed [WIDTH-1:0] a_real, a_imag,
input signed [WIDTH-1:0] b_real, b_imag,
input [WIDTH-1:0] w_real, w_imag,
output reg [WIDTH-1:0] p_real, p_imag,
output reg [WIDTH-1:0] q_real,q_imag
);
wire [2*WIDTH-1:0] bw_real_real, bw_imag_imag, bw_real_imag, bw_imag_real; // complex product outputs
wire [WIDTH-1:0] bw_real, bw_imag;
wire [WIDTH-1:0] p_real_w, p_imag_w, q_real_w, q_imag_w;

assign bw_real_real = b_real * w_real; // ac
assign bw_imag_imag = b_imag * w_imag; // bd
assign bw_real_imag = b_real * w_imag; // ad
assign bw_imag_real = b_imag * w_real; // bc 

assign bw_real = bw_real_real[27:12] - bw_imag_imag[27:12] ;  // ac - bd
assign bw_imag = bw_real_imag[27:12] + bw_imag_real[27:12] ;  // ad + bc 

assign p_real_w = a_real + bw_real;
assign p_imag_w = a_imag + bw_imag;
assign q_real_w = a_real - bw_real;
assign q_imag_w = a_imag - bw_imag;
always@(posedge clk)
if(rst) begin
p_real <= 16'b0;
p_imag <= 16'b0;
q_real <= 16'b0;
q_imag <= 16'b0;
end else begin
p_real <= p_real_w;
p_imag <= p_imag_w;
q_real <= q_real_w;
q_imag <= q_imag_w;
end
endmodule

我的问题是:我能把所有的乘法和向量提取都作为组合逻辑,只在每个阶段注册输出,以便进行流水线设计吗。下面的设计可以被认为是安全/可靠的吗?如果不能,任何有DSP模块构建经验的人都可以在我的设计中提出改进的建议。

在FPGA中,当设计乘法和加法模块时,您希望这些资源合成为DSP块。DSP块具有内置的乘法和累加功能。在所示的代码中,有4次乘法和4次加法,如果这合成为4个DSP块,则这是最佳结果。"流水线"(寄存器(最终内置在DSP块中,因此它们在某种程度上是免费的。

这是对资源的最佳使用,但是该部件具有有限数量的DSP块,这将限制变换的大小。

另一个限制是比特宽度;Xilinx DSP48用于相乘的块最大大小为25x18。查看其他供应商的不同尺寸。

目标是使合成工具在合成期间推断DSP块。通常,最佳实践是不在Verilog或VHDL RTL代码中实例化DSP块。也有例外,但从推理而不是实例化工作流开始。

为此,通过综合流程运行设计并查看利用率。4个DSP块和少量LUTS将通过4点变换的合成来推断。如果它做了其他事情(例如使用大量LUTS和寄存器(,则重新编码以使用DSP块。

每个供应商都有编码风格的建议,目标是映射到DSP块。

这篇Xilinx论文(Xilinx 7系列中使用的DSP块(有些帮助。我之所以这么说,是因为它关注FIR,但许多相同的想法也适用于FFT。https://www.xilinx.com/support/documentation/user_guides/ug479_7Series_DSP48E1.pdf

clk->DSP块的out延迟(时序性能(大约是寄存器的延迟。
通常,如果设计在放置&路线,你可以去实验室(WRT时间:((。一些设计组织建议/要求注册所有模块IO。这可能有些过头了。我发现,对于7系列,如果逻辑级别的数量大约为10或更少,随着零件在开发过程中变得越来越满,设计会随着时间的推移而变化。这是一条经验法则,而不是一条严格的砖墙法则。有了12个逻辑级别,它开始变得边缘化,在15个级别时,它可能是设计中的关键路径。

要确定逻辑级别,请打开时序分析器,右键单击时钟上最差的时序路径,然后对该路径进行"分析"或"显示原理图"。分析显示了逻辑级别的数量。Vivado可以向您展示时序路径的示意图,这样您就可以看到它是否跨越了几个模块,以帮助回答"我需要多少时间来处理这个模块"的问题。

它还取决于时钟速率、设备和速度等级。如果你正在做任何事情>200MHz在>50%利用率的器件,则需要额外的流水线并将组合逻辑保持在2-3级。这也是我的经验和粗略的指导方针,而不是规则或要求。对于400MHz的结构,可能存在具有足够时序裕度并且相对满的FPGA;不过我还没见过。

最新更新