新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于FPGA的像素探测器数据缓存设计

基于FPGA的像素探测器数据缓存设计

作者:时间:2011-12-27来源:网络收藏

粒子对撞机[1]是建立在高能同步加速器上的一种粒子对撞装置。对撞机运行时,能量强大的粒子在其内部经过加速后对撞,以达到一定的相互反应速率。对实验数据进行分析研究,可以帮助实验者了解相应粒子的形态等特性,从而推动各种理论或技术的发展。
 像素探测器[2]是粒子对撞机内部用于探测质子撞击后所形成的离子轨迹的装置,是一种专用传感器,由像素探测器探测得出的数据结果即可绘制出撞击后的离子轨迹。目前,像素探测器主要采用以下几种设计方法:ASIC设计方法[3],其优点是集成度高且功耗低,但是设计成本高、周期长且风险较大;分立元件采用微处理器的设计方法,其优点是成本低、设计周期短且风险小,但是速度慢且体积大。针对这几种设计方法,本文结合[4]提出了一种基于粒子对撞机像素探测器的数据缓存方法设计。相对ASIC设计方法,具有设计投入低、参数设置灵活、开发风险低而且开发周期短的优势;相对于分立元件采用微处理器的设计方法,具有体积小、功耗低且速度快的优势。
 由于像素探测器的数据输出具有保持时间短(最少保持时间为25 ns)、数据间隔时间不确定等特征,所以对于数据的存储必须经过时序转换电路将数据事先存入缓存,再写入存储器。本文的数据缓存设计由FIFO输入时序模块、FIFO模块和FIFO输出时序模块三部分组成,通过验证可以实现由探测器数据输出端到存储器的数据缓存功能。
1 总体设计
是一种新型的可编程逻辑器件,可以通过硬件描述语言生成所需的硬件,相对于传统的ASIC设计,具有设计周期短、灵活性高、开发费用少、设计风险低等优点,是ASIC的一种高效低成本解决方案。本设计使用的是Altera公司的CYCLONE2芯片,最高时钟频率100 MHz。总体架构如图1所示。

基于FPGA的像素探测器数据缓存设计

 由于探测器数据输出需要符合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所示。

基于FPGA的像素探测器数据缓存设计

 参照时序仿真图对各个端口及时序进行说明:
 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的像素探测器数据缓存设计


2.2 FIFO输入时序模块
FIFO输入时序模块用于使TIME COUNTER_WITHID模块(用于对信号进行计时)的输出数据时序符合FIFO输入数据时序的接口要求。FIFO的写请求信号wrreq的长度所包含的周期数为写入FIFO数据的个数,并且写请求信号有效时输入数据端口的数据即被写入FIFO,几乎没有延迟,因此输入数据长度应符合FIFO的时钟信号周期长度,并且写请求信号长度也需要符合FIFO时钟信号周期长度,两者在时间上需要达到同步。
 为了测试输出数据长度符合FIFO接口的时序要求,分别进行了图4(a)、图4(b)、图4(c)所示的波形仿真,输入信号的持续长度分别为10 ns、20 ns、30 ns。如图所示三种输入的输出皆为10 ns保持时间, 同时输出10 ns write_en使能信号,符合FIFO接口要求。

基于FPGA的像素探测器数据缓存设计

粒子对撞机[1]是建立在高能同步加速器上的一种粒子对撞装置。对撞机运行时,能量强大的粒子在其内部经过加速后对撞,以达到一定的相互反应速率。对实验数据进行分析研究,可以帮助实验者了解相应粒子的形态等特性,从而推动各种理论或技术的发展。
 像素探测器[2]是粒子对撞机内部用于探测质子撞击后所形成的离子轨迹的装置,是一种专用传感器,由像素探测器探测得出的数据结果即可绘制出撞击后的离子轨迹。目前,像素探测器主要采用以下几种设计方法:ASIC设计方法[3],其优点是集成度高且功耗低,但是设计成本高、周期长且风险较大;分立元件采用微处理器的设计方法,其优点是成本低、设计周期短且风险小,但是速度慢且体积大。针对这几种设计方法,本文结合FPGA[4]提出了一种基于粒子对撞机像素探测器的数据缓存方法设计。相对ASIC设计方法,具有设计投入低、参数设置灵活、开发风险低而且开发周期短的优势;相对于分立元件采用微处理器的设计方法,具有体积小、功耗低且速度快的优势。
 由于像素探测器的数据输出具有保持时间短(最少保持时间为25 ns)、数据间隔时间不确定等特征,所以对于数据的存储必须经过时序转换电路将数据事先存入缓存,再写入存储器。本文的数据缓存设计由FIFO输入时序模块、FIFO模块和FIFO输出时序模块三部分组成,通过验证可以实现由探测器数据输出端到存储器的数据缓存功能。
1 总体设计
FPGA是一种新型的可编程逻辑器件,可以通过硬件描述语言生成所需的硬件,相对于传统的ASIC设计,具有设计周期短、灵活性高、开发费用少、设计风险低等优点,是ASIC的一种高效低成本解决方案。本设计使用的FPGA是Altera公司的CYCLONE2芯片,最高时钟频率100 MHz。总体架构如图1所示。

基于FPGA的像素探测器数据缓存设计

 由于探测器数据输出需要符合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所示。

基于FPGA的像素探测器数据缓存设计

 参照时序仿真图对各个端口及时序进行说明:
 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的像素探测器数据缓存设计


2.2 FIFO输入时序模块
FIFO输入时序模块用于使TIME COUNTER_WITHID模块(用于对信号进行计时)的输出数据时序符合FIFO输入数据时序的接口要求。FIFO的写请求信号wrreq的长度所包含的周期数为写入FIFO数据的个数,并且写请求信号有效时输入数据端口的数据即被写入FIFO,几乎没有延迟,因此输入数据长度应符合FIFO的时钟信号周期长度,并且写请求信号长度也需要符合FIFO时钟信号周期长度,两者在时间上需要达到同步。
 为了测试输出数据长度符合FIFO接口的时序要求,分别进行了图4(a)、图4(b)、图4(c)所示的波形仿真,输入信号的持续长度分别为10 ns、20 ns、30 ns。如图所示三种输入的输出皆为10 ns保持时间, 同时输出10 ns write_en使能信号,符合FIFO接口要求。

基于FPGA的像素探测器数据缓存设计

参照时序仿真图对各个端口及时序进行说明:
 clk: FIFO输入时序模块时钟输入,1 bit。用于同步datain16、dataout16、write_en、complete、enable、usedw信号,与FIFO中wrclk信号相频相同。
complete:数据接收完成信号,1 bit。当从timecounter_withid模块接收数据完成时发送给timecounter_withid模块,持续时长1周期,timecounter_withid接收到信号时对内部数据进行初始化,做好准备对新的信号输入进行计时。
 datain16: 16位数据输入端口,16 bit。用于输入16位数据。
 dataout16: 16位数据输出端口,16 bit。用于输出16位数据。
 enable: 数据写入输入时序模块使能,1 bit。当有数据要写入模块时,首先在此端口输入高电平,然后输入数据方可被正确接收。
usedw: FIFO中可用数据端口,7 bit。用于查询FIFO中可用数据量,以此判断是否有剩余空间,进而确定是否向FIFO中写数据。
 write_en: 写使能信号,1bit。当要向FIFO中写入数据时为高电平,dataout16进行数据输出。
 模块流程图如图5所示。整个模块以posedge clk为同步时钟进行循环判断。当写入模块使能enable有效且写入完毕信号complete无效时,首先对FIFO的存储情况进行判断,当FIFO中字节小于7 FH时,说明FIFO未被写满,可以向其输入数据。数据输入FIFO的同时,写使能write_en置为有效,对于计数模块输出的接收完成信号complete信号置为有效。对一个周期的计数寄存器counter进行判断,如果counter为1即计时一周期到,则寄存器清零。counter的数值是在每次posedge clk信号到来时对write_en判断后进行加1,即当write_en为有效电平时,counter才被加1用来计时。

基于FPGA的像素探测器数据缓存设计

2.3 FIFO输出时序模块
 FIFO输出时序模块用于使FIFO的输出信号符合Flash读写时序规范。由FIFO的时序仿真图可以看出,当读请求信号rdreq发出后,数据要延迟15 ns左右才会输出。如果Flash控制器发出读请求信号后立即读FIFO的数据,则会造成差错。因此本模块可以衔接FIFO和Flash控制器的端口时序。
 时序仿真图如图6所示。由时序仿真图可以看出,sendready信号相对于empty信号延迟了13 ns左右,dataout信号相对于sendready信号延迟了20 ns左右。可以满足FIFO时序要求。

基于FPGA的像素探测器数据缓存设计

 参照时序仿真图对各个端口及时序进行说明:
 clk: FIFO输入时序模块时钟输入,1 bit。用于同步datain16、dataout16、empty、complete、sendready信号,与FIFO中wrclk信号相频相同。
complete: 数据接收完成信号,1 bit。当存储器从模块接收数据完成时发送给FIFO输出时序模块,持续时长1周期,FIFO输出时序模块接收到此信号时对内部数据进行初始化,开始对新的信号输入进行计时。
 datain16: 16位数据输入端口,16 bit。用于输入16位数据。
 dataout16: 16位数据输出端口,16 bit。用于输出16位数据。
 sendready: 数据准备就绪信号,1 bit。当FIFO收到读数据请求信号并且有数据输出时sendready发送有效信号,存储器读取输出数据。
 write_en: 写使能信号,1 bit。当要向FIFO中写入数据时为高电平,dataout16进行数据输出。
 模块流程图如图7所示。

基于FPGA的像素探测器数据缓存设计

3 设计验证
3.1 验证

将程序下载到CycloneII FPGA芯片中,并且用按键作为输入信号进行了测试,在控制台上打印 FIFO的输出结果,结果如图8所示。

基于FPGA的像素探测器数据缓存设计

3.2 验证结果分析
 当FIFO中的数据经过时序转换模块可以向存储器写入时,ready信号为1,同时数据写入寄存器并在控制台打印,然后再将寄存器中的数据写入存储器,并向时序转换模块返回完成信号complete高电平1,等待从FIFO中读取新数据。经过验证,本设计可以将输入数据进行缓存并且输出给NiosII CPU,符合像素探测器数据缓存要求。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭