Intel® Stratix® 10嵌入式存储器用户指南

ID 683423
日期 11/19/2019
Public
文档目录

4.3.12. 设计实例

在此设计实例中,需要将ROM中的数据传输到RAM。假设ROM和RAM由不相关的时钟驱动,则可以使用DCFIFO有效传输异步时钟域之间的数据。
图 39. 组件模块和信号交互下图显示了组件模块及其信号交互。
注: 该DCFIFO功能中,ECC特性为使能状态,并使用M20K进行实现。
注: 这两个DCFIFO功能仅能够处理异步数据传输问题(亚稳效应)。您必须有一个控制器来控制和监视ROM,DCFIFO和RAM之间的数据缓冲过程。此设计实例为您提供写控制逻辑(write_control_logic.v)和读取控制逻辑(read_control_logic.v),这些控制逻辑是根据DCFIFO规范编译的,这些规范控制着对DCFIFO的有效写入或读取请求。
注: 该设计实例已通过功能行为验证,但仍未进行时序分析和门级仿真验证。诸如写和读控制器的状态机之类的设计编码可能仍未优化。本设计实例主要是为展示IP核的使用,尤其是在数据缓冲应用中对其控制信号的使用,而非设计编码和验证过程。

要获得设计实例中的DCFIFO设置,请参考设计文件(dcfifo8x32.v)的参数设置。

以下部分包括单独仿真波形,以描述写入和读取控制逻辑分别从DCFIFO接收信号后如何生成控制信号。

注: 浏览仿真波形的描述时,请参考上图中的信号名称,以便更好地理解。
注: 以下图示和表格中的所有信号都具有如下数字格式:
  • 二进制格式的信号值: reset, trclk, fifo_wrreq, fifo_wrfull
  • 十六进制格式的信号值:rom_addr, rom_out, fifo_in
图 40. 对DCFIFO功能的初始写入操作
表 45.  对DCFIFO功能的初始写入操作波形描述
状态 描述
IDLE

达到10 ns之前,reset信号为高电平,并使写控制器处于IDLE状态。IDLE状态下,写控制器将fifo_wrreq信号驱动为低电平,并请求从rom_addr=00读取数据。配置ROM,使其具有一个未寄存的输出,从而使rom_out信号立即显示rom_addr信号的数据,无论复位与否。由于rom_out信号直接连接到fifo_in信号(此信号是DCFIFO中已寄存器的输入端口),因此缩短了延迟。在这种情况下,数据 (0000000000000000000000000000000000000000000000000000000000000001)始终稳定并且当 fifo_wrreq信号在WRITE状态期间为高电平时有待写入DCFIFO。

WRITE

如果复位信号解除置位后 fifo_wrfull信号为低电平,那么写控制器将从 IDLE状态转换为WRITE状态。在WRITE状态下,写控制器将fifo_wrreq信号驱动为高电平,并请求对DCFIFO进行写操作。数据通过DCFIFO中嵌入的ECC模块进行编码。rom_addr信号保持不变(00),因此在DCFIFO在下一个时钟上升沿实际写入数据之前,数据至少在一个时钟周期内保持稳定。

INCADR

如果rom_addr信号尚未增加到ff(即,尚未从ROM读取最后一个数据),那么写控制器将从WRITE状态转换为INCADR状态。在INDADR状态下,写控制器将fifo_wrreq信号驱动为低电平,并将rom_addr信号增加1(00至01)。

- 如果fifo_wrfull信号为低电平并且rom_addr信号尚未增加至ff ,则相同的状态转换将按照IDLE和WRITE状态所述继续进行。
图 41. 从DCFIFO功能的初始读取操作
表 46.  从DCFIFO功能的初始读取操作波形描述
状态 描述
IDLE

到达35 ns之前,读取控制器处于IDLE状态,因为fifo_rdempty信号为高电平,即使复位信号为低电平(波形中未显示)。IDLE状态下,ram_addr = ff以适应INCADR状态下的RAM地址递增,因而WRITE状态下将读取的第一个数据存储在ram_addr = 00中。

INCADR

如果fifo_rdempty信号为低电平,那么读控制器将从IDLE状态转换为INCADR状态。在INCADR状态下,读取控制器将fifo_rdreq信号驱动为高电平,并请求DCFIFO进行读取操作。数据被解码,并且eccstatus将数据的状态显示为未检测到错误(00),检测到单一比特错误并已纠正(10)或不可纠正错误(11)。ram_addr信号以一递增(从ff00),以便数据能够在ram_addr = 00写入RAM。

WRITE

INCADR状态开始,读取控制器总是在下一个时钟上升沿转换到WRITE状态。在WRITE状态下,它将ram_wren信号驱动为高电平,并将数据在ram_addr = 00写入RAM中。同时,读取控制器将ram_rden信号驱动为高电平,以便将新写入的数据作为下一个时钟上升沿在q处的输出。同样,它将word_count信号增加到1,以表明从DCFIFO成功读取的字数。

--

如果fifo_rdempty信号为低电平,那么继续相同的状态转换,如INCADRWRITE状态所述。

图 42. 当DCFIFO满时的写操作
表 47.  当DCFIFO满时的写操作波形描述
状态 描述
INCADR

写控制器处于INCADR状态,并且fifo_wrfull信号置位时,写控制器将在下一个时钟上升沿转换为WAIT状态。

WAIT

WAIT状态下,写控制器保持rom_addr singal (08),以便在写控制器转换到WRITE状态时将相应的数据写入DCFIFO。

如果fifo_wrfull信号仍然为高电平,那么写控制器将保持在 WAIT状态。当fifo_wrfull为低电平时,写控制器总是在下一个时钟上升沿从WAIT状态转换为WRITE状态。

WRITE

WRITE状态下,写控制器将fifo_wrreq信号驱动为高电平,并请求写操作将数据从先前保存的地址(08)写入DCFIFO。如果rom_addr信号尚未增加到ff,那么它总是在下一个时钟上升沿转换到INCADR状态。

--

如果fifo_wrfull信号为高电平,那么继续相同的状态转换,如 INCADR, WAITWRITE状态所述。

图 43. 从ROM到DCFIFO的数据传输的完成
表 48.  从ROM到DCFIFO的数据传输的完成波形描述
状态 描述
WRITE 写控制器处于WRITE状态,并且rom_addr = ff时,写控制器将fifo_wrreq信号驱动为高电平,以请求对DCFIFO的最后写操作。数据100是ROM中存储的最后一个数据,并且要写入DCFIFO。在下一个时钟上升沿,写控制器将转换为DONE状态。
DONE DONE状态下,写控制器将fifo_wrreq信号驱动为低电平。
-- 由于接收域中的读控制器连续执行读取操作,因此fifo_wrfull信号解除置位。但是,fifo_wrfull信号仅在来自接收域的读取请求之后的某个时间解除置位。这是由于DCFIFO(rdreq信号到wrfull信号)中的延迟所导致。
图 44. 从DCFIFO到RAM的数据传输完成

fifo_rdempty信号置位以指示DCFIFO为空。读取控制器将fifo_rdreq信号驱动为低电平,并在ram_addr =ff上使能最后一个数据100的写操作。word_count信号增加到256(十进制),表示ROM中所有256个字的数据都已成功传输到RAM。

写入RAM的最后数据显示在q输出上。

注: 要验证结果,请将q输出与设计示例中提供的rom_initdata.hex文件中的数据进行比较。在 Intel® Quartus® Prime软件中打开该文件并选择字长(word size)为256 bit。q输出必须显示与文件中相同的数据。