SeruTek TDC IP Core 简介

简介

提供双通道TDC IP核供免费测试评估。该IP核可用于Artix系列以及Zynq系列中基于Artix的型号(7020及以下)。典型测时精度优于25ps。IP核基于加密网表封装,采用标准 AXI-lite、AXI-Stream接口,可方便地在Vivado 可视化设计环境中使用。

该IP核是全功能IP核,hit信号频率高达70MHz,IP核内集成FIFO可供每通道最大速率测量2048个测试点(连续测量速率受限于IP核外的数据读出速率,通过使用DMA等技术可以轻易达到30Msa/s的连续测量速度),测时量程为70年。

IP Core 功能

双路时间戳
TDC IP 采用时间戳的方式记录事件发生的时刻。输入的脉冲信号的上升沿代表事件的触发信号,触发信号使得该路TDC 产生一个对应的时间戳。对同一路TDC,将两个事件对应的时间戳的值相减就能得到两个事件之间的时差。两个通路之间的测量时差保持恒定(该值在外部校准时扣除)。因此,也可以采用多路TDC,对不同来源的事件打上时间戳,作差后得到事件的时差。

IP实现了2路TDC功能,一路可接收start信号,另一路可接收stop信号。IP core输出 start 信号和stop 信号的时间戳,可计算得到两者之间的时差。

自动片上校准
TDC IP 具有片上自校准功能,由IP核内部产生校准所需的连续触发信号,采用码密度的方式,校准每个延迟单元的时延。得益于TDC IP Core 的高速连续测量能力,能够采用高速校准信号,在数个毫秒内完成一次自校准。

在温度变化范围较大的使用环境下,自校准功能能够极大的降低TDC IP的INL积分误差,从而保证TDC的测量准确度。用户只需根据片上温度传感器(XADC)获知温度变化,当超过一定阈值后,触发自校准功能即可。

基于AXI-Lite的配置控制接口
TDC IP core具有三个标准AXI-lite配置控制接口,可以非常方便的与Zynq 或 Microblaze连接,控制、配置功能都可以在SDK中以函数形式调用。

输出测量数据
测量得到的时间戳通过标准AXI-Stream接口输出,Data 宽度为96bit。可通过多种AXIS-FIFO 接口接入Zynq的AXI-GP 接口,示例程序中给出了参考实现。在SDK程序中提供了译码函数,能够打印时间戳以及时间戳之间的差值。

IP 接口

在这里插入图片描述
脉冲(事件)输入
hit0、hit1 分别为两路TDC的脉冲输入。

配置接口
CLKCMD_AXI、TDC_CONF_0, TDC_CONF_1是三个配置接口,为标准的AXI-lite格式,并且有对应的clock,及aresetn接口,与系统的AXI总线连接。

配置接口
clk_in1_0是时钟输入,预设为50MHz的单端输入(可根据需求修改为其它格式)。

内部复位信号
Arest: (应为arestn, 低电平触发)。
数据输出接口
M_AXIS_0, M_AXIS_1分别为时间戳数据的输出接口。其对应的时钟信号分别为fifo_maxi_aclk_0、fifo_maxi_aclk_1。

时钟锁定指示
LOCKED是内部时钟锁定指示功能,可接入LED,也可接入GPIO,读取当前时钟的锁定状态。

IP资源占用

在这里插入图片描述

在这里插入图片描述

基于黑金Zynq AX7020开发板的示例

在这里插入图片描述
示例程序的Block Design 如图所示。IP core的三个配置接口通过AXI interconnect连接到 Zynq PS的GP0端口。其对应的CLK为Zynq PS端引出的PL CLOCK0,频率为100M, resetn为Proceesor System reset输出的reset信号。

时钟输入
TDC IP 默认输入时钟为50MHz的单端输入,在示例程序中,该时钟是由黑金AX7020开发板的J11 扩展口引入的,此种方式时钟信号容易受到外界干扰,信号的质量较差。黑金的很多Zynq开发板上都集成了50MHz的晶振,也可以作为TDC IP的输入时钟,只需修改clk_in1的管脚约束即可。

高速差分时钟作为TDC的输入能够得到更低的抖动。如果新设计FPGA板卡,请联系上海瑟如电子咨询相关技术问题。需要额外注意的是,时钟信号(或晶振输出信号)的各项性能指标将很大程度上影响TDC IP的测量精度及测量准确度。测时量程越大,对晶振频率的准确度、频率稳定度要求越高。如果使用环境温度变化较大,要选用低温漂的晶振,以降低输入温度变化对测时结果的影响。

时间戳数据输出
TDC IP输入的数据格式为AXI-Stream,data长度为12个字节。需要加入axis width converter 转换为data 长度为4个字节的AXI-Stream,并输入到AXIS fifo 中去,Zynq ps可通过该IP 的AXI-lite (或AXI)接口读取时间戳。需要注意的是axis width converter和 axis fifo IP 中的tlast 需要设置为on。AXI相关函数将在SDK软件包中提供。

开发工具及资源使用情况
本示例开发工具为Vivado 2019.1(可根据客户要求适配不同的版本)。Implementation时需要设置一些timing 约束。本示例所用约束示意图如下图:
在这里插入图片描述

具体约束文件随IP 核一起提供,其中部分时钟名可能需要根据客户的具体实现调整(如AXI的时钟信号名称)。本示例综合实现后的device如下图,可据此结合utilization summary一起评估所需资源。
在这里插入图片描述

在这里插入图片描述

SDK函数库介绍

功能介绍
为了便于客户的二次开发,随示例程序提供配套的SDK示例程序及所需的函数库,共包含3个文件:库文件libserutek_lib.a,头文件 serutek.h,及bare-metal应用: helloTDC.c。

在库文件中封装了诸如初始化、自校准、启动测量、停止测量以及译码函数等功能,可通过头文件sertek.h中列出的相应函数定义调用。而在示例应用helloTDC.c中,则采用了这些函数实现了TDC初始化(包含自校准),测量、数据读出、译码打印等一系列功能。
Serutek.h文件内容如下:

#ifndef SERUTEK_TDC_H		/* prevent circular inclusions */
#define SERUTEK_TDC_H

#include "xil_types.h"
#include <stdio.h>
#include "xil_printf.h"
#include "xllfifo.h"
#include "xstatus.h"

struct mTdc
{
	u8  id;
	s64  corase_ns;
	s32  fine_ps;
};

int calibrate_tdc(u32 tdc_addr, u32 cmd_addr, XLlFifo *InstancePtr, u16 fifo_id);
int init_tdc(u32 tdc0_addr, u32 tdc1_addr, u32 cmd_addr, XLlFifo *InstancePtr0, XLlFifo *InstancePtr1);
void startMeasure2chan(u32 tdc_addr0, u32 tdc_addr1, u32 cmd_addr);
void startMeasure1chan(u32 tdc_addr, u32 cmd_addr);
void stopMeasure1chan(u32 tdc_addr);
void parseRaw2tdc(u8* bufPtr, struct mTdc *val, u16 tdc_id);
s32 TdcSubstract(struct mTdc tdc1, struct mTdc tdc2);
s64 TdcSubstract64(struct mTdc tdc1, struct mTdc tdc2);
#endif

其中mTdc结构体定义了测量值的格式,一个测量值由3个数据组成:id表示TDC的通道号,本IP是双通道TDC,通道号为0或1。corase_ns表示粗计数值,单位为ns。fine_ps表示精计数的值,单位为ps。

calibrate_tdc: 自校准函数,输入参数分别为:tdc寄存器地址,命令寄存器地址,该通道TDC对应的指向AXIS-FIFO实例的指针,以及tdc的通道号。

init_tdc:TDC初始化函数,包括了TDC鉴权、初始化等功能,输入参数为:tdc0寄存器地址,tdc1寄存器地址,命令寄存器地址,TDC0对应的指向AXIS-FIFO实例的指针,TDC1对应的指向AXIS-FIFO实例的指针。

startMeasure2chan: 同时使能开启双通道。

startMeasure1chan: 使能单通道测量。

stopMeasure1chan: 关闭单通道。

parseRaw2tdc(u8 bufPtr, struct mTdc *val, u16 tdc_id)*: 译码函数。bufPtr为缓存指针,存放从AXIS-FIFO读到的单条TDC测量值原始记录。 Val是指向存放译码结果结构体的指针。tdc_id 是通道号。

s32 TdcSubstract(struct mTdc tdc1, struct mTdc tdc2): 计算两个测量值之间的时差,返回数据为32位signed integer,单位为ps。能够正确表示的时间差最大约为4.2毫秒。

s64 TdcSubstract64(struct mTdc tdc1, struct mTdc tdc2): 计算两个测量值之间的时差,返回数据为64位signed integer,单位为ps。能够正确表示的时间差最大约为213天。

函数库使用方法
由vivado导出bitstream后,创建新的SDK功能,并新建helloworld示例程序。删除helloworld.c文件,将头文件serutek.h及helloTDC.c添加到src目录。在工程下新建文件夹如lib,复制库文件libserutek_lib.a至此目录。并右击工程,选择c/c++ building settings: 如下图设置linker的libraries 和 library path,之后就能正常编译了。
在这里插入图片描述
可搜索瑟如电子了解更多详情。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值