在FPGA中创建内存片段(Memory)和FIFO时,需要设置其在FPGA上的实现(Implementation)方式。不同的实现方式分别涉及到FPGA中不同的硬件资源,包括:触发器(Flip-flops),查找表(LUT, Look-up Table)和存储块(Block Memory)。
在讲解实现方式之前,我们需要了解实现方式涉及到哪些硬件资源?这些硬件资源在FPGA上是如何构成的?之间又存在着什么样的关系?
1. 逻辑块(Logic Block)
逻辑块由很多逻辑单元(Logic Cell or Slice etc)组成,典型的逻辑单元是由一个4输入查找表,一个全加器(Full Adder)和一个D型触发器组成。FPGA利用查找表实现组合逻辑,并且每个查找表连接到一个D型触发器的输入端,触发器再来驱动其他逻辑电路或驱动IO。
2. 嵌入式内存(Embedded RAM)
· 大多数FPGA都具有嵌入式内存,这大大拓展了FPGA的应用范围和灵活性。其可被配置为单端口、双端口、内存地址存储器以及FIFO等常用数据结构。除了嵌入式内存,还可以将FPGA中的查找表灵活的配制成RAM、ROM和FIFO等结构。
当然,除了逻辑块和嵌入式内存外,FPGA中还有时钟管理、布线资源等硬件模块,这里就不做详细介绍。
下面将针对创建内存片段和FIFO分别介绍各自的实现方式。
1. 内存片段(Memory)
在FPGA中创建内存片段时,我们可以指定它存储到内存块,查找表或DRAM中。由于并不是所有硬件都支持使用DRAM创建内存片段,因此我们只在下文对比通过内存块和查找表创建内存片段时的差别。
1.1.存储块
通过存储块实现内存片段,是将数据存储在嵌入式内存块中。
该实现方式适用于如下情况:
1. 由于操作通过存储块创建的内存片段需要耗用一个时钟周期, 因此,当使用单周期定时循环(Single-Cycle Timed Loop)时,不允许在同一个周期中对内存片段进行多个操作。例如,先写后读。
2. 当您需要很大的内存片段时。
3. 当您的FPGA上没有足够的逻辑资源时。
1.2. 查找表
通过查找表实现内存片段,是将数据存储在FPGA中的查找表中。它消耗FPGA中的逻辑资源,例如,加法器、减法器等。
该实现方式适用于如下情况:
1. 在单周期定时循环中,需要对内存片段进行多个操作时。
2. 当您需要的内存片段远远小于FPGA上嵌入的存储块大小时。
3. 当您的FPGA上没有足够的存储块时。
2. FIFO
在FPGA中创建FIFO时,我们可以指定它存储到触发器,查找表和存储块中。
2.1. 触发器
通过触发器实现FIFO,是将数据存储在FPGA的触发器中。相比之下,具有最佳的执行性能。主要在小数据量的情况下使用,例如,不超过100字节。通过触发器实现的FIFO无法在不同时钟域的单周期定时循环中使用。
2.2. 查找表
通过查找表实现FIFO,是将数据存储在FPGA查找表中。一般用于数据量在100字节到300字节这个范围内。和触发器实现一样,通过查找表实现的FIFO无法在不同时钟域的单周期定时循环中使用。
2.3. 存储块
通过存储块实现FIFO,是将数据存储在嵌入式内存中。主要在大数据量的情况下使用,例如,超过300字节。当使用目标范围(Target-Scoped)或VI范围(VI-Scoped)的FIFO时,如果该FIFO是通过存储块实现的,您需要在写入数据6个时钟周期(Tick)后,才可以从FIFO中读取到数据。 |