fpga: e31x: Add DRAM support

This adds DRAM support to E31x devices. Due to the size of the DDR3
memory controller, it is not enabled by default. You can include the
memory controller IP in the build by adding the DRAM environment
variable to your build. For example:

DRAM=1 make E310_SG3


Original-commit: 788fef11ef890c6dcee3be495fc381bcf2990d3b
This commit is contained in:
Wade Fife
2022-02-10 18:13:44 -07:00
parent 83ad8e36ba
commit c322899053
15 changed files with 1499 additions and 99 deletions
+194
View File
@@ -35,6 +35,7 @@ module e31x_core #(
input wire bus_clk,
input wire bus_rst,
input wire clk40,
input wire clk200,
// Motherboard Registers: AXI lite interface
input wire s_axi_aclk,
@@ -95,6 +96,25 @@ module e31x_core #(
input wire [32*NUM_CHANNELS-1:0] rx,
output wire [32*NUM_CHANNELS-1:0] tx,
// DRAM Controller Clock
input wire ddr3_sys_clk,
// DRAM Chip Interface
output wire [14:0] ddr3_addr,
output wire [ 2:0] ddr3_ba,
output wire ddr3_cas_n,
output wire [ 0:0] ddr3_ck_n,
output wire [ 0:0] ddr3_ck_p,
output wire [ 0:0] ddr3_cke,
output wire ddr3_ras_n,
output wire ddr3_reset_n,
output wire ddr3_we_n,
inout wire [15:0] ddr3_dq,
inout wire [ 1:0] ddr3_dqs_n,
inout wire [ 1:0] ddr3_dqs_p,
output wire [ 1:0] ddr3_dm,
output wire [ 0:0] ddr3_odt,
// DMA xport adapter to PS
input wire [63:0] s_dma_tdata,
input wire s_dma_tlast,
@@ -657,6 +677,134 @@ module e31x_core #(
.tb_period_ns_q32 ()
);
/////////////////////////////////////////////////////////////////////////////
// PL DDR3 Memory Interface
/////////////////////////////////////////////////////////////////////////////
localparam NUM_PORTS = 2;
localparam AXI_DWIDTH = 64;
wire [ 32*NUM_PORTS-1:0] dram_axi_araddr;
wire [ 2*NUM_PORTS-1:0] dram_axi_arburst;
wire [ 4*NUM_PORTS-1:0] dram_axi_arcache;
wire [ 1*NUM_PORTS-1:0] dram_axi_arid;
wire [ 8*NUM_PORTS-1:0] dram_axi_arlen;
wire [ 1*NUM_PORTS-1:0] dram_axi_arlock;
wire [ 3*NUM_PORTS-1:0] dram_axi_arprot;
wire [ 4*NUM_PORTS-1:0] dram_axi_arqos;
wire [ 1*NUM_PORTS-1:0] dram_axi_arready;
wire [ 4*NUM_PORTS-1:0] dram_axi_arregion;
wire [ 3*NUM_PORTS-1:0] dram_axi_arsize;
wire [ 1*NUM_PORTS-1:0] dram_axi_arvalid;
wire [ 32*NUM_PORTS-1:0] dram_axi_awaddr;
wire [ 2*NUM_PORTS-1:0] dram_axi_awburst;
wire [ 4*NUM_PORTS-1:0] dram_axi_awcache;
wire [ 1*NUM_PORTS-1:0] dram_axi_awid;
wire [ 8*NUM_PORTS-1:0] dram_axi_awlen;
wire [ 1*NUM_PORTS-1:0] dram_axi_awlock;
wire [ 3*NUM_PORTS-1:0] dram_axi_awprot;
wire [ 4*NUM_PORTS-1:0] dram_axi_awqos;
wire [ 1*NUM_PORTS-1:0] dram_axi_awready;
wire [ 4*NUM_PORTS-1:0] dram_axi_awregion;
wire [ 3*NUM_PORTS-1:0] dram_axi_awsize;
wire [ 1*NUM_PORTS-1:0] dram_axi_awvalid;
wire [ 1*NUM_PORTS-1:0] dram_axi_bid;
wire [ 1*NUM_PORTS-1:0] dram_axi_bready;
wire [ 2*NUM_PORTS-1:0] dram_axi_bresp;
wire [ 1*NUM_PORTS-1:0] dram_axi_bvalid;
wire [ AXI_DWIDTH*NUM_PORTS-1:0] dram_axi_rdata;
wire [ 1*NUM_PORTS-1:0] dram_axi_rid;
wire [ 1*NUM_PORTS-1:0] dram_axi_rlast;
wire [ 1*NUM_PORTS-1:0] dram_axi_rready;
wire [ 2*NUM_PORTS-1:0] dram_axi_rresp;
wire [ 1*NUM_PORTS-1:0] dram_axi_rvalid;
wire [ AXI_DWIDTH*NUM_PORTS-1:0] dram_axi_wdata;
wire [ 1*NUM_PORTS-1:0] dram_axi_wlast;
wire [ 1*NUM_PORTS-1:0] dram_axi_wready;
wire [AXI_DWIDTH/8*NUM_PORTS-1:0] dram_axi_wstrb;
wire [ 1*NUM_PORTS-1:0] dram_axi_wvalid;
wire dram_clk;
wire dram_rst;
`ifdef ENABLE_DRAM
begin : gen_dram
wire clk200_rst;
synchronizer synchronizer_clk200_rst (
.clk(clk200 ),
.rst(1'b0 ),
.in (bus_rst ),
.out(clk200_rst)
);
e31x_dram #(
.AXI_DWIDTH(AXI_DWIDTH),
.NUM_PORTS (NUM_PORTS )
) e31x_dram_i (
.sys_rst (bus_rst ),
.ddr3_sys_clk (ddr3_sys_clk ),
.clk200 (clk200 ),
.clk200_rst (clk200_rst ),
.ddr3_addr (ddr3_addr ),
.ddr3_ba (ddr3_ba ),
.ddr3_cas_n (ddr3_cas_n ),
.ddr3_ck_n (ddr3_ck_n ),
.ddr3_ck_p (ddr3_ck_p ),
.ddr3_cke (ddr3_cke ),
.ddr3_ras_n (ddr3_ras_n ),
.ddr3_reset_n (ddr3_reset_n ),
.ddr3_we_n (ddr3_we_n ),
.ddr3_dq (ddr3_dq ),
.ddr3_dqs_n (ddr3_dqs_n ),
.ddr3_dqs_p (ddr3_dqs_p ),
.ddr3_dm (ddr3_dm ),
.ddr3_odt (ddr3_odt ),
.dram_clk (dram_clk ),
.dram_rst (dram_rst ),
.dram_axi_araddr (dram_axi_araddr ),
.dram_axi_arburst (dram_axi_arburst ),
.dram_axi_arcache (dram_axi_arcache ),
.dram_axi_arid (dram_axi_arid ),
.dram_axi_arlen (dram_axi_arlen ),
.dram_axi_arlock (dram_axi_arlock ),
.dram_axi_arprot (dram_axi_arprot ),
.dram_axi_arqos (dram_axi_arqos ),
.dram_axi_arready (dram_axi_arready ),
.dram_axi_arregion(dram_axi_arregion),
.dram_axi_arsize (dram_axi_arsize ),
.dram_axi_arvalid (dram_axi_arvalid ),
.dram_axi_awaddr (dram_axi_awaddr ),
.dram_axi_awburst (dram_axi_awburst ),
.dram_axi_awcache (dram_axi_awcache ),
.dram_axi_awid (dram_axi_awid ),
.dram_axi_awlen (dram_axi_awlen ),
.dram_axi_awlock (dram_axi_awlock ),
.dram_axi_awprot (dram_axi_awprot ),
.dram_axi_awqos (dram_axi_awqos ),
.dram_axi_awready (dram_axi_awready ),
.dram_axi_awregion(dram_axi_awregion),
.dram_axi_awsize (dram_axi_awsize ),
.dram_axi_awvalid (dram_axi_awvalid ),
.dram_axi_bid (dram_axi_bid ),
.dram_axi_bready (dram_axi_bready ),
.dram_axi_bresp (dram_axi_bresp ),
.dram_axi_bvalid (dram_axi_bvalid ),
.dram_axi_rdata (dram_axi_rdata ),
.dram_axi_rid (dram_axi_rid ),
.dram_axi_rlast (dram_axi_rlast ),
.dram_axi_rready (dram_axi_rready ),
.dram_axi_rresp (dram_axi_rresp ),
.dram_axi_rvalid (dram_axi_rvalid ),
.dram_axi_wdata (dram_axi_wdata ),
.dram_axi_wlast (dram_axi_wlast ),
.dram_axi_wready (dram_axi_wready ),
.dram_axi_wstrb (dram_axi_wstrb ),
.dram_axi_wvalid (dram_axi_wvalid )
);
end // gen_dram
`endif
/////////////////////////////////////////////////////////////////////////////
//
// RFNoC Image Core
@@ -671,6 +819,7 @@ module e31x_core #(
.core_arst (bus_rst ),
.device_id (device_id ),
.radio_clk (radio_clk ),
.dram_clk (dram_clk ),
.m_ctrlport_req_wr (m_ctrlport_req_wr ),
.m_ctrlport_req_rd (m_ctrlport_req_rd ),
.m_ctrlport_req_addr (m_ctrlport_req_addr ),
@@ -688,6 +837,51 @@ module e31x_core #(
.radio_tx_stb ({tx_stb[1], tx_stb[0] }),
.radio_tx_data ({tx_data[1], tx_data[0] }),
.radio_tx_running ({tx_running[1], tx_running[0]}),
.axi_rst (dram_rst),
.m_axi_awid (dram_axi_awid),
.m_axi_awaddr (dram_axi_awaddr),
.m_axi_awlen (dram_axi_awlen),
.m_axi_awsize (dram_axi_awsize),
.m_axi_awburst (dram_axi_awburst),
.m_axi_awlock (dram_axi_awlock),
.m_axi_awcache (dram_axi_awcache),
.m_axi_awprot (dram_axi_awprot),
.m_axi_awqos (dram_axi_awqos),
.m_axi_awregion (dram_axi_awregion),
.m_axi_awuser (),
.m_axi_awvalid (dram_axi_awvalid),
.m_axi_awready (dram_axi_awready),
.m_axi_wdata (dram_axi_wdata),
.m_axi_wstrb (dram_axi_wstrb),
.m_axi_wlast (dram_axi_wlast),
.m_axi_wuser (),
.m_axi_wvalid (dram_axi_wvalid),
.m_axi_wready (dram_axi_wready),
.m_axi_bid (dram_axi_bid),
.m_axi_bresp (dram_axi_bresp),
.m_axi_buser (4'b0),
.m_axi_bvalid (dram_axi_bvalid),
.m_axi_bready (dram_axi_bready),
.m_axi_arid (dram_axi_arid),
.m_axi_araddr (dram_axi_araddr),
.m_axi_arlen (dram_axi_arlen),
.m_axi_arsize (dram_axi_arsize),
.m_axi_arburst (dram_axi_arburst),
.m_axi_arlock (dram_axi_arlock),
.m_axi_arcache (dram_axi_arcache),
.m_axi_arprot (dram_axi_arprot),
.m_axi_arqos (dram_axi_arqos),
.m_axi_arregion (dram_axi_arregion),
.m_axi_aruser (),
.m_axi_arvalid (dram_axi_arvalid),
.m_axi_arready (dram_axi_arready),
.m_axi_rid (dram_axi_rid),
.m_axi_rdata (dram_axi_rdata),
.m_axi_rresp (dram_axi_rresp),
.m_axi_rlast (dram_axi_rlast),
.m_axi_ruser (4'b0),
.m_axi_rvalid (dram_axi_rvalid),
.m_axi_rready (dram_axi_rready),
.s_dma_tdata (s_dma_tdata),
.s_dma_tlast (s_dma_tlast),
.s_dma_tvalid (s_dma_tvalid),