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主板定制专家1 天前
Zynq MPSoC实现半导体真空腔体状态监测|FPGA多传感器时序同步采集方案
fpga开发·zynq·控制器·mpsoc·半导体设备·fpga同步
学习FPGA的电气小兴兴1 天前
基于FPGA的DDS信号发生器设计,生成频率可调的正弦波、三角波、锯齿波和方波
fpga开发·数字信号处理·fpga·vivado·dsp·dds·diy
szxinmai主板定制专家2 天前
Zynq MPSoC半导体高精度运动控制方案|FPGA硬件插补实现亚微米级伺服实时控制
人工智能·嵌入式硬件·fpga开发·zynq·运动控制·ethercat
星夜离尘563 天前
ILA 在线调试:Vivado 抓取片内信号与定位下板问题(附完整实操)
fpga开发
jz_ddk3 天前
[学习] 深入理解 USB 通信与 FPGA 实现:从协议到逻辑设计
学习·fpga开发·xilinx·usb2.0
星夜离尘563 天前
PWM 信号生成与呼吸灯:占空比控制、按键调光与舵机扩展(附完整 Verilog 实操)
fpga开发
zlinear数据采集卡3 天前
ZLinear DABM-D223 通信协议与软件开发全解析:从 USB CDC 到 DDS 波形输出
arm开发·嵌入式硬件·fpga开发·开源
LCMICRO-133108477463 天前
国产长芯微LD3092完全pin-pin替代LT3092,是一款可编程两端电流源
arm开发·单片机·嵌入式硬件·fpga开发·硬件工程·恒流源·lt3092
nuoxin1143 天前
BL-M8812CU3 无线 WiFi 模块-富利威
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发