使用具有多维数据阵列的FIFO的VHDL

使用具有多维数据阵列的FIFO的VHDL,vhdl,instantiation,ram,primitive,fifo,Vhdl,Instantiation,Ram,Primitive,Fifo,晚上好, 我有一个设计,我在400Mhz接收7个16位的数据流 我需要这个数据以100Mhz的频率呈现为26个16位的数据流 如图所示,我以100Mhz的频率接收28个16位的数据流,这将导致更多的数据不断输入然后输出。为了解决这个问题,我删除了26个16位流的1/14集(2/28集) 我目前有一个复杂的状态机,它通过7计数将数据存储到LUT中,当达到26时移动到下一个状态,并将剩余的数据带到表中的下一行,然后我以100Mhz的速率读取LUT,对于存储的14组26个16位流,计数器高达14。在第

晚上好,

我有一个设计,我在400Mhz接收7个16位的数据流

我需要这个数据以100Mhz的频率呈现为26个16位的数据流

如图所示,我以100Mhz的频率接收28个16位的数据流,这将导致更多的数据不断输入然后输出。为了解决这个问题,我删除了26个16位流的1/14集(2/28集)

我目前有一个复杂的状态机,它通过7计数将数据存储到LUT中,当达到26时移动到下一个状态,并将剩余的数据带到表中的下一行,然后我以100Mhz的速率读取LUT,对于存储的14组26个16位流,计数器高达14。在第14次读取时,最后一行不被读取,第13次读取的数据现在重复2个100Mhz时钟

我想把这个从一个巨大的LUT移到一个BRAM/FIFO。由于设计的性质,FIFO对我来说显然更为突出,但我从未真正实现过,因此我有几个问题:

我计划使用FIFO18E1/36E1原语实例化。据我所知,这个原语需要一个std_逻辑_向量作为它的输入。很明显,我不能只为每个数据总线执行for循环generate语句,因为这将创建7个FIFO,现在,当我去调用它时,我的数据不一定是有序的,除非我跟踪顺序,这就消除了从状态机切换到FIFO的好处。那么,有没有什么有效的方法来实例化一个FIFO原语,在这里我不必把数据放在平面上就能让它工作?或者这会迫使我要么把数据放平,要么设计自己的FIFO实例

如果没有,而且我仍然想使用它,我将不得不在数据流进入时将其平铺,然后在读取时将其转换回数组。因此,我的数据宽度将设置为7*16位=112位宽。但在Xilinx文档中,它指出:

该组件可配置为4位宽8K深、9位宽4K深、18位宽2K深、36位宽1K深或72位宽512深同步或双时钟(异步)FIFO RAM,并带有所有相关FIFO标志

这是否意味着此原语的单个实例已经不支持此操作,因为我的位宽度太大?将此作为一个问题是否会迫使我实例化第二个FIFO以跟踪“溢出”,然后我必须在读取周期中从每个FIFO调用部分数据

另外,我的下一个问题是,只有一个数据宽度泛型,所以在我看来,它们在读写端是相同的。在我的读取端,我希望我的数据宽度是26*16位。这是否意味着我的数据宽度必须设置为输入/输出的最坏情况大小?这将迫使我将26*16-7*16=304位填充为0,以使数据对齐。此外,如果我在这个原语的多个实例化中正确地匹配了data_width generic,我将被迫创建这个原语的ceil(26*16/72)=6个实例,以便它工作

如果所有这些都是真的,那么使用这个原语似乎没有我预期的那么有效,为了提高效率,我不得不设计自己的FIFO,对吗?尽管我的另一个问题是,在Xilinx原语中,FIFO被列为非推断。那么,如果我设计自己的FIFO,它最终会消耗什么资源呢?它会是一个复杂的带有读写指针的双方面块ram吗


对此,如有任何建议,将不胜感激。抱歉,顺便说一句,这里没有任何代码,但大多数只是从概念上理解FIFO原语,以了解我的设计是否支持使用它。

TL;请用一些图表来解释你的故事。状态转换、方框图等也显示了您已经尝试编写的代码,即使这些代码没有任何意义。是否允许您丢失数据?“将我的数据放在平面上”是什么意思?支持任何FIFO大小(深度和宽度)以及基于LUTRAM或BlockRAM的数据后端。