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

Partitioning combination and sequential logic for reliable and low latency butterfly module for a 4 stage FFT design

我正在构建一个 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

我的问题是:我能否将所有乘法和矢量提取都保留为组合逻辑,并且只在每个阶段注册输出,以便流水线设计。以下是否可以视为 safe/reliable 设计,如果不是,有构建 DSP 模块经验的任何人都可以在我的设计中提出改进意见。

在 FPGA 中,在设计乘法和加法模块时,您希望将这些资源综合为 DSP 块。 DSP 模块具有内置的乘法和累加功能。在显示的代码中有 4 个乘法和 4 个加法,如果将其综合为 4 个 DSP 块,则这是最佳结果。 'pipeline'(寄存器)最终内置于 DSP 块中,因此它们有些自由。

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

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

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

为此,运行 通过综合流程进行设计并查看利用率。最佳 4 个 DSP 块和少量 LUTS 将通过综合推断用于 4 点变换。如果它做了其他事情(例如使用大量 LUTS 和寄存器),那么 re-code 以利用 DSP 块。

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

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

DSP 模块的 clk->out 延迟(时序性能​​)与 reg.
通常,如果设计在布局布线后满足时钟时序约束,您最好去实验室(WRT 时序:))。一些设计组织recommend/require认为所有的模块IO都是注册的。这可能有点矫枉过正。我发现对于 7 系列,如果逻辑级的数量大约为 10 或更少,随着部件在开发过程中变得越来越完整,多年来设计符合时序。这是一个经验法则,而不是严格的 brick-wall 规则。有了 12 级逻辑,它开始变得边缘化,在 15 级时它可能是设计中的关键路径。

要确定逻辑级别,请打开时序分析器,右键单击时钟上最差的时序路径,然后 'analyze' 或 'show schematic' 作为路径。分析显示了逻辑级数。 Vivado 可以向您展示时序路径的示意图,以便您查看它是否跨越多个模块以帮助回答问题 'how much do I need to pipeline this module'.

它还取决于时钟速率、设备和速度等级。如果您在 > 50% 使用率的设备中做任何 > 200MHz 的事情,则需要额外的流水线并将组合逻辑保持在 2-3 级。这也是我的经验和粗略的指导方针,而不是规则或要求。可能有 FPGA 在 400 MHz 时为结构提供了充足的时序余量,并且相对完整;不过我还没看过。