仅对英特尔可见 — GUID: mwh1409959584770
Ixiasoft
1.4.1.1. 使用同步存储器模块
1.4.1.2. 避免不受支持的复位和控制条件
1.4.1.3. 检查Read-During-Write行为
1.4.1.4. 控制RAM推断和实现
1.4.1.5. 具有旧数据Read-During-Write行为的单时钟同步RAM
具有旧数据Read-During-Write行为的Verilog HDL、单时钟、简单双端口同步RAM
具有旧数据Read-During-Write行为的VHDL、单时钟、简单双端口同步RAM
1.4.1.6. 具有新数据Read-During-Write行为的单时钟同步RAM
1.4.1.7. 简单双端口,双时钟同步RAM
1.4.1.8. 真双端口同步RAM
1.4.1.9. 混合宽度双端口RAM
1.4.1.10. 带Byte-Enable信号的RAM
1.4.1.11. 指定上电时的初始存储器内容
仅对英特尔可见 — GUID: mwh1409959584770
Ixiasoft
1.4.1.5. 具有旧数据Read-During-Write行为的单时钟同步RAM
本节中的代码示例显示了推断简单双端口,单时钟同步RAM的Verilog HDL和VHDL代码。单端口RAM模块使用类似的编码样式。
这些示例中的read-during-write行为是读取存储器地址上的旧数据。为了在MLAB存储器中获得最佳性能,请使用相应的属性,以使您的设计在写操作期间不依赖于读取的数据。简单双端口RAM代码示例直接映射到英特尔同步存储器。
根据不同的器件系列,单端口版本的存储器模块(即使用相同的读地址和写地址信号)比双端口存储器模块具有更好的RAM利用率。有关目标器件的建议,请参考相应的器件手册。
具有旧数据Read-During-Write行为的Verilog HDL、单时钟、简单双端口同步RAM
module single_clk_ram( output reg [7:0] q, input [7:0] d, input [4:0] write_address, read_address, input we, clk ); reg [7:0] mem [31:0]; always @ (posedge clk) begin if (we) mem[write_address] <= d; q <= mem[read_address]; // q doesn't get d in this clock cycle end endmodule
具有旧数据Read-During-Write行为的VHDL、单时钟、简单双端口同步RAM
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY single_clock_ram IS PORT ( clock: IN STD_LOGIC; data: IN STD_LOGIC_VECTOR (7 DOWNTO 0); write_address: IN INTEGER RANGE 0 to 31; read_address: IN INTEGER RANGE 0 to 31; we: IN STD_LOGIC; q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END single_clock_ram; ARCHITECTURE rtl OF single_clock_ram IS TYPE MEM IS ARRAY(0 TO 31) OF STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL ram_block: MEM; BEGIN PROCESS (clock) BEGIN IF (rising_edge(clock)) THEN IF (we = '1') THEN ram_block(write_address) <= data; END IF; q <= ram_block(read_address); -- VHDL semantics imply that q doesn't get data -- in this clock cycle END IF; END PROCESS; END rtl;
注: 此single_clock_ram的小尺寸导致Compiler将存储器推断为MLAB存储器模块,而不是M20K存储器模块。如果single_clock_ram指定一个较大的宽度,那么Compiler会将存储器推断为M20K存储器模块。