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

相关推荐
坏孩子的诺亚方舟13 天前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
FPGA小徐13 天前
入门 CNN 结构全解析|从流程图理论到 FPGA Verilog 硬件实现(含习题带讲解)
fpga开发
FPGA小徐13 天前
FPGA 数字信号处理:并行 FIR 与串行滤波器设计原理、对比与完整 Verilog 实现
fpga开发
Saniffer_SH14 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡14 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安14 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐15 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯15 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客15 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA15 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发