晚上好,
我有一个设计,我在400Mhz接收7个16位数据流。
我需要将这些数据显示为100个Mhz的26个16位数据流。
可以看出,我在100Mhz接收到28个16位数据流,这将导致更多数据不断进入然后出去。为了解决这个问题,我删除了26个16位流的1/14集(2/28集)。
我目前有一个精心设计的状态机,通过7计数将数据存储到LUT中,当达到26时移动到下一个状态,并将剩余部分移到表中的下一行,然后我回读LUT的速率为100Mhz,存储的14组26个16位流的计数器最多为14。在第14次读取时,不读取最后一行,并且现在重复第13次读取的数据,持续2个100Mhz时钟。
我想将它从一个巨大的LUT转移到一个BRAM / FIFO。由于设计的性质,FIFO显然对我来说更加突出,除了我从未真正实现过,所以我有几个问题:
我计划使用FIFO18E1 / 36E1原语实例化。据我所知,这个原语需要一个std_logic_vector作为它的输入。我显然不能只为每个数据总线做一个for循环生成语句,因为这将创建7个FIFO,现在我的数据不一定按顺序排除,除非我跟踪订单,这消除了从我的状态机切换到FIFO的好处。那么,是否有任何有效的方法来实例化一个FIFO原语,我不必将我的数据平放以使其工作?或者这会迫使我要么平躺我的数据还是设计我自己的FIFO实例?
如果没有,我仍然想要使用它,我必须在进入时将数据流平放,然后在阅读时将它们转换回数组。所以我的data_width generic将被设置为7 * 16位= 112位宽。但是,在Xilinx文档中,它声明:
该组件可配置为4位宽,8K深,9位×4K深,18位×2K深,36位宽×1K深,或72位宽×512深具有所有相关FIFO标志的同步或双时钟(异步)FIFO RAM。
这是否意味着这个原语的单个实例已经不支持这个因为我的位宽太大了?将此问题作为一个问题迫使我实例化第二个FIFO以跟踪"溢出",然后我将不得不在读周期中调用每个FIFO的部分数据?
另外,我的下一个问题是只有一个data_width泛型,所以在我看来这些在读写端是相同的。在我的阅读方面,我希望我的数据宽度为26 * 16位。这是否意味着我的data_width generic必须设置为输入/输出的最差情况?这将迫使我将26 * 16 - 7 * 16 = 304位填充为0以使数据排成一行。另外,如果我在这个原语的多个实例中正确匹配data_width泛型,我将被迫创建ceil(26 * 16/72)= 6个这个原语的实例,以使其工作。
如果所有这一切都是真的,那么使用这个原语似乎不如我预期的那么高效,为了提高效率,我将被迫设计自己的FIFO,对吗?虽然我的另一个问题是在Xilinx原语上,FIFO被列为非推断的。那么,如果我要设计自己的FIFO,最终会消耗哪些资源?它是一些精心设计的双方面块ram,带有读写指针吗?
对此的任何建议将不胜感激。对不起,顺便说一下,没有任何代码,但大多数情况下只是从概念上理解FIFO原语,知道我的设计是否支持使用它。