Xilinx FPGA实现延时链

news/2026/1/19 22:04:41/文章来源:https://www.cnblogs.com/WenGalois123/p/19005625

Xilinx FPGA实现延时链

  之前有做一个输出100ps左右的延时链,当时找到一篇国外的论文,2015年的文章了。链接:《High-Resolution_Synthesizable_Digitally-Controlled_Delay_Lines》,根据论文的内容,要使输出的延时能够更加的准确,这里输出端保持不变,输入端走的是时钟的走线,这样做到了尽可能保证走线的时间一致,只跟原语CARRY4的单元延时有关。

  话不多说,直接上代码,由于没有更精确的设备进行测量延时,所以代码仅供参考。

  1 module delay_chain
  2 #(
  3     parameter                BUF_TYPE        = "BUFG"          ,
  4     parameter                RESOLUTION      = "COARSE"        ,
  5     parameter                CARRY4_STAGE    = 16            
  6 )
  7 (
  8     input                    i_signal                          ,
  9     input    [9:0]           i_carry_num                       ,
 10     output                   o_signal                        
 11 );
 12 
 13     wire                            w_signal_buf               ;
 14     wire    [4*CARRY4_STAGE-1:0]    w_stage_buf                ;
 15 
 16 
 17     generate
 18         if(BUF_TYPE == "BUFR")
 19         begin:BUF1
 20             BUFR
 21             #(
 22                 .BUFR_DIVIDE           ( "BYPASS"                     ),
 23                 .SIM_DEVICE            ( "7SERIES"                    )
 24             )
 25             BUFR_inst
 26             (
 27                 .O                     ( w_signal_buf                 ),
 28                 .CE                    ( 1'b1                         ),
 29                 .CLR                   ( 1'b0                         ),
 30                 .I                     ( i_signal                     )
 31             );
 32         end
 33         else if(BUF_TYPE == "BUFH")
 34         begin:BUF2
 35             BUFH BUFH_inst
 36             (
 37                 .O                     ( w_signal_buf                  ),
 38                 .I                     ( i_signal                      )
 39             );
 40         end
 41         else
 42         begin:BUF3
 43             BUFG BUFG_inst
 44             (
 45                 .O                     ( w_signal_buf                  ),
 46                 .I                     ( i_signal                      )
 47             );
 48         end
 49     endgenerate
 50 
 51 
 52     integer           i;
 53     genvar            n;
 54     
 55     generate
 56         if(RESOLUTION == "COARSE")
 57         begin
 58             reg        [CARRY4_STAGE-1:0]        r_carry_sel;
 59             wire       [CARRY4_STAGE-1:0]        w_carry_sel;
 60             
 61             always@(*)
 62             begin
 63                 r_carry_sel = 'd0;
 64                 for(i = 0; i <= CARRY4_STAGE - 1; i = i + 1)
 65                     if(i_carry_num == i)
 66                         r_carry_sel[CARRY4_STAGE-1-i] = 1'b1;
 67             end
 68             assign w_carry_sel = ~r_carry_sel;
 69             
 70             for(n = 0; n <= CARRY4_STAGE - 1; n = n + 1)
 71             begin
 72                 if(n == 0)
 73                 begin:carry4_first
 74                     CARRY4 CARRY4_inst
 75                     (
 76                         .CO            ( w_stage_buf[3:0]            ),
 77                         .O             (                             ),
 78                         .CI            ( 1'b0                        ),
 79                         .CYINIT        ( 1'b0                        ),
 80                         .DI            ( {3'b000,w_signal_buf}       ),
 81                         .S             ( {3'b111,w_carry_sel[0]}     )
 82                     );
 83                 end
 84                 else
 85                 begin:carry4_X
 86                     CARRY4 CARRY4_inst
 87                     (
 88                         .CO            ( w_stage_buf[4*(n+1)-1:4*n]  ),
 89                         .O             (                             ),
 90                         .CI            ( w_stage_buf[4*n-1]          ),
 91                         .CYINIT        ( 1'b0                        ),
 92                         .DI            ( {3'b000,w_signal_buf}       ),
 93                         .S             ( {3'b111,w_carry_sel[n]}     )
 94                     );
 95                 end
 96             end
 97         end
 98         else
 99         begin
100             reg        [4*CARRY4_STAGE-1:0]        r_carry_sel;
101             wire       [4*CARRY4_STAGE-1:0]        w_carry_sel;
102             
103             always@(*)
104             begin
105                 r_carry_sel = 'd0;
106                 for(i = 0; i <= 4*CARRY4_STAGE - 1; i = i + 1)
107                     if(i_carry_num == i)
108                         r_carry_sel[4*CARRY4_STAGE-1-i] = 1'b1;
109             end
110             assign w_carry_sel = ~r_carry_sel;
111             
112             for(n = 0; n <= CARRY4_STAGE - 1; n = n + 1)
113             begin
114                 if(n == 0)
115                 begin:carry4_first
116                     CARRY4 CARRY4_inst
117                     (
118                         .CO                ( w_stage_buf[3:0]            ),
119                         .O                 (                             ),
120                         .CI                ( 1'b0                        ),
121                         .CYINIT            ( 1'b0                        ),
122                         .DI                ( {4{w_signal_buf}}           ),
123                         .S                 ( w_carry_sel[3:0]            )
124                     );
125                 end
126                 else
127                 begin:carry4_X
128                     CARRY4 CARRY4_inst
129                     (
130                         .CO                ( w_stage_buf[4*(n+1)-1:4*n]  ),
131                         .O                 (                             ),
132                         .CI                ( w_stage_buf[4*n-1]          ),
133                         .CYINIT            ( 1'b0                        ),
134                         .DI                ( {4{w_signal_buf}}           ),
135                         .S                 ( w_carry_sel[4*(n+1)-1:4*n]  )
136                     );
137                 end
138             end
139         end
140     endgenerate
141     
142     assign o_signal = w_stage_buf[4*CARRY4_STAGE - 1];
143     
144 endmodule

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索直流有感无刷电机驱动器:功能与特色深度剖析

电机控制资料 注&#xff1a;本驱动器适合于直流有感无刷电机 功能特点 支持电压9V&#xff5e;36V&#xff0c;额定输出电流5A 支持电位器、开关、0~3.3V模拟信号范围、0/3.3/5/24V逻辑电平、PWM/频率/脉冲信号、RS485多种输入信号 支持占空比调速(调压)、速度闭环控制(稳速)、…

聊聊神奇的连续拉丝机自动控制程序

连续拉丝机程序&#xff0c;拉丝机自动控制程序&#xff0c;解决了大部分拉丝机经常出现的拉力不均匀&#xff0c;电机转速不稳等问题&#xff0c;运行稳定&#xff0c;安全可靠。在工业生产领域&#xff0c;拉丝机那可是相当重要的设备。但以前&#xff0c;不少拉丝机老是被拉…

整车性能仿真:Cruise与Matlab联合的五年经验分享

本人从事整车性能仿真岗位已经五年&#xff0c;精通基于Cruise软件与Matlab软件联合仿真整车性能&#xff0c;长期兼职相关业务&#xff0c;有需要的联系我&#xff0c;保证按照客户需求搭建相应模型&#xff0c;同时免费提供相应培训&#xff0c;让你深刻掌握模型搭建流程及仿…

SAP 发布restful if_http_extension~handle_request demo

DATA : lv_method TYPE string.lv_method = server->request->get_header_field( ~request_method ).DATA(lv_methond2) = server->request->get_method( ).DATA:lv_content_type TYPE string.DATA:lv_j…

基于C51单片机的智能鱼缸系统探索

基于C51单片机智能鱼缸系统 本程序功能齐全、注释祥明&#xff0c;提供仿真图源程序代码&#xff0c;有能力者可以自行升级改造。 现拥有功能如下: 1:时钟显示 2:自定义时间间隔投喂食物 3:自定义温度上下限 4:自定义鱼缸高度 5:温度过低加热 6:温度过高警报 7:鱼缸水位实时检测…

完整教程:C语言文件操作函数解析

完整教程:C语言文件操作函数解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

小程序毕设项目推荐-基于微信小程序的健康生活助手系统基于django+微信小程序的健康生活系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026年专业的车牌识别一体机,车牌识别系统,车牌识别道闸一体机厂家选型决策指南 - 品牌鉴赏师

引言在 2026 年,随着智慧城市建设的加速推进,车牌识别一体机、车牌识别系统以及车牌识别道闸一体机在智慧停车、交通管理等领域的应用愈发广泛。为了帮助用户更科学、客观地选择专业的厂家,本选型决策指南应运而生。…

昆仑通态直接控制变频器程序及通讯那些事儿

昆仑通态直接控制变频器程序及通讯。在工业自动化领域&#xff0c;昆仑通态人机界面与变频器的协同工作是实现精准控制与高效生产的关键环节。今天就来唠唠昆仑通态如何直接控制变频器程序及通讯。 一、通讯基础准备 昆仑通态与变频器通讯&#xff0c;首先要明确通讯协议。常见…

【课程设计/毕业设计】基于微信小程序的健康生活服务系统设计与实现基于django+微信小程序的健康生活系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026最新西南地区衣柜公司top5推荐:服务深耕四川/云南/贵州/等地优质生产厂家解析及选择指南,品质与定制力双优品牌权威榜发布. - 品牌推荐2026

随着消费升级与居住理念的迭代,中高端家装市场对定制木制品的需求呈现爆发式增长,衣柜作为全屋收纳系统的核心组件,其材质工艺、设计美学与空间适配能力成为消费者关注焦点。据中国木材与木制品流通协会2025年度报告…

基于C#的Socket通信聊天程序实战分享

socket通信聊天程序&#xff0c;计算机通信成品源码&#xff0c;聊天程序demo,C#编写&#xff0c;含服务器和客户端&#xff0c;使用socket通信&#xff0c;多线程&#xff0c;服务器可以支持多连接&#xff0c;多客户端登录&#xff0c;登录的客户端可以给在线的其它账号发送信…

2026年评价高的动态人脸识别,人脸识别考勤,人脸识别系统厂家采购参考榜单 - 品牌鉴赏师

引言在科技飞速发展的当下,动态人脸识别、人脸识别考勤以及人脸识别系统在众多领域得到了广泛应用,其市场需求日益增长。为了帮助采购方在众多的人脸识别厂家中做出更优选择,我们依据相关测评数据和多方验证结果,为…

电机NVH分析之根原因查找与谐波计算工具探索

电机NVH分析&#xff0c;根原因查找。 定子,转子谐波次数与电磁力波次数对应关系表。 excel格式&#xff0c;输入极槽等参数可以自动计算。在电机领域&#xff0c;NVH&#xff08;Noise, Vibration, Harshness&#xff0c;噪声、振动与声振粗糙度&#xff09;分析至关重要&…

2026年可靠的抽屉式配电柜,配电柜,防爆配电柜厂家优质品牌推荐 - 品牌鉴赏师

引言在当今电力行业蓬勃发展的时代,配电柜作为电力系统中不可或缺的关键设备,其质量和性能直接关系到电力供应的稳定性与安全性。为了给广大用户提供一份客观、公正、全面的配电柜厂家推荐榜单,我们依据一系列科学的…

探索光伏蓄电池离网MATLAB仿真模型

光伏蓄电池离网MATLAB仿真模型 蓄电池具有储能作用(削峰填谷) 实现光伏和蓄电池的能量双向流动 维持输出电压稳定 该模型的原理说明文档 有boost结构的MPPT和BUCK型的MPPT&#xff0c;通常是boost型的mppt电路。在当今追求可持续能源的时代&#xff0c;光伏蓄电池离网系统凭借…

MATLAB 实现滚动轴承故障诊断:基于 VMD 的振动信号分析与峭度计算

MATLAB滚动轴承故障诊断:变分模态分解(VMD)分解振动信号&#xff0c;各个本征模态函数峭度的计算在滚动轴承故障诊断领域&#xff0c;准确提取故障特征是关键。变分模态分解&#xff08;VMD&#xff09;是一种强大的信号处理方法&#xff0c;它能将复杂的振动信号分解为多个本征…

VScode点击无法运行

2026年的第一篇,记录一下今天VScode无法打开的情况:点击无反应,没有任何提示,啥也没有,相当于没点。我还以为我电脑出了问题,重启了,依旧如此。点击后,打开任务管理器,vscode确实没有运行。 在网上找了一些方…

永磁同步电机(PMSM)矢量控制之旅:从理论到MATLAB仿真

永磁同步电机(PMSM)矢量控制&#xff0c;坐标变换到d-q轴后&#xff0c;采用SVPWM调制算法&#xff0c;进行速度电流双闭环控制&#xff0c;控制算法为PID&#xff0c;仿真结果如图所示。 (默认发MATLAB R2018b版本)永磁同步电机&#xff08;PMSM&#xff09;因其高效、功率密度…

FPGA实现延时链

FPGA实现延时链之前有做一个输出100ps左右的延时链,当时找到一篇国外的论文,2015年的文章了。链接:《High-Resolution_Synthesizable_Digitally-Controlled_Delay_Lines》,根据论文的内容,要使输出的延时能够更加…