Intel® Quartus® Prime Pro Edition用户指南: 设计建议

ID 683082
日期 9/28/2020
Public

本文档可提供新的版本。客户应 单击此处 前往查看最新版本。

文档目录

1.4.1.5. 具有旧数据Read-During-Write行为的单时钟同步RAM

本节中的代码示例显示了推断简单双端口,单时钟同步RAM的Verilog HDL和VHDL代码。单端口RAM模块使用类似的编码样式。

这些示例中的read-during-write行为是读取存储器地址上的旧数据。为了在MLAB存储器中获得最佳性能,请使用相应的属性,以使您的设计在写操作期间不依赖于读取的数据。简单双端口RAM代码示例直接映射到Intel同步存储器。

根据不同的器件系列,单端口版本的存储器模块(即使用相同的读地址和写地址信号)比双端口存储器模块具有更好的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存储器模块。