|
@@ -13,124 +13,124 @@ module max80
|
|
|
parameter logic [7:0] fpga_ver)
|
|
|
(
|
|
|
// Clock oscillator
|
|
|
- input master_clk, // 336 MHz from PLL2
|
|
|
- input slow_clk, // ~12 MHz clock from PLL2
|
|
|
- input master_pll_locked, // PLL2 is locked, master_clk is good
|
|
|
- output reset_plls, // Reset all PLLs including PLL2
|
|
|
+ input master_clk, // 336 MHz from PLL2
|
|
|
+ input slow_clk, // ~12 MHz clock from PLL2
|
|
|
+ input master_pll_locked, // PLL2 is locked, master_clk is good
|
|
|
+ output reset_plls, // Reset all PLLs including PLL2
|
|
|
|
|
|
- input board_id, // This better match the firmware
|
|
|
+ input board_id, // This better match the firmware
|
|
|
|
|
|
// ABC-bus
|
|
|
- inout abc_clk, // ABC-bus 3 MHz clock
|
|
|
+ inout abc_clk, // ABC-bus 3 MHz clock
|
|
|
inout [15:0] abc_a, // ABC address bus
|
|
|
inout [7:0] abc_d, // ABC data bus
|
|
|
- output abc_d_oe, // Data bus output enable
|
|
|
- inout abc_rst_n, // ABC bus reset strobe
|
|
|
- inout abc_cs_n, // ABC card select strobe
|
|
|
+ output abc_d_oe, // Data bus output enable
|
|
|
+ inout abc_rst_n, // ABC bus reset strobe
|
|
|
+ inout abc_cs_n, // ABC card select strobe
|
|
|
inout [4:0] abc_out_n, // OUT, C1-C4 strobe
|
|
|
inout [1:0] abc_inp_n, // INP, STATUS strobe
|
|
|
- inout abc_xmemfl_n, // Memory read strobe
|
|
|
- inout abc_xmemw800_n, // Memory write strobe (ABC800)
|
|
|
- inout abc_xmemw80_n, // Memory write strobe (ABC80)
|
|
|
- inout abc_xinpstb_n, // I/O read strobe (ABC800)
|
|
|
- inout abc_xoutpstb_n, // I/O write strobe (ABC80)
|
|
|
+ inout abc_xmemfl_n, // Memory read strobe
|
|
|
+ inout abc_xmemw800_n, // Memory write strobe (ABC800)
|
|
|
+ inout abc_xmemw80_n, // Memory write strobe (ABC80)
|
|
|
+ inout abc_xinpstb_n, // I/O read strobe (ABC800)
|
|
|
+ inout abc_xoutpstb_n, // I/O write strobe (ABC80)
|
|
|
// The following are inverted versus the bus IF
|
|
|
// the corresponding MOSFETs are installed
|
|
|
- inout abc_rdy_x, // RDY = WAIT#
|
|
|
- inout abc_resin_x, // System reset request
|
|
|
- inout abc_int80_x, // System INT request (ABC80)
|
|
|
- inout abc_int800_x, // System INT request (ABC800)
|
|
|
- inout abc_nmi_x, // System NMI request (ABC800)
|
|
|
- inout abc_xm_x, // System memory override (ABC800)
|
|
|
+ inout abc_rdy_x, // RDY = WAIT#
|
|
|
+ inout abc_resin_x, // System reset request
|
|
|
+ inout abc_int80_x, // System INT request (ABC80)
|
|
|
+ inout abc_int800_x, // System INT request (ABC800)
|
|
|
+ inout abc_nmi_x, // System NMI request (ABC800)
|
|
|
+ inout abc_xm_x, // System memory override (ABC800)
|
|
|
// Host/device control
|
|
|
- output abc_host, // 1 = host, 0 = target
|
|
|
+ output abc_host, // 1 = host, 0 = target
|
|
|
|
|
|
// ABC-bus extension header
|
|
|
// (Note: cannot use an array here because HC and HH are
|
|
|
// input only.)
|
|
|
- inout exth_ha,
|
|
|
- inout exth_hb,
|
|
|
- input exth_hc,
|
|
|
- inout exth_hd,
|
|
|
- inout exth_he,
|
|
|
- inout exth_hf,
|
|
|
- inout exth_hg,
|
|
|
- input exth_hh,
|
|
|
+ inout exth_ha,
|
|
|
+ inout exth_hb,
|
|
|
+ input exth_hc,
|
|
|
+ inout exth_hd,
|
|
|
+ inout exth_he,
|
|
|
+ inout exth_hf,
|
|
|
+ inout exth_hg,
|
|
|
+ input exth_hh,
|
|
|
|
|
|
// SDRAM bus
|
|
|
- output sr_clk,
|
|
|
+ output sr_clk,
|
|
|
output [1:0] sr_ba, // Bank address
|
|
|
output [12:0] sr_a, // Address within bank
|
|
|
inout [15:0] sr_dq, // Also known as D or IO
|
|
|
output [1:0] sr_dqm, // DQML and DQMH
|
|
|
- output sr_cs_n,
|
|
|
- output sr_we_n,
|
|
|
- output sr_cas_n,
|
|
|
- output sr_ras_n,
|
|
|
+ output sr_cs_n,
|
|
|
+ output sr_we_n,
|
|
|
+ output sr_cas_n,
|
|
|
+ output sr_ras_n,
|
|
|
|
|
|
// SD card
|
|
|
- input sd_cd_n,
|
|
|
- output sd_cs_n,
|
|
|
- output sd_clk,
|
|
|
- output sd_di,
|
|
|
- input sd_do,
|
|
|
+ input sd_cd_n,
|
|
|
+ output sd_cs_n,
|
|
|
+ output sd_clk,
|
|
|
+ output sd_di,
|
|
|
+ input sd_do,
|
|
|
|
|
|
// Serial console (naming is FPGA as DCE)
|
|
|
- input tty_txd,
|
|
|
- output tty_rxd,
|
|
|
- input tty_rts,
|
|
|
- output tty_cts,
|
|
|
- input tty_dtr,
|
|
|
+ input tty_txd,
|
|
|
+ output tty_rxd,
|
|
|
+ input tty_rts,
|
|
|
+ output tty_cts,
|
|
|
+ input tty_dtr,
|
|
|
|
|
|
// SPI flash memory (also configuration)
|
|
|
- output flash_cs_n,
|
|
|
- output flash_sck,
|
|
|
+ output flash_cs_n,
|
|
|
+ output flash_sck,
|
|
|
inout [1:0] flash_io,
|
|
|
|
|
|
// SPI bus (connected to ESP32 so can be bidirectional)
|
|
|
- inout spi_clk,
|
|
|
- inout spi_miso,
|
|
|
- inout spi_mosi,
|
|
|
- inout spi_cs_esp_n, // ESP32 IO10
|
|
|
- inout spi_cs_flash_n, // ESP32 IO01
|
|
|
+ inout spi_clk,
|
|
|
+ inout spi_miso,
|
|
|
+ inout spi_mosi,
|
|
|
+ inout spi_cs_esp_n, // ESP32 IO10
|
|
|
+ inout spi_cs_flash_n, // ESP32 IO01
|
|
|
|
|
|
// Other ESP32 connections
|
|
|
- inout esp_io0, // ESP32 IO00
|
|
|
- inout esp_int, // ESP32 IO09
|
|
|
+ inout esp_io0, // ESP32 IO00
|
|
|
+ inout esp_int, // ESP32 IO09
|
|
|
|
|
|
// I2C bus (RTC and external)
|
|
|
- inout i2c_scl,
|
|
|
- inout i2c_sda,
|
|
|
- input rtc_32khz,
|
|
|
- input rtc_int_n,
|
|
|
+ inout i2c_scl,
|
|
|
+ inout i2c_sda,
|
|
|
+ input rtc_32khz,
|
|
|
+ input rtc_int_n,
|
|
|
|
|
|
// LEDs
|
|
|
output [2:0] led,
|
|
|
|
|
|
// USB
|
|
|
- inout usb_dp,
|
|
|
- inout usb_dn,
|
|
|
- output usb_pu,
|
|
|
- input usb_rx,
|
|
|
- input usb_rx_ok,
|
|
|
+ inout usb_dp,
|
|
|
+ inout usb_dn,
|
|
|
+ output usb_pu,
|
|
|
+ input usb_rx,
|
|
|
+ input usb_rx_ok,
|
|
|
|
|
|
// HDMI
|
|
|
output [2:0] hdmi_d,
|
|
|
- output hdmi_clk,
|
|
|
- inout hdmi_scl,
|
|
|
- inout hdmi_sda,
|
|
|
- inout hdmi_hpd,
|
|
|
+ output hdmi_clk,
|
|
|
+ inout hdmi_scl,
|
|
|
+ inout hdmi_sda,
|
|
|
+ inout hdmi_hpd,
|
|
|
|
|
|
// Unconnected pins with pullups, used for randomness
|
|
|
inout [2:0] rngio,
|
|
|
|
|
|
// Various clocks available to the top level as well as internally
|
|
|
- output sdram_clk, // 168 MHz SDRAM clock
|
|
|
- output sys_clk, // 84 MHz System clock
|
|
|
- output flash_clk, // 134 MHz Serial flash ROM clock
|
|
|
- output usb_clk, // 48 MHz USB clock
|
|
|
- output vid_clk, // 56 MHz Video pixel clock
|
|
|
- output vid_hdmiclk // 280 MHz HDMI serializer clock = vid_clk x 5
|
|
|
+ output sdram_clk, // 168 MHz SDRAM clock
|
|
|
+ output sys_clk, // 84 MHz System clock
|
|
|
+ output flash_clk, // 134 MHz Serial flash ROM clock
|
|
|
+ output usb_clk, // 48 MHz USB clock
|
|
|
+ output vid_clk, // 56 MHz Video pixel clock
|
|
|
+ output vid_hdmiclk // 280 MHz HDMI serializer clock = vid_clk x 5
|
|
|
);
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
@@ -138,10 +138,10 @@ module max80
|
|
|
// -----------------------------------------------------------------------
|
|
|
reg rst_n = 1'b0; // Internal system reset
|
|
|
reg hard_rst_n = 1'b0; // Strict POR reset only
|
|
|
- wire reconfig_rst; // Reconfigure FPGA
|
|
|
+ wire reconfig_rst; // Reconfigure FPGA
|
|
|
|
|
|
assign reset_plls = 1'b0;
|
|
|
-
|
|
|
+
|
|
|
tri1 [4:1] pll_locked;
|
|
|
|
|
|
assign pll_locked[2] = master_pll_locked;
|
|
@@ -219,7 +219,7 @@ module max80
|
|
|
reg [3:1] reset_cmd_q = 3'b0;
|
|
|
|
|
|
assign reconfig_rst = reset_cmd_q[3];
|
|
|
-
|
|
|
+
|
|
|
always @(negedge all_plls_locked or posedge sys_clk)
|
|
|
if (~all_plls_locked)
|
|
|
begin
|
|
@@ -287,7 +287,7 @@ module max80
|
|
|
// Internal CPU bus
|
|
|
//
|
|
|
wire cpu_mem_valid;
|
|
|
- wire cpu_mem_ready;
|
|
|
+ wire cpu_mem_ready;
|
|
|
wire cpu_mem_instr;
|
|
|
wire [ 3:0] cpu_mem_wstrb;
|
|
|
wire [31:0] cpu_mem_addr;
|
|
@@ -487,13 +487,13 @@ module max80
|
|
|
|
|
|
// Reading the register shows the current set of pending interrupts.
|
|
|
assign sysreg_rdata[4] = cpu_irq;
|
|
|
-
|
|
|
+
|
|
|
// CPU permanently hung?
|
|
|
wire cpu_trap;
|
|
|
|
|
|
// Request to halt the CPU on the next instruction boundary
|
|
|
wire cpu_halt;
|
|
|
-
|
|
|
+
|
|
|
always @(negedge rst_n or posedge sys_clk)
|
|
|
if (~rst_n)
|
|
|
begin
|
|
@@ -574,10 +574,10 @@ module max80
|
|
|
wire [31:0] fast_mem_rdata;
|
|
|
|
|
|
wire [SRAM_BITS-1:2] vjtag_sram_addr;
|
|
|
- wire vjtag_sram_read;
|
|
|
- wire vjtag_sram_write;
|
|
|
- wire [31:0] vjtag_sram_rdata;
|
|
|
- wire [31:0] vjtag_sram_wdata;
|
|
|
+ wire vjtag_sram_read;
|
|
|
+ wire vjtag_sram_write;
|
|
|
+ wire [31:0] vjtag_sram_rdata;
|
|
|
+ wire [31:0] vjtag_sram_wdata;
|
|
|
|
|
|
fast_mem #(.words_lg2(SRAM_BITS-2),
|
|
|
.data_file("mif/sram.mif"))
|
|
@@ -756,21 +756,31 @@ module max80
|
|
|
wire serial_tx_full;
|
|
|
wire serial_rx_break;
|
|
|
|
|
|
- serial serial_tty (
|
|
|
- .rst_n ( hard_rst_n ),
|
|
|
- .clk ( sys_clk ),
|
|
|
-
|
|
|
- .tx_valid ( iodev_valid_tty &
|
|
|
- cpu_mem_addr[6:2] == 5'b00000 &
|
|
|
- cpu_mem_wstrb[0] ),
|
|
|
- .tx_data ( cpu_mem_wdata[7:0] ),
|
|
|
-
|
|
|
- .tty_rx ( tty_data_in ),
|
|
|
- .tty_tx ( tty_data_out ),
|
|
|
-
|
|
|
- .tx_full ( serial_tx_full ),
|
|
|
- .rx_break ( tty_rxd_break_rst )
|
|
|
- );
|
|
|
+ serial #(.ENABLE_RX_DATA (1'b0),
|
|
|
+ .ENABLE_RX_BREAK (1'b1),
|
|
|
+ .ENABLE_TX_DATA (1'b1),
|
|
|
+ .ENABLE_TX_BREAK (1'b0),
|
|
|
+ .BAUDRATE_SETTABLE (1'b0),
|
|
|
+ .BAUDRATE (921600),
|
|
|
+ .TTY_CLK (84000000))
|
|
|
+ (
|
|
|
+ .rst_n ( hard_rst_n ),
|
|
|
+ .clk ( sys_clk ),
|
|
|
+
|
|
|
+ // Snoops USB TTY channel 0
|
|
|
+ .tx_wstrb ( iodev_valid_tty &
|
|
|
+ cpu_mem_addr[6:2] == 5'b00000 &
|
|
|
+ cpu_mem_wstrb[0] ),
|
|
|
+ .tx_data ( cpu_mem_wdata[7:0] ),
|
|
|
+ .tx_flush ( 1'b0 ),
|
|
|
+ .rx_flush ( 1'b0 ),
|
|
|
+
|
|
|
+ .tty_rx ( tty_data_in ),
|
|
|
+ .tty_tx ( tty_data_out ),
|
|
|
+
|
|
|
+ .tx_full ( serial_tx_full ),
|
|
|
+ .rx_break ( tty_rxd_break_rst )
|
|
|
+ );
|
|
|
|
|
|
// If DTR# is asserted, block on full serial Tx FIFO; this allows
|
|
|
// us to not lose debugging messages.
|