FPGA设计杂谈之十一:时序报告中时钟的上升沿与下降沿详解

目录

一、前言

二、触发器的边沿触发

三、设计示例

一、前言

查看设计的时序报告中,在任意一条时序路径中,source clock path或 Destination Clock path下的第一行要么为clock xxx rise edge,要么为clock xxx fall edge,如何理解这个内容呢?下面将详细介绍。

二、触发器的边沿触发

FPGA中的触发器在硬件上是既支持上升沿触发,也支持下降沿触发。在实际设计中,通常默认是上升沿触发,从各触发器的原语也可看出是posedge,有时也需要使用到下降沿触发,如DDR的双边沿数据采集。

在SliceL单元中,时钟信号进入到触发器时,会先经过一个CLKMUX的单元,下图中CLK_B即经过了取反处理后输出,CLK则是直接输出。

在具体的verilog代码中,触发的边沿则是体现在always语句块中时钟信号(如示例的clk信号)前面是posedge还是negedge,如果是posedge,在时钟信号进入到触发器q_r_r的时钟引脚上时上升沿触发,否则是下降沿触发

复制代码
  // 数据接收,接收时钟上升沿有效
    always @(posedge clk or negedge rst) begin
        if (!rst) begin
            q_r_r <= 1'b0; // 异步复位
        end else 
            q_r_r <= q_temp0;
    end
    // 数据接收,接收时钟下降沿有效
    always @(negedge clk or negedge rst) begin
        if (!rst) begin
            q_r_f <= 1'b0; // 异步复位
        end else 
            q_r_f <= q_temp0;
    end

三、设计示例

下面以时序路径中源时钟和目的时钟分别为posedge和negedge的场景进行说明,同时增加一个时钟信号经过取反后到达触发器的场景来加深理解,示例代码如下,设计中输出寄存器q_r/f_r/f中第一个r/f表示原时钟的边沿,第二个r/r表示目的时钟的边沿

复制代码
 module clk_rise_fall (
    input wire data, // 输入数据
    input wire clk,  // 时钟信号
    input wire rst,  // 异步复位信号,低电平有效
    output reg q_r_r,     // 触发器输出
    output reg q_r_f,     // 触发器输出
    output reg q_f_r,     // 触发器输出
    output reg q_f_f,     // 触发器输出
    output reg q_inv     // 触发器输出
);
    reg q_temp0,q_temp1; // 中间寄存器,
    // 数据发送,发送时钟上升沿有效
    always @(posedge clk or negedge rst) begin
        if (!rst) 
            q_temp0 <= 1'b0; // 异步复位
         else 
            q_temp0 <= data;
    end
    // 数据接收,接收时钟上升沿有效
    always @(posedge clk or negedge rst) begin
        if (!rst) begin
            q_r_r <= 1'b0; // 异步复位
        end else 
            q_r_r <= q_temp0;
    end
    // 数据接收,接收时钟下降沿有效
    always @(negedge clk or negedge rst) begin
        if (!rst) begin
            q_r_f <= 1'b0; // 异步复位
        end else 
            q_r_f <= q_temp0;
    end
    // 数据发送,发送时钟下降沿有效
    always @(negedge clk or negedge rst) begin
        if (!rst) 
            q_temp1 <= 1'b0; // 异步复位
         else 
            q_temp1 <= data;
    end
    // 数据接收,接收时钟上升沿有效
    always @(posedge clk or negedge rst) begin
        if (!rst) 
            q_f_r <= 1'b0; // 异步复位
         else 
            q_f_r <= q_temp1;
    end
     // 数据接收,接收时钟下降给沿有效
    always @(negedge clk or negedge rst) begin
        if (!rst) 
            q_f_f <= 1'b0; // 异步复位
         else 
            q_f_f <= q_temp1;
    end   
     // 数据接收,接收时钟下降给沿有效,经过取反
    always @(negedge ~clk or negedge rst) begin
        if (!rst) 
            q_inv <= 1'b0; // 异步复位
         else 
            q_inv <= q_temp1;
    end   
endmodule

时序报告结果如下,以Path3为例,q_r_f表示原时钟为上升沿rise,目的时钟边沿为fall,和实际结果符合预期

再看源时钟和目的时钟设计中使用negedge,但目的时钟前存在取反的操作,

时序报告中目的时钟的边沿为rise,并非fall(negedge),这就是由于触发器q_inv的触发时钟为negedge ~clk的原因,只有时钟触发沿为rise,后面经过取反后进入到q_inv的边沿才会为fall

相关推荐
szxinmai主板定制专家5 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
szxinmai主板定制专家17 小时前
AMR 项目落地:机器人控制器硬件定制化需求复盘
arm开发·单片机·fpga开发·系统架构·机器人·am62x
FPGA小迷弟2 天前
FPGA 与卫星:从星载硬件到在轨智能的完整技术解析
fpga开发·架构·fpga·1024程序员节·无线电
NamoAmitabha1282 天前
CPU 内部结构是什么?---deepseek
fpga开发
abc light2 天前
ARM 裸机开发(6)——时钟树与定时器
arm开发·单片机·fpga开发
156082072192 天前
JFMZQ28DR、JFMZQ68DR、RFsoc XCZU47DR、XCZU48DR 信号处理板
fpga开发·信号处理
XMAIPC_Robot2 天前
-40~85℃宽温实测:RK3588 机器人控制器硬件底座,长时间 SLAM 定位稳定性验证
人工智能·fpga开发·机器人·边缘计算·arm+fpga·rk3588+fpga
樱木花道長2 天前
AMD Ross 深度系列 8:FAQ 七问七答(文末附网盘链接)
人工智能·fpga开发
FPGA小迷弟2 天前
FPGA 与无人机:从飞控实时性到智能载荷的硬件加速实践
人工智能·ai·fpga开发·架构·无人机·ai编程
低慢小uav2 天前
(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析
网络协议·tcp/ip·fpga开发