osmo-e1-hardware/gateware/icE1usb/rtl/top.v

389 lines
7.5 KiB
Verilog

/*
* top.v
*
* vim: ts=4 sw=4
*
* Top-level for the icE1usb production boards
*
* Copyright (C) 2019-2020 Sylvain Munaut <tnt@246tNt.com>
* SPDX-License-Identifier: CERN-OHL-S-2.0
*/
`default_nettype none
module top (
// E1 PHY
input wire e1A_rx_hi_p,
// input wire e1A_rx_hi_n,
input wire e1A_rx_lo_p,
// input wire e1A_rx_lo_n,
output wire e1A_tx_hi,
output wire e1A_tx_lo,
input wire e1B_rx_hi_p,
// input wire e1B_rx_hi_n,
input wire e1B_rx_lo_p,
// input wire e1B_rx_lo_n,
output wire e1B_tx_hi,
output wire e1B_tx_lo,
output wire [1:0] e1_rx_bias,
// USB
inout wire usb_dp,
inout wire usb_dn,
output wire usb_pu,
// Flash
inout wire flash_mosi,
inout wire flash_miso,
inout wire flash_clk,
inout wire flash_cs_n,
// LED Shift register + Button input
inout wire e1_led_rclk,
// GPS
output wire gps_reset_n,
input wire gps_rx,
output wire gps_tx,
input wire gps_pps,
// I2C
inout wire i2c_sda,
inout wire i2c_scl,
// GPIOs
inout wire [2:0] gpio,
// Clock (30.72 MHz)
input wire clk_in,
output wire clk_tune_hi,
output wire clk_tune_lo,
// Debug UART
input wire dbg_rx,
output wire dbg_tx,
// RGB LEDs
output wire [2:0] rgb
);
localparam integer WB_N = 3;
genvar i;
// Signals
// -------
// Flash SPI internal signals
wire flash_mosi_i, flash_miso_i, flash_clk_i;
wire flash_mosi_o, flash_miso_o, flash_clk_o;
wire flash_mosi_oe, flash_miso_oe, flash_clk_oe;
wire flash_csn_o;
// Peripheral wishbone
wire [15:0] wb_addr;
wire [31:0] wb_rdata [0:WB_N-1];
wire [31:0] wb_wdata;
wire [ 3:0] wb_wmsk;
wire wb_we;
wire [WB_N-1:0] wb_cyc;
wire [WB_N-1:0] wb_ack;
wire [(WB_N*32)-1:0] wb_rdata_flat;
// Ticks
wire [1:0] tick_e1_rx;
wire [1:0] tick_e1_tx;
wire tick_usb_sof;
// I2C
wire i2c_scl_oe;
wire i2c_sda_oe;
wire i2c_sda_i;
// Led & Button
wire [7:0] e1_led_state;
wire e1_led_run;
wire e1_led_active;
wire spi_req;
wire spi_gnt;
wire [7:0] sr_val;
wire sr_go;
wire sr_rdy;
wire btn_val;
wire btn_stb;
// Clocks / Reset
wire rst_req;
wire clk_sys;
wire rst_sys;
wire clk_48m;
wire rst_48m;
// SoC base
// --------
// Instance
soc_base #(
.WB_N(WB_N),
.E1_N(2),
.E1_UNIT_HAS_RX(2'b01),
.E1_UNIT_HAS_TX(2'b01),
.E1_LIU(0)
) soc_I (
.e1_rx_hi_p ({e1B_rx_hi_p, e1A_rx_hi_p}),
// .e1_rx_hi_n ({e1B_rx_hi_n, e1A_rx_hi_n}),
.e1_rx_lo_p ({e1B_rx_lo_p, e1A_rx_lo_p}),
// .e1_rx_lo_n ({e1B_rx_lo_n, e1A_rx_lo_n}),
.e1_tx_hi ({e1B_tx_hi, e1A_tx_hi }),
.e1_tx_lo ({e1B_tx_lo, e1A_tx_lo }),
.e1_rx_data (),
.e1_rx_clk (),
.e1_tx_data (),
.e1_tx_clk (),
.usb_dp (usb_dp),
.usb_dn (usb_dn),
.usb_pu (usb_pu),
.flash_mosi_i (flash_mosi_i),
.flash_mosi_o (flash_mosi_o),
.flash_mosi_oe(flash_mosi_oe),
.flash_miso_i (flash_miso_i),
.flash_miso_o (flash_miso_o),
.flash_miso_oe(flash_miso_oe),
.flash_clk_i (flash_clk_i),
.flash_clk_o (flash_clk_o),
.flash_clk_oe (flash_clk_oe),
.flash_csn_o (flash_csn_o),
.dbg_rx (dbg_rx),
.dbg_tx (dbg_tx),
.rgb (rgb),
.wb_m_addr (wb_addr),
.wb_m_rdata (wb_rdata_flat),
.wb_m_wdata (wb_wdata),
.wb_m_wmsk (wb_wmsk),
.wb_m_we (wb_we),
.wb_m_cyc (wb_cyc),
.wb_m_ack (wb_ack),
.tick_e1_rx (tick_e1_rx),
.tick_e1_tx (tick_e1_tx),
.tick_usb_sof (tick_usb_sof),
.clk_sys (clk_sys),
.rst_sys (rst_sys),
.clk_48m (clk_48m),
.rst_48m (rst_48m)
);
// WB read data flattening
for (i=0; i<WB_N; i=i+1)
assign wb_rdata_flat[i*32+:32] = wb_rdata[i];
// Dummy channel
// -------------
wire [1:0] e1_dummy;
SB_IO #(
.PIN_TYPE(6'b000000),
.PULLUP(1'b0),
.NEG_TRIGGER(1'b0),
.IO_STANDARD("SB_LVDS_INPUT")
) e1_dummy_rx_I[1:0] (
.PACKAGE_PIN({e1B_rx_hi_p, e1B_rx_lo_p}),
.LATCH_INPUT_VALUE(1'b0),
.CLOCK_ENABLE(1'b1),
.INPUT_CLK(clk_sys),
.OUTPUT_CLK(1'b0),
.OUTPUT_ENABLE(1'b0),
.D_OUT_0(1'b0),
.D_OUT_1(1'b0),
.D_IN_0(e1_dummy),
.D_IN_1()
);
SB_IO #(
.PIN_TYPE(6'b010100),
.PULLUP(1'b0),
.NEG_TRIGGER(1'b0),
.IO_STANDARD("SB_LVCMOS")
) e1_dummy_tx_I[1:0] (
.PACKAGE_PIN({e1B_tx_hi, e1B_tx_lo}),
.LATCH_INPUT_VALUE(1'b0),
.CLOCK_ENABLE(1'b1),
.INPUT_CLK(1'b0),
.OUTPUT_CLK(clk_sys),
.OUTPUT_ENABLE(1'b0),
.D_OUT_0(e1_dummy),
.D_OUT_1(1'b0),
.D_IN_0(),
.D_IN_1()
);
// Misc [0]
// ----
misc misc_I (
.e1_rx_bias (e1_rx_bias),
.clk_tune_hi (clk_tune_hi),
.clk_tune_lo (clk_tune_lo),
.gps_reset_n (gps_reset_n),
.gps_pps (gps_pps),
.gpio (gpio),
.e1_led_state (e1_led_state),
.e1_led_run (e1_led_run),
.e1_led_active (e1_led_active),
.btn_val (btn_val),
.btn_stb (btn_stb),
.tick_e1_rx (tick_e1_rx),
.tick_e1_tx (tick_e1_tx),
.tick_usb_sof (tick_usb_sof),
.rst_req (rst_req),
.wb_addr (wb_addr[7:0]),
.wb_rdata (wb_rdata[0]),
.wb_wdata (wb_wdata),
.wb_we (wb_we),
.wb_cyc (wb_cyc[0]),
.wb_ack (wb_ack[0]),
.clk (clk_sys),
.rst (rst_sys)
);
// GPS UART [1]
// --------
uart_wb #(
.DIV_WIDTH(12),
.DW(32)
) gps_uart_I (
.uart_tx (gps_tx),
.uart_rx (gps_rx),
.wb_addr (wb_addr[1:0]),
.wb_rdata (wb_rdata[1]),
.wb_wdata (wb_wdata),
.wb_we (wb_we),
.wb_cyc (wb_cyc[1]),
.wb_ack (wb_ack[1]),
.clk (clk_sys),
.rst (rst_sys)
);
// I2C [2]
// ---
// Controller
i2c_master_wb #(
.DW(3),
.FIFO_DEPTH(0)
) i2c_I (
.scl_oe (i2c_scl_oe),
.sda_oe (i2c_sda_oe),
.sda_i (i2c_sda_i),
.wb_rdata(wb_rdata[2]),
.wb_wdata(wb_wdata),
.wb_we (wb_we),
.wb_cyc (wb_cyc[2]),
.wb_ack (wb_ack[2]),
.ready (),
.clk (clk_sys),
.rst (rst_sys)
);
// IOBs
SB_IO #(
.PIN_TYPE(6'b110101),
.PULLUP(1'b1),
.IO_STANDARD("SB_LVCMOS")
) i2c_scl_iob_I (
.PACKAGE_PIN (i2c_scl),
.OUTPUT_CLK (clk_sys),
.OUTPUT_ENABLE(i2c_scl_oe),
.D_OUT_0 (1'b0)
);
SB_IO #(
.PIN_TYPE(6'b110100),
.PULLUP(1'b1),
.IO_STANDARD("SB_LVCMOS")
) i2c_sda_iob_I (
.PACKAGE_PIN (i2c_sda),
.INPUT_CLK (clk_sys),
.OUTPUT_CLK (clk_sys),
.OUTPUT_ENABLE(i2c_sda_oe),
.D_OUT_0 (1'b0),
.D_IN_0 (i2c_sda_i)
);
// E1 LEDs & Button
// ----------------
// Blink pattern generator
led_blinker blinker_I (
.led_state(e1_led_state),
.sr_val (sr_val),
.sr_go (sr_go),
.sr_rdy (sr_rdy),
.clk (clk_sys),
.rst (rst_sys)
);
// Interface
sr_btn_if #(
.TICK_LOG2_DIV(3)
) spi_mux_I (
.flash_mosi (flash_mosi),
.flash_miso (flash_miso),
.flash_clk (flash_clk),
.flash_cs_n (flash_cs_n),
.e1_led_rclk (e1_led_rclk),
.spi_mosi_i (flash_mosi_i),
.spi_mosi_o (flash_mosi_o),
.spi_mosi_oe (flash_mosi_oe),
.spi_miso_i (flash_miso_i),
.spi_miso_o (flash_miso_o),
.spi_miso_oe (flash_miso_oe),
.spi_clk_i (flash_clk_i),
.spi_clk_o (flash_clk_o),
.spi_clk_oe (flash_clk_oe),
.spi_csn_o (flash_csn_o),
.spi_csn_oe (1'b1),
.spi_req (spi_req),
.spi_gnt (spi_gnt),
.sr_val (sr_val),
.sr_go (sr_go),
.sr_rdy (sr_rdy),
.btn_val (btn_val),
.btn_stb (btn_stb),
.clk (clk_sys),
.rst (rst_sys)
);
assign spi_req = ~e1_led_run;
assign e1_led_active = ~spi_gnt;
// Clock / Reset
// -------------
sysmgr sys_mgr_I (
.clk_in (clk_in),
.rst_in (rst_req),
.clk_sys(clk_sys),
.rst_sys(rst_sys),
.clk_48m(clk_48m),
.rst_48m(rst_48m)
);
endmodule // top