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

Xilinx FPGA实现延时链

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.jsqmd.com/news/269721/

相关文章:

  • 聊聊神奇的连续拉丝机自动控制程序
  • 探索直流有感无刷电机驱动器:功能与特色深度剖析
  • 整车性能仿真:Cruise与Matlab联合的五年经验分享
  • SAP 发布restful if_http_extension~handle_request demo
  • 完整教程:C语言文件操作函数解析
  • 基于C51单片机的智能鱼缸系统探索
  • 小程序毕设项目推荐-基于微信小程序的健康生活助手系统基于django+微信小程序的健康生活系统【附源码+文档,调试定制服务】
  • 昆仑通态直接控制变频器程序及通讯那些事儿
  • 2026年专业的车牌识别一体机,车牌识别系统,车牌识别道闸一体机厂家选型决策指南 - 品牌鉴赏师
  • 【课程设计/毕业设计】基于微信小程序的健康生活服务系统设计与实现基于django+微信小程序的健康生活系统【附源码、数据库、万字文档】
  • 2026最新西南地区衣柜公司top5推荐:服务深耕四川/云南/贵州/等地优质生产厂家解析及选择指南,品质与定制力双优品牌权威榜发布. - 品牌推荐2026
  • 基于C#的Socket通信聊天程序实战分享
  • 2026年评价高的动态人脸识别,人脸识别考勤,人脸识别系统厂家采购参考榜单 - 品牌鉴赏师
  • 电机NVH分析之根原因查找与谐波计算工具探索
  • 2026年可靠的抽屉式配电柜,配电柜,防爆配电柜厂家优质品牌推荐 - 品牌鉴赏师
  • 探索光伏蓄电池离网MATLAB仿真模型
  • MATLAB 实现滚动轴承故障诊断:基于 VMD 的振动信号分析与峭度计算
  • VScode点击无法运行
  • 永磁同步电机(PMSM)矢量控制之旅:从理论到MATLAB仿真
  • FPGA实现延时链
  • 探索基于 S7 - 200 的消防泵稳压控制系统程序
  • 图像金字塔与直方图
  • 2026年靠谱的电力箱变压器,干式箱变压器,地埋式箱变压器厂家专业评测推荐榜 - 品牌鉴赏师
  • APEX实战第9篇:手把手教你集成RAS轻松实现真正的数据安全
  • django基于数据挖掘技术的台风灾害预测系统-计算机毕业设计源码+无LW文档
  • 2026年知名的门禁,门禁管理系统,智能门禁管理系统厂家选购参考榜 - 品牌鉴赏师
  • 行业洪流至,先知AI应变
  • Git 实战高频命令全解析(覆盖99%开发场景)
  • 2026年广州口碑好的小红书笔记优化,小红书效果运营,小红书区域代理公司优质推荐 - 品牌鉴赏师
  • AI结对测试:人类与机器协作的新范式