aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/e31x/e31x_core.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/top/e31x/e31x_core.v')
-rw-r--r--fpga/usrp3/top/e31x/e31x_core.v194
1 files changed, 194 insertions, 0 deletions
diff --git a/fpga/usrp3/top/e31x/e31x_core.v b/fpga/usrp3/top/e31x/e31x_core.v
index 6e1d2ed80..99675262b 100644
--- a/fpga/usrp3/top/e31x/e31x_core.v
+++ b/fpga/usrp3/top/e31x/e31x_core.v
@@ -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,
@@ -658,6 +678,134 @@ module e31x_core #(
);
/////////////////////////////////////////////////////////////////////////////
+ // 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),