Xilinx Ultrascale系列FPGA包含URAM资源,在Vivado IP Catalog中无法通过GUI方式对URAM进行例化,下面是通过XPM例化一个真双口URAM,PortA和PortB使用同一时钟,地址位宽12bit,数据位宽256bit,深度为3072,内存容量为1048576bit,字节写使能为32bit。
xpm_memory_tdpram
#(
.ADDR_WIDTH_A(12),
.ADDR_WIDTH_B(12),
.AUTO_SLEEP_TIME(0),
.BYTE_WRITE_WIDTH_A(8),
.BYTE_WRITE_WIDTH_B(8),
.CASCADE_HEIGHT(0),
.CLOCKING_MODE("common_clock"),
.ECC_MODE("no_ecc"),
.MEMORY_INIT_FILE("none"),
.MEMORY_INIT_PARAM("0"),
.MEMORY_OPTIMIZATION("true"),
.MEMORY_PRIMITIVE("ultra"),
.MEMORY_SIZE(1048576),
.MESSAGE_CONTROL(0),
.READ_DATA_WIDTH_A(256),
.READ_DATA_WIDTH_B(256),
.READ_LATENCY_A(1),
.READ_LATENCY_B(1),
.READ_RESET_VALUE_A("0"),
.READ_RESET_VALUE_B("0"),
.RST_MODE_A("SYNC"),
.RST_MODE_B("SYNC"),
.SIM_ASSERT_CHK(0),
.USE_EMBEDDED_CONSTRAINT(0),
.USE_MEM_INIT(1),
.WAKEUP_TIME("disable_sleep"),
.WRITE_DATA_WIDTH_A(256),
.WRITE_DATA_WIDTH_B(256),
.WRITE_MODE_A("no_change"),
.WRITE_MODE_B("no_change")
)
xpm_memory_tdpram_inst
(
.dbiterra(),
.dbiterrb(),
.douta(porta_rd_data),
.doutb(portb_rd_data),
.sbiterra(),
.sbiterrb(),
.addra(porta_addr[11:0]),
.addrb(portb_addr[11:0]),
.clka(user_clk),
.clkb(user_clk),
.dina(porta_wr_data),
.dinb(portb_wr_data),
.ena(1'b1),
.enb(1'b1),
.injectdbiterra(),
.injectdbiterrb(),
.injectsbiterra(),
.injectsbiterrb(),
.regcea(1'b0),
.regceb(1'b0),
.rsta(~reset_n),
.rstb(~reset_n),
.sleep(1'b0),
.wea(porta_wea),
.web(portb_wea)
);
// 1个URAM容量 = 72bit X 4096 = 288Kbit = 36KB
// 由于上述RAM接口位宽是256bit,所以需要消耗4个URAM资源