0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA的TDC延时设计方案

C29F_xilinx_inc 来源:赛灵思 作者:赛灵思 2022-02-16 16:21 次阅读

1、参考

https://cas.tudelft.nl/fpga_tdc/TDC_basic.html

2、原理

采用FPGA的CARRY4进位单元,每个CARRY4的COUT连接到下一个CARRY4的CIN,这样级联起来,形成延时链;每个COUT做为抽头输出到触发器,通过本地时钟进行数据采样。假定每个延时链的延时是固定的(最后需要标定),可通过采样值大致估算所测信号与本地时钟上升沿之间的间隔,当得到适当的标定后,可获得较高的精度。

3、当前测试的芯片是XC7K325TFFG900 -2

仿真中的carry4 除第一级外,其他的carry4输出到输入延迟固定都是53ps,但是这是4个进位的延迟时间,只是vivado仿真工具有限制,且需要后仿真。

基于FPGA的TDC延时设计方案

4、源代码

顶层

tdc_top.v

module tdc_top#(
parameter STAGE = 200,
parameter GAP_BITS = 8
)(
input wire sg_start,
input wire clk_sys,
input wire reset ,
output wire cs_gap,
output wire [GAP_BITS-1:0] value_gap
);

wire clk_bufg;

clk_wiz_0 clk_wiz_0_inst(
.clk_out1(clk_bufg),
.clk_in1(clk_sys)
);

wire valid_pre;

wire valid;
wire [STAGE-1:0] value_latch;

wire bin_cs;
wire [GAP_BITS-1:0] bin;

wire sg_bufr;

BUFR #(
.BUFR_DIVIDE("BYPASS"), // Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8"
.SIM_DEVICE("7SERIES") // Must be set to "7SERIES"
)
BUFR_INST (
.O(sg_bufr), // 1-bit output: Clock output port
.CE(1'b1), // 1-bit input: Active high, clock enable (Divided modes only)
.CLR(1'b0), // 1-bit input: Active high, asynchronous clear (Divided modes only)
.I(sg_start) // 1-bit input: Clock buffer input driven by an IBUF, MMCM or local interconnect
);

FDCE #(
.INIT(1'b0) // Initial value of register (1'b0 or 1'b1)
)
FDCE_INST2 (
.Q(valid_pre), // 1-bit Data output
.C(clk_bufg), // 1-bit Clock input
.CE(1'b1), // 1-bit Clock enable input
.CLR(1'b0), // 1-bit Asynchronous clear input
.D(sg_bufr) // 1-bit Data input
);

FDCE #(
.INIT(1'b0) // Initial value of register (1'b0 or 1'b1)
)
FDCE_INST3 (
.Q(valid), // 1-bit Data output
.C(clk_bufg), // 1-bit Clock input
.CE(1'b1), // 1-bit Clock enable input
.CLR(1'b0), // 1-bit Asynchronous clear input
.D(valid_pre) // 1-bit Data input
);

line_tdc#(
.STAGE (STAGE)

) line_tdc_inst(
.sg_start (sg_bufr),
.clk_bufg (clk_bufg),
.reset (reset),
.value_latch (value_latch)
);

latch2bin#(
.GAP_BITS (GAP_BITS)
) latch2bin_inst(
.clk_bufg (clk_bufg),
.reset (reset),
.valid (valid),
.value_latch (value_latch),
.bin_cs (cs_gap),
.bin (value_gap)
);

延迟线代码

line_tdc.v

module line_tdc#(
parameter STAGE = 256
)(
input wire sg_start,
input wire clk_bufg,
input wire reset,
output wire [STAGE - 1:0] value_latch
);

wire [STAGE - 1:0] dat_reg0;
wire [STAGE - 1:0] dat_reg1;

genvar i;
generate
for (i = 0; i if(i == 0) begin :carry4_first
CARRY4 CARRY4_INST (
.CO (dat_reg0[3:0]), // 4-bit carry out
.O (), // 4-bit carry chain XOR data out
.CI (1'b0), // 1-bit carry cascade input
.CYINIT (sg_start), // 1-bit carry initialization
.DI (4'b0000), // 4-bit carry-MUX data in
.S (4'b1111) // 4-bit carry-MUX select input
);
end
if (i > 0) begin :carry4_others
CARRY4 CARRY4_OTHERS (
.CO (dat_reg0[4*(i+1)-1:4*i]), // 4-bit carry out
.O (), // 4-bit carry chain XOR data out
.CI (dat_reg0[4*i-1]), // 1-bit carry cascade input
.CYINIT (1'b0), // 1-bit carry initialization
.DI (4'b0000), // 4-bit carry-MUX data in
.S (4'b1111) // 4-bit carry-MUX select input
);
end
end
endgenerate

genvar j;
generate
for (j = 0; j FDRE #(
.INIT (1'b0) // Initial value of register (1'b0 or 1'b1)
) FDRE_INST0 (
.Q (dat_reg1[j]), // 1-bit Data output
.C (clk_bufg), // 1-bit Clock input
.CE (1'b1), // 1-bit Clock enable input
.R (reset), // 1-bit Synchronous reset input
.D (dat_reg0[j]) // 1-bit Data input
);

FDRE #(
.INIT (1'b0) // Initial value of register (1'b0 or 1'b1)
) FDRE_INST1 (
.Q (value_latch[j]), // 1-bit Data output
.C (clk_bufg), // 1-bit Clock input
.CE (1'b1), // 1-bit Clock enable input
.R (reset), // 1-bit Synchronous reset input
.D (dat_reg1[j]) // 1-bit Data input
);
end
endgenerate

endmodule

延迟线数字码转换二进制输出
latch2bin.v

module latch2bin#(
parameter GAP_BITS = 8

)(
input wire clk_bufg,
input wire reset,
input wire valid,
input wire [(2**GAP_BITS)-1:0] value_latch,
output reg bin_cs,
output reg [GAP_BITS-1:0] bin
);

(* *)reg [(2**GAP_BITS)-2:0] decoding [0:GAP_BITS-4];

(* *)reg [GAP_BITS:0] binary [0:GAP_BITS-3];

(* *)reg [GAP_BITS-2:0] data_valid;

(* *)reg [15:0] decode_final;

(* *)reg [GAP_BITS-1:0] bin_final;

(* *)reg [3:0] ones;

(* *)reg [GAP_BITS:0] binary_r;

always@(*) begin
decoding[0] = value_latch[(2**GAP_BITS)-2:0];
data_valid[0] end

genvar i;
generate
for (i = 0; i always@(posedge clk_bufg) begin
if(reset) begin
decoding[i+1] binary[i+1] data_valid[i+1] end
else begin
binary[i+1][GAP_BITS:GAP_BITS-1-i] data_valid[i+1] if(decoding[i][((2**(GAP_BITS-i))-2)/2]==1'b1) begin
decoding[i+1][((2**(GAP_BITS-i))-2)/2-1:0] end
else begin
decoding[i+1][((2**(GAP_BITS-i))-2)/2-1:0] end
end
end
end
endgenerate

always@(posedge clk_bufg) begin
if(reset) begin
ones data_valid[GAP_BITS-3] binary[GAP_BITS-3] bin_final end
else begin
ones decoding[GAP_BITS-4][0] + decoding[GAP_BITS-4][1] + decoding[GAP_BITS-4][2] + decoding[GAP_BITS-4][3] +
decoding[GAP_BITS-4][4] + decoding[GAP_BITS-4][5] + decoding[GAP_BITS-4][6] + decoding[GAP_BITS-4][7] +
decoding[GAP_BITS-4][8] + decoding[GAP_BITS-4][9] + decoding[GAP_BITS-4][10] + decoding[GAP_BITS-4][11] +
decoding[GAP_BITS-4][12] + decoding[GAP_BITS-4][13] + decoding[GAP_BITS-4][14] + decoding[GAP_BITS-4][15];

data_valid[GAP_BITS-3] binary[GAP_BITS-3]

data_valid[GAP_BITS-2] bin_final end
end

always@(posedge clk_bufg) begin
if(reset) begin
bin_cs bin end
else begin
if(data_valid[GAP_BITS-2] == 1'b1) begin
bin_cs bin end
else begin
bin_cs bin end
end
end

endmodule

测试

tb_tdc_top.v

module tb_tdc_top;

reg clk_sys;
reg sg_start;
reg reset;
wire [7:0] value_gap;

tdc_top tdc_top_inst(
.sg_start (sg_start),
.clk_sys (clk_sys),
.reset (reset),
.value_gap (value_gap)
);

initial begin
clk_sys = 0;
sg_start = 0;
reset = 1;
#1000;
reset = 0;
#116;
sg_start = 1;
#3;
sg_start = 0;
end

always #(5) clk_sys = ~clk_sys;

endmodule

时钟模块100M输入,400M输出,并经过BUFG资源。

基于FPGA的TDC延时设计方案

由于每个carry4的延迟时间是53ps,每个时钟周期是2.5ns,最多需要50个carry4级联即可。

5、约束

手册上有写,对于carry4的第一级约束后,下一级的carry4会以最邻近的摆放。tdc.xdc

set_property PACKAGE_PIN AD21 [get_ports reset]
set_property PACKAGE_PIN AE23 [get_ports sg_start]
set_property PACKAGE_PIN AD23 [get_ports clk_sys]
set_property IOSTANDARD LVCMOS33 [get_ports {value_gap[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {value_gap[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {value_gap[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {value_gap[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {value_gap[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {value_gap[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {value_gap[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {value_gap[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports cs_gap]
set_property IOSTANDARD LVCMOS33 [get_ports reset]
set_property IOSTANDARD LVCMOS33 [get_ports sg_start]
set_property IOSTANDARD LVCMOS33 [get_ports clk_sys]

set_property LOC SLICE_X0Y0 [get_cells line_tdc_inst/genblk1[0].carry4_first.CARRY4_INST]

6、后仿真测试结果

基于FPGA的TDC延时设计方案

基于FPGA的TDC延时设计方案
基于FPGA的TDC延时设计方案
基于FPGA的TDC延时设计方案
基于FPGA的TDC延时设计方案
基于FPGA的TDC延时设计方案
7、以上可以对sg_start和clk_bufg两个信号的间隔进行大致估算,通过计算大致可计算出第一级carry4输入的延时。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1629

    文章

    21735

    浏览量

    603188
  • 触发器
    +关注

    关注

    14

    文章

    2000

    浏览量

    61143
  • TDC
    TDC
    +关注

    关注

    0

    文章

    38

    浏览量

    13777
收藏 人收藏

    评论

    相关推荐

    TDC1000能否用于多普勒测流?

    你好,我想问下TDC1000能否用于多普勒测流?就是通过STOP的频率计算出回波的频率?根据发送频率和STOP频率来计算频差,使用TDC1000的方案能满足这个技术要求吗?
    发表于 12-25 07:19

    TDC1000是否对超声换能器有要求?

    目前在做关于液位和流速测量的应用,使用了TI 的TDC1000和TDC7200,遇到以下几个问题暂时无法解决(使用MSP430FR4133) 1.TDC1000是否对超声换能器有要求? 2.
    发表于 12-11 07:36

    求助,关于TDC1000和TDC7200测试温度遇到的疑问求解

    你好,最近用TI开发板和软件,TDC1000和TDC7200测试温度,通过 示波器和软件读出的寄存器比对,发现寄存器中count 3 的数据移动到count4,count4移动到下面的寄存器。请
    发表于 12-10 06:03

    TDC1000-TDC7200EVM外接START和STOP信号时如何不受TDC1000的信号影响?

    TDC1000-TDC7200EVM外接START和STOP信号时,如何不受TDC1000的信号影响?
    发表于 12-09 07:13

    使用TDC去测量pwm两个波形相位延时时间,如何去设计TDC7201的外围电路?

    您好,当我使用TDC去测量pwm两个波形相位延时时间,如何去设计TDC7201的外围电路。
    发表于 12-03 08:07

    TDC芯片数据手册及官方参考例程

    TDC芯片是一种用于精密测时的专用芯片,这类芯片的测时精度通常可以达到ns级别,在激光测距、超声波探测等ToF领域广泛应用。 下面这个资料包含了市面上常用TDC芯片的数据手册、官方例程和部分应用电
    发表于 11-06 23:06

    FPGA延时Verilog HDL实现

    可以在任意时刻启动,可以重复启动,延时时长可调,单位可切换(ms/us),在50MHz时钟下的延时范围是1ms-85899ms/1us-85899us。
    的头像 发表于 11-05 11:26 253次阅读

    LM4890采用差分设计方案,为什么没有声音?怎么解决?

    1、LM4890采用差分设计方案(如下图),为什么没有声音?怎么解决? 2、采用差分方案设计的功放能用非差分输出或普通音频输出?
    发表于 11-05 06:33

    MS1205N——激光测距用高精度时间测量(TDC)电路

    MS1205N 是一款高精度时间测量(TDC)电路,具有四通道、多脉冲的采样能力、高速 SPI 通讯、多种测量模式。提供方案和FAE,欢迎了解
    的头像 发表于 10-21 17:58 331次阅读
    MS1205N——激光测距用高精度时间测量(<b class='flag-5'>TDC</b>)电路

    基于FPGA的CCD工业相机系统设计

    基于FPGA的CCD工业相机系统设计是一个综合性的项目,它结合了硬件电路设计、FPGA编程以及图像处理技术。以下是一个详细的系统设计方案,包括设计概述、硬件架构、FPGA编程要点以及部
    的头像 发表于 07-17 11:24 1171次阅读

    UPS系统设计方案解读

    UPS的应用场景日趋多样化,每个场景都有其独特的需求,对应不同的方案。UPS系统方案指南继续上新,本文将聚焦UPS设计方案展开讲述。
    的头像 发表于 06-26 10:06 784次阅读
    UPS系统<b class='flag-5'>设计方案</b>解读

    基于FPGA的SPI Flash控制器的设计方案

    Flash控制器的设计方案,并用VHDL实现。编写的SPI Flash控制器IP核在Modelsim 6.5g上进行了功能仿真,在FPGA开发板上进行了测试验证,可作为功能模块应用于SOC芯片
    发表于 06-03 10:13

    有没有使用FPGA控制tdc-gpx2芯片LVDS输入输出功能的朋友?

    有無大佬用过TDC_GPX2这款芯片的LVDS输入输出功能,有偿求助
    发表于 04-23 22:56

    FPGA时钟内部设计方案

    时钟设计方案 在复杂的FPGA设计中,设计时钟方案是一项具有挑战性的任务。设计者需要很好地掌握目标器件所能提供的时钟资源及它们的限制,需要了解不同设计技术之间的权衡,并且需要很好地掌握一系列
    发表于 01-22 09:30 630次阅读
    <b class='flag-5'>FPGA</b>时钟内部<b class='flag-5'>设计方案</b>

    MCU如何配置固定TDC

    如附图所示,在发送和接收消息期间,控制器开始发送比特的时间与从接收终端接收到位置的时间之间存在延迟,即发送节点的延迟。 数据字段中 CANFD 的采样点需要采用发送节点延迟补偿机制(TDC 机制
    发表于 01-22 07:29