笔者在PET电子学基础一文中的最后提到了PET电子学一个关键技术就是符合电路,当前实现该电路多采用逻辑器件,如FPGA,来实现。图1为上一篇博文最后给出的符合事件示意图,原博文地址为:http://bbs.ednchina.com/BLOG_ARTICLE_3010304.HTM。
图1:符合事件示意图
如图1所示,探测器为一圆形结构,均匀分布多个探测模块,假设整个探测环中有32个探测模块,分别标识为模块0、模块1....模块30、模块31。那么怎样才视为符合呢?即两个“事件”同时发生在相对的模块上,即理想情况是180度对角上的两个探测模块同时探测到了事件,即为符合。实际实现的时候未必这样理想,比如我选定一个模块为0,那么与其正对的模块为15,那么此时我们可以认为以15为中心,左右各4个模块都属于符合范围。当然具体是4个还是3个可以自行设定。有了这样的约束之后,就算某个时刻模块0和模块10同时探测到了事件,那么我们也不能判断这对事件属于符合事件了。
有了上述具体化的说明,那么具体逻辑实现的时候就非常简单了,具体实现的方法有3种。
第一种就是使用if-elsif-elsif结构;
第二种,就是使用case语句;
第三种,可以使用查表方式。
由于我们事先先将所有探测器探测到的事件进行了缓存,然后根据事件中的时间信息找出时间相差不大于某个时间(即符合窗口)的所有事件对,最后就是由我们上述定义的符合逻辑对事件对进行符合电路最终实现。
如果使用if-elsif结构,那么需要判断两个条件,即事件对中探测每个事件的模块号,根据这两个模块来判断最终是否符合。可想而知根据前述这种可能性非常多,所以if-elsif的入口很多,所以这不是一个很好的实现方法。
因为我们每次只是判断一个事件对,而每个事件对中事件的模块号都是唯一的,所以上述条件判断是互斥的,所以我们可以用case结构替换上述if-elsif结构。这样做的好处是可以优化实现的速度。
最后一个方法,是事先根据订好的规则,找出所有可能的符合事件,然后将其存储在一个表格里。因为模块号最大值是31,即5个bit;这样我们可以制作一个地址宽度为10-bit(两个模块)数据宽度为1-bit的rom表格来存储符合结果。查表的时候根据两个模块的模块号获得一个10-bit的地址,根据这个地址读出rom对应的数据,如果为‘1’则认为是符合,如果为‘0’则认为是不符合。这个0和1我们可以事先定制到rom中。
个人更倾向于使用查表的方法,因为这样做有几个好处:首先,是速度快,处理的速度就是FPGA内部rom的访问速度;其次,逻辑可以映射到FPGA内部ram,当逻辑资源紧张而ram不紧张的时候可以优化面积;最后,虽然使用case结构可以获得一样的速度,只是由于入口太多,我们在coding的时候需要敲入太多的代码,而使用rom,则只需要例化一个rom即可。
文章评论(0条评论)
登录后参与讨论