嵌入式存储器结构由一列列 M9K 存储器模块组成,通过对这些 M9K 存储器模块进行配置,可以实现各种存储器功能,例如:RAM、移位寄存器、 ROM 以及FIFO 缓冲器。
M9K 存储器模块支持以下特性:
■ 每模块 8,192 个存储器位 ( 包括奇偶校验位,每模块共 9,216 位 )
■ 用于每一个端口的独立读使能 (rden) 与写使能 (wren) 信号
■ Packed 模式,该模式下 M9K 存储器模块被分成两个 4.5 K 单端口 RAM
■ 可变端口配置
■ 单端口与简单双端口模式,支持所有端口宽度
■ 真双端口 ( 一个读和一个写,两个读,或者两个写 ) 操作
■ 字节使能,实现写入期间的数据输入屏蔽
■ 用于每一个端口 ( 端口 A 和 B) 的时钟使能控制信号
■ 初始化文件,在 RAM 和 ROM 模式下预加载存储器中的数据
rden与wren控制信号控制 M9K 存储器模块的每一个端口上的读写操作。当不需要操作时,您可以分别将rden或者wren信号禁用,从而降低功耗。
byteena信号默认为高电平 ( 使能的 ),写端口具有 ×16, ×18, ×32, 或者 ×36 位数据位宽时,M9K 模块将支持字节使能。字节使能以独热码的形式运行,并且byteena的最低位对应于数据总线的最低字节。
当单独的M9K存储器模块的PortA以及PortB数据位宽是8位或者9位的倍数时,字节使能仅适用于真双端口 (True Dual-Port) 存储器配置。
Packed 模式支持 (不知道这个模式有什么作用,怎么用)
Cyclone IV 器件 M9K 存储器模块支持 packed 模式。在下列条件下,您可以在单一模块中实现两个单端口存储器模块:
■ 每一个独立模块的容量均小于或等于 M9K 模块容量的一半。每一个独立模块的最大数据宽度为 18 位宽。
■ 每一个单端口存储器模块均被配置成单时钟模式。
Cyclone IV 器件仅支持读地址寄存器、输出寄存器以及输出锁存器的异步清零操作,输入寄存器 ( 除了读地址寄存器 ) 不支持异步清零。当对输出寄存器进行异步清零操作时,异步清零信号即刻对输出寄存器清零,效果立马可见。如果您的 RAM 不使用输出寄存器,那么通过使用输出锁存器异步清零特性,您仍然能够对 RAM 输出端进行清零。
在读操作过程中,对读地址寄存器置位异步清零有可能会导致存储数据的损坏。
通过使用 Quartus II RAM MegaWizard™Plug-In Manager,您可以有选择地使能每个逻辑存储器的异步清零功能。
通过三种方式可以对 M9K 模块中的寄存器进行复位:
■ 器件上电
■ 将aclr信号仅用于输出寄存器
■ 使用DEV_CLRn选项来进行全器件复位
Cyclone IV 器件 M9K 存储器模块不支持异步 ( 未寄存的 ) 存储器输入。
要选择所需的行为,需要在 Quartus II 的 RAM MegaWizard Plug-In Manager 中,将Read-During-Write选项设置成New Data或者Old Data。
一个 (w× m×n) 移位寄存器的容量是由输入数据宽度 (w)、抽头的长度 (m), 以及抽头的数量 (n) 来决定,并且必须小于或等于最大存储器位数 , 也就是 9,216 位。另外, (w×n) 的容量必须小于或等于模块的最大宽度,也就是 36 位。如果需要一个
当使用输入或输出时钟模式时,如果在同一地址位置执行同时读或写操作,则输出读数据将是未知的。如果要求输出数据是一个可预测值,则需要使用单时钟模式或者 I/O时钟模式,并且在 MegaWizard Plug-In Manager 中选择相应的 read-during-write 行为。
异步清零功能仅在读地址寄存器、输出寄存器,以及输出锁存器中可用。
如果采用异步清零会产生大量的逻辑——引用。或者是综合器发现不了你所描述的是memory从而使用大量的D触发器来实现——推断
不可以对同一地址进行写操作
即使存储器是预初始化的 ( 例如,使用一个.mif文件 ), 它也会通过输出端清零进行上电。 只有上电后的后续读操作会输出预初始化的值。
如果您的设计不要求 read-during-write, 那么在写操作期间或者存储器未操作期间,需要通过置低rden信号以降低功率。Quartus II 会自动对未使用的 M9K 存储器模块进行断电,从而降低静态功耗。(与最上面的那一段绿色背景字对比,是否矛盾呢,还是只有此种情况之下才可以进行降低功耗呢)