当前位置: 首页 > news >正文

在vivado中对数据进行延时,时序对齐问题上的理清

        在verilog的ISP处理流程中,在完成第一个模块的过程中,我经常感到困惑,到底是延时了多少个时钟?今日对这几个进行分类理解。

目录

1.输入信号激励源描述

1.1将数据延时[9]个clk

1.2将vtdc与hzdc延时[9]个clk(等价于单bit的数据延时clk)

1.3将vtdc延时2个hzdc长度

2.总结


1.输入信号激励源描述

        分为水平信号r_vtdc与垂直信号r_hzdc,r_data为传输过来的数据,接下来对该信号分类进行延时。

        输入:

 -----------------------------------------------------------------------输入
    always @(posedge pi_pxck)
    begin
        r_vtdc   <= pi_darkvtdc  ;
        r_hzdc   <= pi_darkhzdc  ;
        r_data   <= pi_darkcpa   ;
    end

1.1将数据延时[9]个clk

          分析:对数据做延时时钟个数大小,需要建立相应的数组,每来1个clk,将数组里i存储上的数据传给第i+1个,从而达到延时时钟个数大小的时钟。但往往设置的数组大小会偏大几个,跟其中的非阻塞赋值有关。

-----------------------------------------------------------------数据延时时钟个数    
    integer                             i                                        ;//循环
    reg                 [p_mtgrcpwd - 1 : 0]    shift_reg[0:9]                         ; //缓存数组
    reg                 [p_mtgrcpwd - 1 : 0]    r_declk   = {(p_mtgrcpwd){1'd0}}       ;  //延时时钟个数输出的数据   
    
--------------------------------------------------------------------数组初始化为0    
    initial 
    begin
        for ( i = 0; i < 10; i = i + 1) 
            begin
                shift_reg[i] <= {p_mtgrcpwd{1'b0}};
            end
    end  
    
        
----------------------------------------------------------------数据延时时钟个数
    always@(posedge pi_pxck)
    begin
        begin
            shift_reg[0] <= r_data; // 将新值移入寄存器
        end
        for ( i = 0; i <9; i = i+1) 
        begin
            shift_reg[i+1] <= shift_reg[i];
        end
            r_declk <= shift_reg[9];
    end 

  带来延时的几处地方有:

(1)shift_reg[0] <= r_data; r_data非阻塞赋值传给shift_reg[0]延时1个时钟。

(2) shift_reg[i+1] <= shift_reg[i];延时9个clk

(3)r_declk <= shift_reg[9];延时1个clk

共计延时:1+9+1=11个clk

1.2将vtdc与hzdc延时[9]个clk(等价于单bit的数据延时clk)

同1.1原理相同,只是不需要建立数组,因为是但bit,只是延时高低电平而已。

-----------------------------------------------------------------------------------------------------延时vtdc与hzdc
    reg                                 [9 : 0]                                         r_sfvtdc = 10'd0                        ;
    reg                                 [9 : 0]                                         r_sfhzdc = 10'd0                        ;  
    reg                                                                                 vtdca    = 10'd0                        ;        
    reg                                                                                 hzdca    = 10'd0                        ;  
    
---------------------------------------------------------------------------------------------------延时
    always @(posedge pi_pxck)
    begin
        r_sfvtdc <= {r_sfvtdc[8 : 0], r_vtdc};
        r_sfhzdc <= {r_sfhzdc[8 : 0], r_hzdc};
    end
---------------------------------------------------------------------------------------------------垂直与水平信号输出    
    always @(posedge pi_pxck)
    begin
        vtdca <= r_sfvtdc[9];
        hzdca <= r_sfhzdc[9];
    end        

带来延时的几处地方有:

(1) r_sfvtdc <= {r_sfvtdc[8 : 0], r_vtdc};延时1个clk。

(2) vtdca <= r_sfvtdc[9];延时10个clk。

        共计延时11个clk。

1.3将vtdc延时2个hzdc长度

每次水平信号出现下降沿时,才将vtdc传给延时的数组,r_sfvtdc[x]要与if判断条件下的r_sfhzdc对应的延时相对齐,若用vtdc,会少一行,且延时时钟个数偏差会较大。

--------------------------------------------------------------vtdc延时2行
    reg                    [1 : 0]     r_sfvtdb = 2'd0                           ;        
    reg                                vtdcb    = 1'd0                           ;   
    
    ----------------------------------------------------------vtdc延时2行准备
    always @(posedge pi_pxck)
    begin
        if(r_sfhzdc[1:0] == 2'b10)                      //代表出现下降沿
            r_sfvtdb <= {r_sfvtdb[0],r_sfvtdc[1] };        
    end      
    

--------------------------------------------------------vtdc延时2行
    always @(posedge pi_pxck)
    begin
        vtdcb <= r_sfvtdb[1];       
    end   

(1) r_sfvtdb <= {r_sfvtdb[0],r_sfvtdc[1] };延时2个clk

(2) vtdcb <= r_sfvtdb[1]; 延时2行1个clk

共计2行3个clk。

2.总结

其实也不能单纯的说延时多少个clk。而是以,此时时钟的上升沿为参考标准(此时的数据相对齐的时刻),此刻信号从1变为0,认为是1。此时刻信号从0变成1,认为是0。相对应的分析时序,理清思路。以垂直或水平信号的上升沿/下降沿为基准,看延时了多少个clk。

http://www.dtcms.com/a/13744.html

相关文章:

  • 蓝桥杯 Java B 组之枚举算法(暴力破解)
  • AI赋能创业:ScriptEcho如何助力快速搭建前端应用
  • joint_info.npz 找不到
  • mapbox 从入门到精通 - 目录
  • 基于python sanic框架,使用Nacos进行微服务管理
  • 苹果公司宣布正式开源 Xcode 引擎 Swift Build145
  • MySQL的innoDB引擎
  • Mac之JDK安装
  • Pyqt6 中 QMediaPlayer 音视频播放
  • DeepSeek免费部署到WPS或Office
  • 鸿蒙面试题
  • Kotlin 扩展函数与内联函数
  • python视频爬虫
  • 2025 年 2 月 TIOBE 指数
  • day09_实时类标签/指标
  • 使用Cocos Creator制作“打砖块”小游戏:从零开始的详细教程
  • Aitken 逐次线性插值
  • SQLite 约束
  • 算法学习笔记之贪心算法
  • ASP.NET Core的贫血模型与充血模型
  • PortSwigger——WebSockets vulnerabilities
  • 稀土紫外屏蔽剂:科技护航,守护您的健康与美丽
  • Docker拉不下来镜像问题解决法案
  • SpringMVC请求执行流程源码解析
  • 和鲸科技上线 DeepSeek 系列模型服务,助力数智企业 AI 业务创新!
  • [开源]MaxKb+Ollama 构建RAG私有化知识库
  • 【Linux】操作系统的理解/进程/环境变量/虚拟地址空间
  • android的第一个app项目(java版)
  • 微信小程序网络请求封装
  • DeepSeek从入门到精通:全面掌握AI大模型的核心能力