diff options
Diffstat (limited to 'fpga/usrp3/top/e31x/e31x_idle.v')
-rw-r--r-- | fpga/usrp3/top/e31x/e31x_idle.v | 473 |
1 files changed, 473 insertions, 0 deletions
diff --git a/fpga/usrp3/top/e31x/e31x_idle.v b/fpga/usrp3/top/e31x/e31x_idle.v new file mode 100644 index 000000000..b1f3b93b5 --- /dev/null +++ b/fpga/usrp3/top/e31x/e31x_idle.v @@ -0,0 +1,473 @@ +///////////////////////////////////////////////////////////////////// +// +// Copyright 2018-2019 Ettus Research, A National Instruments Brand +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +// Module: e31x +// Description: +// E31x Top Level Idle +// +///////////////////////////////////////////////////////////////////// + +module e31x ( + + // PS Connections + inout [53:0] MIO, + input PS_SRSTB, + input PS_CLK, + input PS_PORB, + inout DDR_CLK, + inout DDR_CLK_N, + inout DDR_CKE, + inout DDR_CS_N, + inout DDR_RAS_N, + inout DDR_CAS_N, + inout DDR_WEB, + inout [2:0] DDR_BANKADDR, + inout [14:0] DDR_ADDR, + inout DDR_ODT, + inout DDR_DRSTB, + inout [31:0] DDR_DQ, + inout [3:0] DDR_DM, + inout [3:0] DDR_DQS, + inout [3:0] DDR_DQS_N, + inout DDR_VRP, + inout DDR_VRN, + + //AVR SPI IO + input AVR_CS_R, + output AVR_IRQ, + output AVR_MISO_R, + input AVR_MOSI_R, + input AVR_SCK_R, + + input ONSWITCH_DB, + + // pps connections + input GPS_PPS, + input PPS_EXT_IN, + + // gpios, change to inout somehow + inout [5:0] PL_GPIO, + + // RF Board connections + inout [99:0] DB_IO +); + + // Clocks + wire bus_clk; + wire radio_clk; + wire reg_clk; + wire clk40; + wire FCLK_CLK0; + wire FCLK_CLK1; + + // Resets + wire global_rst; + wire bus_rst; + wire radio_rst; + wire reg_rstn; + wire clk40_rst; + wire clk40_rstn; + wire FCLK_RESET0_N; + + // PMU + wire [31:0] m_axi_pmu_araddr; + wire [2:0] m_axi_pmu_arprot; + wire m_axi_pmu_arready; + wire m_axi_pmu_arvalid; + wire [31:0] m_axi_pmu_awaddr; + wire [2:0] m_axi_pmu_awprot; + wire m_axi_pmu_awready; + wire m_axi_pmu_awvalid; + wire m_axi_pmu_bready; + wire [1:0] m_axi_pmu_bresp; + wire m_axi_pmu_bvalid; + wire [31:0] m_axi_pmu_rdata; + wire m_axi_pmu_rready; + wire [1:0] m_axi_pmu_rresp; + wire m_axi_pmu_rvalid; + wire [31:0] m_axi_pmu_wdata; + wire m_axi_pmu_wready; + wire [3:0] m_axi_pmu_wstrb; + wire m_axi_pmu_wvalid; + + ///////////////////////////////////////////////////////////////////// + // + // Resets: + // - PL - Bus Reset + // Radio Reset + // - PS - FCLK_RESET0_N --> clk40_rst(n) + // + ////////////////////////////////////////////////////////////////////// + + // Synchronous reset for the bus_clk domain + reset_sync bus_reset_gen ( + .clk(bus_clk), + .reset_in(~FCLK_RESET0_N), + //.reset_in(~clocks_locked), + .reset_out(bus_rst) + ); + + + // PS-based Resets // + // + // Synchronous reset for the clk40 domain. This is derived from the PS reset 0. + reset_sync clk40_reset_gen ( + .clk(clk40), + .reset_in(~FCLK_RESET0_N), + .reset_out(clk40_rst) + ); + // Invert for various modules. + assign clk40_rstn = ~clk40_rst; + assign reg_rstn = clk40_rstn; + + ///////////////////////////////////////////////////////////////////// + // + // Clocks and PPS + // + ///////////////////////////////////////////////////////////////////// + + wire [1:0] pps_select; + + assign clk40 = FCLK_CLK1; // 40 MHz + assign bus_clk = FCLK_CLK0; // 100 MHz + assign reg_clk = clk40; + + reg [2:0] pps_reg; + + wire pps_ext = PPS_EXT_IN; + wire gps_pps = GPS_PPS; + + // connect PPS input to GPIO so ntpd can use it + always @ (posedge bus_clk) + pps_reg <= bus_rst ? 3'b000 : {pps_reg[1:0], GPS_PPS}; + assign ps_gpio_in[8] = pps_reg[2]; // 62 + + ///////////////////////////////////////////////////////////////////// + // + // Power Button + // + ////////////////////////////////////////////////////////////////////// + + // register the debounced onswitch signal to detect edges, + // Note: ONSWITCH_DB is low active + reg [1:0] onswitch_edge; + always @ (posedge bus_clk) + onswitch_edge <= bus_rst ? 2'b00 : {onswitch_edge[0], ONSWITCH_DB}; + + wire button_press = ~ONSWITCH_DB & onswitch_edge[0] & onswitch_edge[1]; + wire button_release = ONSWITCH_DB & ~onswitch_edge[0] & ~onswitch_edge[1]; + + // stretch the pulse so IRQs don't get lost + reg [7:0] button_press_reg, button_release_reg; + always @ (posedge bus_clk) + if (bus_rst) begin + button_press_reg <= 8'h00; + button_release_reg <= 8'h00; + end else begin + button_press_reg <= {button_press_reg[6:0], button_press}; + button_release_reg <= {button_release_reg[6:0], button_release}; + end + + wire button_press_irq = |button_press_reg; + wire button_release_irq = |button_release_reg; + + ///////////////////////////////////////////////////////////////////// + // + // Interrupts Fabric to PS + // + ////////////////////////////////////////////////////////////////////// + + wire [15:0] IRQ_F2P; + wire pmu_irq; + assign IRQ_F2P = {12'b0, + pmu_irq, // Interrupt 32 + button_release_irq, // Interrupt 31 + button_press_irq, // Interrupt 30 + 1'b0}; + + ///////////////////////////////////////////////////////////////////// + // + // PS Connections + // + ////////////////////////////////////////////////////////////////////// + + wire [63:0] ps_gpio_in; + wire [63:0] ps_gpio_out; + wire [63:0] ps_gpio_tri; + + e31x_ps_bd e31x_ps_bd_inst ( + + // DDR Interface + .DDR_VRN(DDR_VRN), + .DDR_VRP(DDR_VRP), + .DDR_addr(DDR_ADDR), + .DDR_ba(DDR_BANKADDR), + .DDR_cas_n(DDR_CAS_N), + .DDR_ck_n(DDR_CLK_N), + .DDR_ck_p(DDR_CLK), + .DDR_cke(DDR_CKE), + .DDR_cs_n(DDR_CS_N), + .DDR_dm(DDR_DM), + .DDR_dq(DDR_DQ), + .DDR_dqs_n(DDR_DQS_N), + .DDR_dqs_p(DDR_DQS), + .DDR_odt(DDR_ODT), + .DDR_ras_n(DDR_RAS_N), + .DDR_reset_n(DDR_RESET_N), + .DDR_we_n(DDR_WE_N), + + // Clocks + .FCLK_CLK0(FCLK_CLK0), + .FCLK_CLK1(FCLK_CLK1), + .FCLK_CLK2(), + .FCLK_CLK3(), + + // Resets + .FCLK_RESET0_N(FCLK_RESET0_N), + + // GPIO + .GPIO_0_tri_i(ps_gpio_in), + .GPIO_0_tri_o(ps_gpio_out), + .GPIO_0_tri_t(ps_gpio_tri), + + // Interrupts + .IRQ_F2P(IRQ_F2P), + + // MIO + .MIO(MIO), + + .PS_CLK(PS_CLK), + .PS_PORB(PS_PORB), + .PS_SRSTB(PS_SRSTB), + + // SPI + .SPI0_MISO_I(), + .SPI0_MISO_O(), + .SPI0_MISO_T(), + .SPI0_MOSI_I(), + .SPI0_MOSI_O(), + .SPI0_MOSI_T(), + .SPI0_SCLK_I(), + .SPI0_SCLK_O(), + .SPI0_SCLK_T(), + .SPI0_SS1_O(), + .SPI0_SS2_O(), + .SPI0_SS_I(), + .SPI0_SS_O(), + .SPI0_SS_T(), + + .SPI1_MISO_I(), + .SPI1_MISO_O(), + .SPI1_MISO_T(), + .SPI1_MOSI_I(), + .SPI1_MOSI_O(), + .SPI1_MOSI_T(), + .SPI1_SCLK_I(), + .SPI1_SCLK_O(), + .SPI1_SCLK_T(), + .SPI1_SS1_O(), + .SPI1_SS2_O(), + .SPI1_SS_I(), + .SPI1_SS_O(), + .SPI1_SS_T(), + + // USB + .USBIND_0_port_indctl(), + .USBIND_0_vbus_pwrfault(), + .USBIND_0_vbus_pwrselect(), + + .bus_clk(bus_clk), + .bus_rstn(~bus_rst), + .clk40(clk40), + .clk40_rstn(clk40_rstn), + .S_AXI_GP0_ACLK(clk40), + .S_AXI_GP0_ARESETN(clk40_rstn), + + // XBAR Regport + .m_axi_xbar_araddr(), + .m_axi_xbar_arprot(), + .m_axi_xbar_arready(), + .m_axi_xbar_arvalid(), + .m_axi_xbar_awaddr(), + .m_axi_xbar_awprot(), + .m_axi_xbar_awready(), + .m_axi_xbar_awvalid(), + .m_axi_xbar_bready(), + .m_axi_xbar_bresp(), + .m_axi_xbar_bvalid(), + .m_axi_xbar_rdata(), + .m_axi_xbar_rready(), + .m_axi_xbar_rresp(), + .m_axi_xbar_rvalid(), + .m_axi_xbar_wdata(), + .m_axi_xbar_wready(), + .m_axi_xbar_wstrb(), + .m_axi_xbar_wvalid(), + + // PMU + .m_axi_pmu_araddr(m_axi_pmu_araddr), + .m_axi_pmu_arprot(m_axi_pmu_arprot), + .m_axi_pmu_arready(m_axi_pmu_arready), + .m_axi_pmu_arvalid(m_axi_pmu_arvalid), + .m_axi_pmu_awaddr(m_axi_pmu_awaddr), + .m_axi_pmu_awprot(m_axi_pmu_awprot), + .m_axi_pmu_awready(m_axi_pmu_awready), + .m_axi_pmu_awvalid(m_axi_pmu_awvalid), + .m_axi_pmu_bready(m_axi_pmu_bready), + .m_axi_pmu_bresp(m_axi_pmu_bresp), + .m_axi_pmu_bvalid(m_axi_pmu_bvalid), + .m_axi_pmu_rdata(m_axi_pmu_rdata), + .m_axi_pmu_rready(m_axi_pmu_rready), + .m_axi_pmu_rresp(m_axi_pmu_rresp), + .m_axi_pmu_rvalid(m_axi_pmu_rvalid), + .m_axi_pmu_wdata(m_axi_pmu_wdata), + .m_axi_pmu_wready(m_axi_pmu_wready), + .m_axi_pmu_wstrb(m_axi_pmu_wstrb), + .m_axi_pmu_wvalid(m_axi_pmu_wvalid), + + // DMA + .s_axis_dma_tdata(), + .s_axis_dma_tdest(), + .s_axis_dma_tlast(), + .s_axis_dma_tready(), + .s_axis_dma_tvalid(1'b0), + .m_axis_dma_tdata(), + .m_axis_dma_tuser(), + .m_axis_dma_tlast(), + .m_axis_dma_tready(1'b1), + .m_axis_dma_tvalid() + ); + + ///////////////////////////////////////////////////////////////////// + // + // PMU + // + ////////////////////////////////////////////////////////////////////// + + axi_pmu inst_axi_pmu ( + .s_axi_aclk(clk40), // TODO: Original design used bus_clk + .s_axi_areset(clk40_rst), + + .ss(AVR_CS_R), + .mosi(AVR_MOSI_R), + .sck(AVR_SCK_R), + .miso(AVR_MISO_R), + + // AXI4-Lite: Write address port (domain: s_axi_aclk) + .s_axi_awaddr(m_axi_pmu_awaddr), + .s_axi_awvalid(m_axi_pmu_awvalid), + .s_axi_awready(m_axi_pmu_awready), + // AXI4-Lite: Write data port (domain: s_axi_aclk) + .s_axi_wdata(m_axi_pmu_wdata), + .s_axi_wstrb(m_axi_pmu_wstrb), + .s_axi_wvalid(m_axi_pmu_wvalid), + .s_axi_wready(m_axi_pmu_wready), + // AXI4-Lite: Write response port (domain: s_axi_aclk) + .s_axi_bresp(m_axi_pmu_bresp), + .s_axi_bvalid(m_axi_pmu_bvalid), + .s_axi_bready(m_axi_pmu_bready), + // AXI4-Lite: Read address port (domain: s_axi_aclk) + .s_axi_araddr(m_axi_pmu_araddr), + .s_axi_arvalid(m_axi_pmu_arvalid), + .s_axi_arready(m_axi_pmu_arready), + // AXI4-Lite: Read data port (domain: s_axi_aclk) + .s_axi_rdata(m_axi_pmu_rdata), + .s_axi_rresp(m_axi_pmu_rresp), + .s_axi_rvalid(m_axi_pmu_rvalid), + .s_axi_rready(m_axi_pmu_rready), + + .s_axi_irq(pmu_irq) + ); + + assign AVR_IRQ = 1'b0; + + localparam DB_E31X_IDLE_OUT = { + 1'b0, /* DB_EXP_18_24 (99) */ + 13'b0000000000000, /* leds & rx bandsels */ + 1'b0, /* CAT_FB_CLK (85) */ + 1'b0, /* CAT_TX_FRAME (84) */ + 1'b0, /* CAT_RX_DATA_CLK (83) */ + 25'b0000_0000_0000_0000_0000_0000_0, /* CAT_RX_FRAME(81), CAT_P0 & CAT_P1 (58)*/ + 1'b0, /* CAT_SYNC(57) */ + 4'b0000, /* CAT_ENAGC(56), CAT_BBCLK_OUT (55), CAT_ENABLE(54), CAT_TXNRX(53) */ + 3'b000, /* DB_EXP_1_8_V_{33,34,32} */ + 2'b00, /* CAT_CTRL_IN[1:0] (49,48) */ + 1'b0, /* CAT_MISO (47) */ + 4'b0000, /* CAT_{MOSI,SCLK,CS,RESETn) (46,45, 44, 43) */ + 1'b0, /* DB_1_8V_31 (42) */ + 8'h00, /* CAT_CTRL_OUT (41:34) */ + 1'b0, /* DB_1_8V_11 (33) */ + 1'b0, /* CAT_CTRL_IN3 (32) */ + 1'b0, /* DB_1_8V_10 (31) */ + 1'b0, /* CAT_CTRL_IN2 (30) */ + 1'b0, /* DB_1_8V_9 (29) */ + 1'b0, /* VCRX2_V2 (28) */ + 1'b0, /* DB_1_8V_8 (25) */ + 1'b0, /* VCRX2_V1 (26) */ + 1'b0, /* DB_1_8V_7 (25) */ + 1'b0, /* VCRX1_V2 (24) */ + 1'b0, /* DB_1_8V_6 (23) */ + 1'b0, /* VCRX1_V1 (22) */ + 1'b0, /* DB_1_8V_5 (21) */ + 1'b0, /* VCTXRX1_V2 (20) */ + 1'b0, /* DB_1_8V_4 (19) */ + 1'b0, /* VCTXRX1_V1 (18) */ + 1'b0, /* DB_1_8V_3 (17) */ + 1'b0, /* VCTXRX2_V1 (16) */ + 1'b1, /* DB_1_8V_2 (15) */ + 15'd0}; + + localparam DB_E31X_IDLE_DDR = { + 1'b0, /* DB_EXP_18_24 (99) */ + 13'b0101010101010, /* leds & rx bandsels */ + 1'b0, /* CAT_FB_CLK (85) */ + 1'b0, /* CAT_TX_FRAME (84) */ + 1'b0, /* CAT_RX_DATA_CLK (83) */ + 25'b0000_0000_0000_0000_0000_0000_0, /* CAT_RX_FRAME(81), CAT_P0 & CAT_P1 (58) */ + 1'b0, /* CAT_SYNC(57) */ + 4'b0001, /* CAT_ENAGC(56), CAT_BBCLK_OUT (55), CAT_ENABLE(54), CAT_TXNRX(53) */ + 3'b000, /* DB_EXP_1_8_V_{32,33,34,} (52, 51, 50) */ + 2'b00, /* CAT_CTRL_IN[1:0] (49,48) */ + 1'b0, /* CAT_MISO (47) */ + 4'b0111, /* CAT_{MOSI,SCLK,CS,RESETn) (46, 45, 44, 43) */ + 1'b0, /* DB_1_8V_31 (42) */ + 8'h00, /* CAT_CTRL_OUT (41:34) */ + 1'b0, /* DB_1_8V_11 (33) */ + 1'b0, /* CAT_CTRL_IN3 (32) */ + 1'b0, /* DB_1_8V_10 (31) */ + 1'b0, /* CAT_CTRL_IN2 (30) */ + 1'b0, /* DB_1_8V_9 (29) */ + 1'b0, /* VCRX2_V2 (28) */ + 1'b0, /* DB_1_8V_8 (25) */ + 1'b0, /* VCRX2_V1 (26) */ + 1'b0, /* DB_1_8V_7 (24) */ + 1'b0, /* VCRX1_V2 (24) */ + 1'b0, /* DB_1_8V_6 (23) */ + 1'b0, /* VCRX1_V1 (22) */ + 1'b0, /* DB_1_8V_5 (21) */ + 1'b0, /* VCTXRX1_V1 (20) */ + 1'b0, /* DB_1_8V_4 (19) */ + 1'b0, /* VCTXRX1_V2 (18) */ + 1'b1, /* DB_1_8V_3 (17) */ + 1'b0, /* VCTXRX2_V1 (16) */ + 1'b1, /* DB_1_8V_2 (15) */ + 15'd0}; + + localparam NUM_DB_IO_PINS = 100; + + wire [NUM_DB_IO_PINS-1:0] db_ddr = DB_E31X_IDLE_DDR; + wire [NUM_DB_IO_PINS-1:0] db_out = DB_E31X_IDLE_OUT; + wire [NUM_DB_IO_PINS-1:0] db_in; + + + genvar k; + generate + for (k = 0; k < NUM_DB_IO_PINS; k = k+1) begin + IOBUF db_io_i(.O(db_in[k]), .IO(DB_IO[k]), .I(db_out[k]), .T(~db_ddr[k])); + end + endgenerate + +endmodule // e31x |