基于FPGA的像素探测器数据缓存设计
粒子对撞机[1]是建立在高能同步加速器上的一种粒子对撞装置。对撞机运行时,能量强大的粒子在其内部经过加速后对撞,以达到一定的相互反应速率。对实验数据进行分析研究,可以帮助实验者了解相应粒子的形态等特性,从而推动各种理论或技术的发展。
像素探测器[2]是粒子对撞机内部用于探测质子撞击后所形成的离子轨迹的装置,是一种专用传感器,由像素探测器探测得出的数据结果即可绘制出撞击后的离子轨迹。目前,像素探测器主要采用以下几种设计方法:ASIC设计方法[3],其优点是集成度高且功耗低,但是设计成本高、周期长且风险较大;分立元件采用微处理器的设计方法,其优点是成本低、设计周期短且风险小,但是速度慢且体积大。针对这几种设计方法,本文结合FPGA[4]提出了一种基于粒子对撞机像素探测器的数据缓存方法设计。相对ASIC设计方法,具有设计投入低、参数设置灵活、开发风险低而且开发周期短的优势;相对于分立元件采用微处理器的设计方法,具有体积小、功耗低且速度快的优势。
由于像素探测器的数据输出具有保持时间短(最少保持时间为25 ns)、数据间隔时间不确定等特征,所以对于数据的存储必须经过时序转换电路将数据事先存入缓存,再写入存储器。本文的数据缓存设计由FIFO输入时序模块、FIFO模块和FIFO输出时序模块三部分组成,通过验证可以实现由探测器数据输出端到存储器的数据缓存功能。
1 总体设计
FPGA是一种新型的可编程逻辑器件,可以通过硬件描述语言生成所需的硬件,相对于传统的ASIC设计,具有设计周期短、灵活性高、开发费用少、设计风险低等优点,是ASIC的一种高效低成本解决方案。本设计使用的FPGA是Altera公司的CYCLONE2芯片,最高时钟频率100 MHz。总体架构如图1所示。
由于探测器数据输出需要符合FIFO数据输入的时序,FIFO的数据输出需要符合存储器输入的时序,因此设计了FIFO输入时序模块和FIFO输出时序模块,使数据能够正确缓存进而存储。下面对具体的时序规范及各个模块进行说明。
2 模块设计及说明
2.1 FIFO模块
FIFO即先进先出缓存器。FIFO与其他存储器的最大区别就是没有外部读写的地址线,因此应用起来十分方便简单,但是相应的缺点就是只能顺序写入或者顺序读取,其寻址方式由内部指针自加自减完成,不能对特定的地址进行读写。FIFO通常使用在不同速度的接口数据交换中,通过FIFO使得时序分别符合两个接口的特定速度,以进行数据传输。
Altera的FIFO按照驱动时钟分类有两种:单时钟FIFO(SCFIFO),即读和写FIFO用的同一个时钟信号;双时钟FIFO(DCFIFO),即读和写FIFO分别使用不同时钟信号。其中双时钟FIFO还根据不同的端口数据宽度分为DCFIFO和DCFIFO_MIXED_WIDTH,所谓DCFIFO是输入数据和输出数据具有相同的数据宽度;而DCFIFO_MIXED_WIDTH是指输入输出端口可以使用不同的数据宽度。
使用Altera的FIFO MegaWizard inteface launched对FIFO进行构建,像素探测器模型中有16路传感器输出,每路输出需要记录100个数据。根据模型需要,构建FIFO的主要参数如下:
dcfifo_component.intended_device_family
= "Cyclone II"dcfifo_component.lpm_hint"MAXIMIZE_
SPEED=7 RAM_BLOCK_TYPE=M4K"
dcfifo_component.lpm_numwords = 128
dcfifo_component.lpm_showahead = "OFF"
dcfifo_component.lpm_type = "dcfifo"
dcfifo_component.lpm_width = 16
dcfifo_component.lpm_widthu = 7
dcfifo_component.overflow_checking="ON" dcfifo_compo-
nent.rdsync_delaypipe = 5
dcfifo_component.underflow_checking="ON"
dcfifo_component.use_eab = "ON"
dcfifo_component.write_aclr_synch = "OFF"
dcfifo_component.wrsync_delaypipe = 5;
构建完FIFO后,对其进行时序仿真,仿真结果如图2所示。
参照时序仿真图对各个端口及时序进行说明:
aclr: 异步清零端,1 bit。清零所有输出状态端口,对于DCFIFO,3个wrclk时钟上升沿后清零wrfull端口,清零rdfull端口。如果输出端口定义reg类型的则会被清零;否则会保持输出值。
data: 数据输入端口, 16 bit。当写请求wrreq有效时,保持数据直到数据被写入FIFO。当使用手动定义FIFO时,其数据宽度用参数LPM_WIDTH定义。
q: 数据输出端口, 16 bit。当有数据请求时(rdreq有效时),输出数据。对于DCFIFO,输出数据的宽度可以与输入数据data端口宽度不同,具体用参数LPM_WIDTH_R定义。
rdcld: 上升沿出发时钟,1bit。用来同步以下信号:q、dreq、dfull、dempty、rdusedw。
rdempty: 输出数据为零时输出高电平,1 bit。不管目标设备是什么,在读请求发送前必须查询rdempty信号是否为高电平,以避免错误指令发出。
rdreq: 读请求信号端口,1 bit。当需要从FIFO中读数据时,向rdreq端发送读请求,读取数据个数与rdreq持续的时钟数相同。需要注意的是,当rdempty有效时不能发送rdreq信号。对于这种情况,可以开启空保护功能,通过设置参数UNDERFLOW_CHECKING高电平实现,当rdempty为高电平时rdreq信号自动被置为无效。
rdusedw: 输出数据显示FIFO中可读数据的数据量,7 bit。在DCFIFO中,其端口宽度要与手动设置参数LPM_WIDTHU相等。需要注意的是,对于Cyclone系列的FPGA,当显示数据满时实际FIFO的存储数据量有可能并没有达到存储的最大值,因此应该参考full或者wrfull端口来执行正确的写操作,参考empty或者rdempty端口来执行正确的读操作。
wrclk: 写数据时钟,上升沿触发有效,1 bit。用于同步以下端口:data、wrreq、wrusedw、 wrfull和wrempty。
wrfull: 写数据满信号,1 bit。当此端口电平有效时,FIFO已经被写满。其注意事项同rdfull。总体而言,rdfull信号要比wrfull信号有所延迟,因此,应该通过wrfull信号的电平来判断是否可以发送写请求信号wrreq。
wrreq: 写请求信号。当需要向FIFO写入数据时,向wrreq端发送读请求,读取数据个数与wrreq持续的时钟数相同。需要注意的是,当wrfull有效时不能发送wrreq信号。对于这种情况,可以开启溢出保护功能,通过设置参数OVERFLOW_CHECKING高电平实现,当wrfull为高电平时wrreq信号自动被置为无效。同时在取消aclr信号时不应输入wrreq信号,否则aclr信号的下降沿和wrreq信号置为高电平后写数据的上升沿会产生竞争冒险现象。对于CYCLONE系列的FPGA中DCFIFO器件,可以选择添加同步电路同步aclr信号和wrclk信号,在手动设置中也可以通过设置参数WRITE_ACLR_SYNCH有效实现同步。
wrusedw: 输出数据显示FIFO中写入数据的数据量,7 bit。在DCFIFO中,其端口宽度要与手动设置参数LPM_WIDTHU相等。需要注意的是,对于Cyclone系列的FPGA,当显示数据满时实际FIFO的存储数据量有可能并没有达到存储的最大值,因此应该参考full或者wrfull端口来执行正确的写操作,参考empty或者rdempty端口来执行正确的读操作。
FIFO工作时的状态转换图如图3所示。
FPGA IP 嵌入式 PLD CPLD SoC 数字信号处理 消费电子 相关文章:
- 在采用FPGA设计DSP系统中仿真的重要性 (06-21)
- 基于 DSP Builder的FIR滤波器的设计与实现(06-21)
- 基于FPGA的快速并行FFT及其在空间太阳望远镜图像锁定系统中的应用(06-21)
- 3DES算法的FPGA高速实现(06-21)
- 用FPGA实现FFT算法(06-21)
- FPGA的DSP性能揭秘(06-16)