针对粒子对撞机像素探测器的数据缓存,提出了基于FPGA的解决方法。通过时序转换匹配模块,可以使用定制FIFO核实现对探测器模型的数据进行缓存。经过FPGA验证,在功能上达到了像素探测器模型的要求,对于粒子对撞机像素探测器的低成本工程验证具有显著的参考价值。
粒子对撞机[1]是建立在高能同步加速器上的一种粒子对撞装置。对撞机运行时,能量强大的粒子在其内部经过加速后对撞,以达到一定的相互反应速率。对实验数据进行分析研究,可以帮助实验者了解相应粒子的形态等特性,从而推动各种理论或技术的发展。
像素探测器[2]是粒子对撞机内部用于探测质子撞击后所形成的离子轨迹的装置,是一种专用传感器,由像素探测器探测得出的数据结果即可绘制出撞击后的离子轨迹。目前,像素探测器主要采用以下几种设计方法:ASIC设计方法[3],其优点是集成度高且功耗低,但是设计成本高、周期长且风险较大;分立元件采用微处理器的设计方法,其优点是成本低、设计周期短且风险小,但是速度慢且体积大。针对这几种设计方法,本文结合FPGA[4]提出了一种基于粒子对撞机像素探测器的数据缓存方法设计。相对ASIC设计方法,具有设计投入低、参数设置灵活、开发风险低而且开发周期短的优势;相对于分立元件采用微处理器的设计方法,具有体积小、功耗低且速度快的优势。
由于像素探测器的数据输出具有保持时间短(最少保持时间为25ns)、数据间隔时间不确定等特征,所以对于数据的存储必须经过时序转换电路将数据事先存入缓存,再写入存储器。本文的数据缓存设计由FIFO输入时序模块、FIFO模块和FIFO输出时序模块三部分组成,通过验证可以实现由探测器数据输出端到存储器的数据缓存功能。
1 总体设计
FPGA是一种新型的可编程逻辑器件,可以通过硬件描述语言生成所需的硬件,相对于传统的ASIC设计,具有设计周期短、灵活性高、开发费用少、设计风险低等优点,是ASIC的一种高效低成本解决方案。本设计使用的FPGA是Altera公司的CYCLONE2芯片,最高时钟频率100MHz。总体架构如图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:异步清零端,1bit。清零所有输出状态端口,对于DCFIFO,3个wrclk时钟上升沿后清零wrfull端口,清零rdfull端口。如果输出端口定义reg类型的则会被清零;否则会保持输出值。 data:数据输入端口,16bit。当写请求wrreq有效时,保持数据直到数据被写入FIFO。当使用手动定义FIFO时,其数据宽度用参数LPM_WIDTH定义。 q:数据输出端口,16bit。当有数据请求时(rdreq有效时),输出数据。对于DCFIFO,输出数据的宽度可以与输入数据data端口宽度不同,具体用参数LPM_WIDTH_R定义。 rdcld:上升沿出发时钟,1bit。用来同步以下信号:q、dreq、dfull、dempty、rdusedw。 rdempty:输出数据为零时输出高电平,1bit。不管目标设备是什么,在读请求发送前必须查询rdempty信号是否为高电平,以避免错误指令发出。 rdreq:读请求信号端口,1bit。当需要从FIFO中读数据时,向rdreq端发送读请求,读取数据个数与rdreq持续的时钟数相同。需要注意的是,当rdempty有效时不能发送rdreq信号。对于这种情况,可以开启空保护功能,通过设置参数UNDERFLOW_CHECKING高电平实现,当rdempty为高电平时rdreq信号自动被置为无效。 rdusedw:输出数据显示FIFO中可读数据的数据量,7bit。在DCFIFO中,其端口宽度要与手动设置参数LPM_WIDTHU相等。需要注意的是,对于Cyclone系列的FPGA,当显示数据满时实际FIFO的存储数据量有可能并没有达到存储的最大值,因此应该参考full或者wrfull端口来执行正确的写操作,参考empty或者rdempty端口来执行正确的读操作。 wrclk:写数据时钟,上升沿触发有效,1bit。用于同步以下端口:data、wrreq、wrusedw、wrfull和wrempty。 wrfull:写数据满信号,1bit。当此端口电平有效时,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中写入数据的数据量,7bit。在DCFIFO中,其端口宽度要与手动设置参数LPM_WIDTHU相等。需要注意的是,对于Cyclone系列的FPGA,当显示数据满时实际FIFO的存储数据量有可能并没有达到存储的最大值,因此应该参考full或者wrfull端口来执行正确的写操作,参考empty或者rdempty端口来执行正确的读操作。
FIFO工作时的状态转换图如图3所示。
2.2 FIFO输入时序模块
FIFO输入时序模块用于使TIME COUNTER_WITHID模块(用于对信号进行计时)的输出数据时序符合FIFO输入数据时序的接口要求。FIFO的写请求信号wrreq的长度所包含的周期数为写入FIFO数据的个数,并且写请求信号有效时输入数据端口的数据即被写入FIFO,几乎没有延迟,因此输入数据长度应符合FIFO的时钟信号周期长度,并且写请求信号长度也需要符合FIFO时钟信号周期长度,两者在时间上需要达到同步。
为了测试输出数据长度符合FIFO接口的时序要求,分别进行了图4(a)、图4(b)、图4(c)所示的波形仿真,输入信号的持续长度分别为10ns、20ns、30ns。如图所示三种输入的输出皆为10ns保持时间, 同时输出10ns write_en使能信号,符合FIFO接口要求。
参照时序仿真图对各个端口及时序进行说明:
clk:FIFO输入时序模块时钟输入,1bit。用于同步datain16、dataout16、write_en、complete、enable、usedw信号,与FIFO中wrclk信号相频相同。 complete:数据接收完成信号,1bit。当从timecounter_withid模块接收数据完成时发送给timecounter_withid模块,持续时长1周期,timecounter_withid接收到信号时对内部数据进行初始化,做好准备对新的信号输入进行计时。 datain16:16位数据输入端口,16bit。用于输入16位数据。 dataout16:16位数据输出端口,16bit。用于输出16位数据。 enable:数据写入输入时序模块使能,1bit。当有数据要写入模块时,首先在此端口输入高电平,然后输入数据方可被正确接收。 usedw:FIFO中可用数据端口,7bit。用于查询FIFO中可用数据量,以此判断是否有剩余空间,进而确定是否向FIFO中写数据。 write_en:写使能信号,1bit。当要向FIFO中写入数据时为高电平,dataout16进行数据输出。
模块流程图如图5所示。整个模块以posedge clk为同步时钟进行循环判断。当写入模块使能enable有效且写入完毕信号complete无效时,首先对FIFO的存储情况进行判断,当FIFO中字节小于7FH时,说明FIFO未被写满,可以向其输入数据。数据输入FIFO的同时,写使能write_en置为有效,对于计数模块输出的接收完成信号complete信号置为有效。对一个周期的计数寄存器counter进行判断,如果counter为1即计时一周期到,则寄存器清零。counter的数值是在每次posedge clk信号到来时对write_en判断后进行加1,即当write_en为有效电平时,counter才被加1用来计时。
2.3 FIFO输出时序模块
FIFO输出时序模块用于使FIFO的输出信号符合Flash读写时序规范。由FIFO的时序仿真图可以看出,当读请求信号rdreq发出后,数据要延迟15ns左右才会输出。如果Flash控制器发出读请求信号后立即读FIFO的数据,则会造成差错。因此本模块可以衔接FIFO和Flash控制器的端口时序。
时序仿真图如图6所示。由时序仿真图可以看出,sendready信号相对于empty信号延迟了13ns左右,dataout信号相对于sendready信号延迟了20ns左右。可以满足FIFO时序要求。
参照时序仿真图对各个端口及时序进行说明:
clk:FIFO输入时序模块时钟输入,1bit。用于同步datain16、dataout16、empty、complete、sendready信号,与FIFO中wrclk信号相频相同。 complete:数据接收完成信号,1bit。当存储器从模块接收数据完成时发送给FIFO输出时序模块,持续时长1周期,FIFO输出时序模块接收到此信号时对内部数据进行初始化,开始对新的信号输入进行计时。 datain16:16位数据输入端口,16bit。用于输入16位数据。 dataout16:16位数据输出端口,16bit。用于输出16位数据。 sendready:数据准备就绪信号,1bit。当FIFO收到读数据请求信号并且有数据输出时sendready发送有效信号,存储器读取输出数据。 write_en:写使能信号,1bit。当要向FIFO中写入数据时为高电平,dataout16进行数据输出。
模块流程图如图7所示。
3 设计验证
3.1 验证
将程序下载到CycloneII FPGA芯片中,并且用按键作为输入信号进行了测试,在控制台上打印FIFO的输出结果,结果如图8所示。
3.2 验证结果分析
当FIFO中的数据经过时序转换模块可以向存储器写入时,ready信号为1,同时数据写入寄存器并在控制台打印,然后再将寄存器中的数据写入存储器,并向时序转换模块返回完成信号complete高电平1,等待从FIFO中读取新数据。经过验证,本设计可以将输入数据进行缓存并且输出给NiosII CPU,符合像素探测器数据缓存要求。
本文结合FPGA对粒子对撞机像素探测器的数据缓存提出了解决方法并进行了设计和验证。相对于传统的ASIC构建方法,具有高效率、低投入的优势,提高了探测器升级和参数设置等方面的灵活性;相对于分立元件的设计方法,具有高速、低功耗和集成度高的优势。通过时序仿真和FPGA验证,能够满足像素探测器的设计需要。 |