咻咔咻咔咻 2024-07-02 21:01 采纳率: 0%
浏览 111

FPGA TDC设计中的CARRY4单元延时问题:每个抽头的延时不如预期,如何解决?

在基于FPGA的TDC中,使用抽头延迟线(TDL)构成进位链,使用CLB中的carry4作为进位单元
TDL代码:

verilog
(* keep_hierarchy = "TRUE" *) 
module TDL
    #(
    parameter   NUM_STAGES  =   264
    )(
    //Inputs
    iRST,
    iHIT,
    iSTORE_STOP,
    
    //Outputs
    oTHERMOMETER_VALUE,
    oFED
    );
    
    //Singal type definition
    //Inputs
    input       iRST;
    input       iHIT;
    input       iSTORE_STOP;
    
    //Outputs
    output  [NUM_STAGES - 1 : 0]   oTHERMOMETER_VALUE;
    output                         oFED;
    
   
    // Define interenal signals
    (* dont_touch = "TRUE" *) wire    [NUM_STAGES - 1 : 0]    wFIS_VALUE;
    (* dont_touch = "TRUE" *) wire                            STORE_STOP_BUFG;
    /*(* dont_touch = "TRUE" *)*/ wire                            wFED;
    
    wire    [NUM_STAGES - 1 : 0]    rVALUE;                           
    BUFG bufg_inst (
   .I(iSTORE_STOP),          // 输入时钟信号
   .O(STORE_STOP_BUFG)      // 输出缓冲后的时钟信号
);

    //FINE TDC DELAY CHAIN
    genvar i;
    generate
    for(i = 0 ; i <= (NUM_STAGES / 4) - 1; i = i + 1) 
    begin   :   generate_block
        if(i == 0)begin :   CARRY4_first
        (* dont_touch = "TRUE" *) 
        CARRY4  CARRY4_first_inst(
            .CO         (wFIS_VALUE[3 : 0]),       // 4-bit carry out
            .O          (),   
            .CI         (1'b0),                     // 1-bit carry cascade input
            .CYINIT     (iHIT),                     // 1-bit carry initialization
            .DI         (4'b0000),                  // 4-bit carry-MUX data in
            .S          (4'b1111)                   // 4-bit carry-MUX select input
        );
        end
        else 
        begin  :   CARRY4_others
        (* dont_touch = "TRUE" *) 
        CARRY4  CARRY4_others_inst(
            .CO         (wFIS_VALUE[4 * (i + 1) - 1 : 4 * i]),
            .O          (),
            .CI         (wFIS_VALUE[4 * i - 1]),
            .CYINIT     (1'b0),                //0表示加法,1表示减法
            .DI         (4'b0000),
            .S          (4'b1111)
        );
        end         
    end
    endgenerate
    
    //FIRST STAGE D FLIP FLOPS TO SAMPLE DELAY CHAIN
    genvar j;
    generate
        for(j = 0 ; j <= NUM_STAGES - 1 ; j = j + 1)
        begin
           (* dont_touch = "TRUE" *) 
           FDCE #(
           .INIT(1'b0)
           )  rTDC_VALUE(
            .Q          (rVALUE[j]),
            .C          (STORE_STOP_BUFG),
            .CE         (1'b1),
            .CLR        (iRST),
            .D          (wFIS_VALUE[j])
           );
          
        end
    endgenerate
    
    assign  wFED                    =   wFIS_VALUE[0];
    assign  oFED                    =   wFED;
    assign  oTHERMOMETER_VALUE      =   rVALUE;

endmodule

run post-Implementation Timing Simulation后carry4进位链的输出波形如下图

img

由触发器读出的数据如下

img

img


可以看出每个carry4单元前三个抽头没有延时,仅在第四个抽头以及传输到下一级carry4时波形才会发生变化。理论上是每一个抽头上波形都会往后延迟一定的时间。

检查时钟传输时间,如下图

img

时钟到达carry4的四个输出时间相同

各位友友这是哪里出现了问题啊,应该怎么解决呢,感谢

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-02 21:01
    关注

    引自免费微信小程序:皆我百晓生

    从你给出的描述和代码来看,你在FPGA的TDC设计中遇到了carry4进位单元的延时问题。每个抽头的延时不如预期,这可能是由于多种原因造成的。以下是一些可能的问题及其解决方案:

    1. 时钟偏斜(Clock Skew):在FPGA中,时钟信号到达不同单元的时间可能会有细微的偏差。这可能是导致你观察到的延时问题的原因。你可以尝试使用全局时钟网络来减少时钟偏斜的影响。
    2. 布局和布线(Placement and Routing):在FPGA中,布局和布线对性能有很大的影响。确保你的设计布局得当,并尽量减少布线的长度和复杂性。你可能需要重新布局和布线你的设计以优化性能。
    3. 时序约束(Timing Constraints):确保你的设计满足时序约束。如果设计不满足时序约束,可能会导致意外的延时问题。你可以检查你的时序分析报告(Timing Report)以了解是否存在时序问题。
    4. Carry4单元的配置:检查你的Carry4单元的配置是否正确。确保你正确设置了所有的输入和输出信号,并且配置参数符合你的设计要求。
    5. 仿真验证:使用更精确的仿真工具进行仿真验证。有时候,仿真结果可能与实际硬件的结果存在偏差。你可以尝试使用更高级别的仿真工具进行验证。
    6. 参数调整:检查你的模块参数设置,特别是与延时相关的参数。有时候,通过调整这些参数可以解决延时问题。
    7. 资源竞争(Resource Contention):确保你的设计中没有资源竞争的问题。资源竞争可能导致意外的延时和性能下降。

    为了更准确地诊断问题,你可以尝试以下方法:

    • 使用逻辑分析仪(Logic Analyzer)或其他调试工具捕获和分析FPGA内部信号。
    • 使用不同的仿真工具进行仿真,比较结果以验证问题的存在性。
    • 检查时序分析报告以查找任何时序违规的地方。

    希望这些建议能帮助你解决问题。如果你有任何其他疑问或需要进一步的信息,请告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月2日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。