|
@@ -13,123 +13,123 @@ module max80
|
|
parameter logic [7:0] fpga_ver)
|
|
parameter logic [7:0] fpga_ver)
|
|
(
|
|
(
|
|
// Clock oscillator
|
|
// Clock oscillator
|
|
- input master_clk, // 336 MHz 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 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
|
|
// 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 [15:0] abc_a, // ABC address bus
|
|
inout [7:0] abc_d, // ABC data 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 [4:0] abc_out_n, // OUT, C1-C4 strobe
|
|
inout [1:0] abc_inp_n, // INP, STATUS 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 following are inverted versus the bus IF
|
|
// the corresponding MOSFETs are installed
|
|
// 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
|
|
// Host/device control
|
|
- output abc_host, // 1 = host, 0 = target
|
|
|
|
|
|
+ output abc_host, // 1 = host, 0 = target
|
|
|
|
|
|
// ABC-bus extension header
|
|
// ABC-bus extension header
|
|
// (Note: cannot use an array here because HC and HH are
|
|
// (Note: cannot use an array here because HC and HH are
|
|
// input only.)
|
|
// 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
|
|
// SDRAM bus
|
|
- output sr_clk,
|
|
|
|
|
|
+ output sr_clk,
|
|
output [1:0] sr_ba, // Bank address
|
|
output [1:0] sr_ba, // Bank address
|
|
output [12:0] sr_a, // Address within bank
|
|
output [12:0] sr_a, // Address within bank
|
|
inout [15:0] sr_dq, // Also known as D or IO
|
|
inout [15:0] sr_dq, // Also known as D or IO
|
|
output [1:0] sr_dqm, // DQML and DQMH
|
|
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
|
|
// 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)
|
|
// 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)
|
|
// SPI flash memory (also configuration)
|
|
- output flash_cs_n,
|
|
|
|
- output flash_sck,
|
|
|
|
|
|
+ output flash_cs_n,
|
|
|
|
+ output flash_sck,
|
|
inout [1:0] flash_io,
|
|
inout [1:0] flash_io,
|
|
|
|
|
|
// SPI bus (connected to ESP32 so can be bidirectional)
|
|
// 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
|
|
// 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)
|
|
// 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,
|
|
|
|
|
|
// LED (2 = D23/G, 1 = D22/R, 0 = D17/B)
|
|
// LED (2 = D23/G, 1 = D22/R, 0 = D17/B)
|
|
output [2:0] led,
|
|
output [2:0] led,
|
|
|
|
|
|
// USB
|
|
// 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
|
|
// HDMI
|
|
output [2:0] hdmi_d,
|
|
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
|
|
// Unconnected pins with pullups, used for randomness
|
|
inout [2:0] rngio,
|
|
inout [2:0] rngio,
|
|
|
|
|
|
// Various clocks available to the top level as well as internally
|
|
// 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
|
|
);
|
|
);
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
// -----------------------------------------------------------------------
|
|
@@ -140,7 +140,6 @@ module max80
|
|
|
|
|
|
tri1 [4:1] pll_locked;
|
|
tri1 [4:1] pll_locked;
|
|
|
|
|
|
- assign reset_plls = 1'b0;
|
|
|
|
assign pll_locked[2] = master_pll_locked;
|
|
assign pll_locked[2] = master_pll_locked;
|
|
|
|
|
|
//
|
|
//
|
|
@@ -204,32 +203,41 @@ module max80
|
|
reg [31:1] sys_clk_stb;
|
|
reg [31:1] sys_clk_stb;
|
|
|
|
|
|
// 3 types of reset: system, hard, and reconfig
|
|
// 3 types of reset: system, hard, and reconfig
|
|
- reg [3:1] reset_cmd_q;
|
|
|
|
- wire [3:1] reset_cmd;
|
|
|
|
- reg soft_reset_q;
|
|
|
|
|
|
+ wire [3:1] cpu_reset_cmd; // CPU-originated reset command
|
|
|
|
+ reg [3:1] cpu_reset_cmd_q[0:1];
|
|
|
|
+ wire [3:1] aux_reset_cmd; // Other reset sources
|
|
|
|
+ reg [3:1] reset_cmd_q = 3'b0;
|
|
|
|
|
|
always @(negedge all_plls_locked or posedge sys_clk)
|
|
always @(negedge all_plls_locked or posedge sys_clk)
|
|
if (~all_plls_locked)
|
|
if (~all_plls_locked)
|
|
begin
|
|
begin
|
|
- hard_rst_n <= 1'b0;
|
|
|
|
- rst_n <= 1'b0;
|
|
|
|
- reset_cmd_q <= 3'b0;
|
|
|
|
- soft_reset_q <= 1'b0;
|
|
|
|
- sys_clk_ctr <= (-'sb1) << reset_pow2;
|
|
|
|
- sys_clk_ctr_q <= 'b0;
|
|
|
|
- sys_clk_stb <= 'b0;
|
|
|
|
|
|
+ reset_plls <= 1'b0;
|
|
|
|
+ hard_rst_n <= 1'b0;
|
|
|
|
+ rst_n <= 1'b0;
|
|
|
|
+ reset_cmd_q <= 3'b0;
|
|
|
|
+ cpu_reset_cmd_q[0] <= 3'b0;
|
|
|
|
+ cpu_reset_cmd_q[1] <= 3'b0;
|
|
|
|
+ sys_clk_ctr <= (-'sb1) << reset_pow2;
|
|
|
|
+ sys_clk_ctr_q <= 'b0;
|
|
|
|
+ sys_clk_stb <= 'b0;
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
- reset_cmd_q <= reset_cmd;
|
|
|
|
- soft_reset_q <= reset_cmd_q[1]; // Edge detect for soft reset
|
|
|
|
|
|
+ cpu_reset_cmd_q[0] <= cpu_reset_cmd;
|
|
|
|
+ cpu_reset_cmd_q[1] <= cpu_reset_cmd_q[0];
|
|
|
|
|
|
- if (reset_cmd_q[1] & ~soft_reset_q)
|
|
|
|
|
|
+ reset_cmd_q <= (cpu_reset_cmd_q[0] & ~cpu_reset_cmd_q[1]) |
|
|
|
|
+ aux_reset_cmd;
|
|
|
|
+
|
|
|
|
+ if (|reset_cmd_q)
|
|
begin
|
|
begin
|
|
|
|
+ // Soft or hard reset
|
|
sys_clk_ctr <= (-'sb1) << reset_pow2;
|
|
sys_clk_ctr <= (-'sb1) << reset_pow2;
|
|
sys_clk_ctr_q <= 1'b0;
|
|
sys_clk_ctr_q <= 1'b0;
|
|
sys_clk_stb <= 1'b0;
|
|
sys_clk_stb <= 1'b0;
|
|
rst_n <= 1'b0;
|
|
rst_n <= 1'b0;
|
|
|
|
+ hard_rst_n <= hard_rst_n & ~|reset_cmd_q[3:2];
|
|
|
|
+ reset_plls <= reset_cmd_q[3];
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
@@ -593,10 +601,10 @@ module max80
|
|
|
|
|
|
// System reset
|
|
// System reset
|
|
wire usb_rxd_break_rst; // Break due to USB serial port BREAK
|
|
wire usb_rxd_break_rst; // Break due to USB serial port BREAK
|
|
- reg tty_rxd_break_rst; // Break due to TTY serial port BREAK
|
|
|
|
|
|
+ wire tty_rxd_break_rst; // Break due to TTY serial port BREAK
|
|
|
|
|
|
- // Reset control. Note that CPU reset command 0 is intentionally ignored.
|
|
|
|
- wire [3:0] cpu_reset_cmd =
|
|
|
|
|
|
+ // Reset control. Note that CPU reset command 0 is a noop.
|
|
|
|
+ wire [3:0] cpu_reset_io_cmd =
|
|
(sysreg[3] & cpu_mem_wstrb[0]) << cpu_mem_wdata[1:0];
|
|
(sysreg[3] & cpu_mem_wstrb[0]) << cpu_mem_wdata[1:0];
|
|
|
|
|
|
//
|
|
//
|
|
@@ -606,20 +614,22 @@ module max80
|
|
// Triggered by:
|
|
// Triggered by:
|
|
// - CPU reset command 1
|
|
// - CPU reset command 1
|
|
// - CPU entering TRAP state (irrecoverable error)
|
|
// - CPU entering TRAP state (irrecoverable error)
|
|
- // - BREAK received on USB console
|
|
|
|
|
|
+ // - BREAK received on console
|
|
//
|
|
//
|
|
- assign reset_cmd[1] = cpu_reset_cmd[1] | cpu_trap |
|
|
|
|
- usb_rxd_break_rst | tty_rxd_break_rst;
|
|
|
|
|
|
+ assign cpu_reset_cmd[1] = cpu_reset_io_cmd[1] | cpu_trap;
|
|
|
|
+ assign aux_reset_cmd[1] = usb_rxd_break_rst | tty_rxd_break_rst;
|
|
|
|
|
|
//
|
|
//
|
|
// Hard system reset: FPGA not reloaded, PLLs reset, all hw units reset
|
|
// Hard system reset: FPGA not reloaded, PLLs reset, all hw units reset
|
|
//
|
|
//
|
|
- assign reset_cmd[2] = cpu_reset_cmd[2];
|
|
|
|
|
|
+ assign cpu_reset_cmd[2] = cpu_reset_io_cmd[2];
|
|
|
|
+ assign aux_reset_cmd[2] = 1'b0;
|
|
|
|
|
|
//
|
|
//
|
|
- // FPGA reload reset
|
|
|
|
|
|
+ // FPGA reload reset (not implemented yet)
|
|
//
|
|
//
|
|
- assign reset_cmd[3] = cpu_reset_cmd[3];
|
|
|
|
|
|
+ assign cpu_reset_cmd[3] = cpu_reset_io_cmd[3];
|
|
|
|
+ assign aux_reset_cmd[3] = 1'b0;
|
|
|
|
|
|
// LED indication from the CPU
|
|
// LED indication from the CPU
|
|
reg [2:0] led_q;
|
|
reg [2:0] led_q;
|
|
@@ -685,57 +695,41 @@ module max80
|
|
wire tty_data_in; // Input data
|
|
wire tty_data_in; // Input data
|
|
wire tty_cts_out; // Assert CTS# externally
|
|
wire tty_cts_out; // Assert CTS# externally
|
|
wire tty_rts_in; // RTS# received from outside
|
|
wire tty_rts_in; // RTS# received from outside
|
|
|
|
+ wire tty_dtr_in; // DTR# received from outside
|
|
|
|
+
|
|
|
|
|
|
assign tty_data_in = tty_txd;
|
|
assign tty_data_in = tty_txd;
|
|
assign tty_rxd = tty_data_out;
|
|
assign tty_rxd = tty_data_out;
|
|
assign tty_rts_in = ~tty_rts;
|
|
assign tty_rts_in = ~tty_rts;
|
|
|
|
+ assign tty_dtr_in = ~tty_dtr;
|
|
assign tty_cts = ~tty_cts_out;
|
|
assign tty_cts = ~tty_cts_out;
|
|
|
|
|
|
assign tty_cts_out = 1'b1; // Always assert CTS# for now
|
|
assign tty_cts_out = 1'b1; // Always assert CTS# for now
|
|
|
|
|
|
// The physical tty now just snoops USB ACM channel 0; as such it does
|
|
// The physical tty now just snoops USB ACM channel 0; as such it does
|
|
// not respond to any write requests nor issue any irqs
|
|
// not respond to any write requests nor issue any irqs
|
|
- tty serial_con (
|
|
|
|
- .rst_n ( hard_rst_n ),
|
|
|
|
- .clk ( sys_clk ),
|
|
|
|
|
|
+ wire serial_tx_full;
|
|
|
|
+ wire serial_rx_break;
|
|
|
|
|
|
- .valid ( iodev_valid_tty &
|
|
|
|
- cpu_mem_addr[6:2] == 5'b00000 &
|
|
|
|
- cpu_mem_wstrb[0] ),
|
|
|
|
- .wstrb ( cpu_mem_wstrb ),
|
|
|
|
- .wdata ( cpu_mem_wdata ),
|
|
|
|
- .rdata ( ),
|
|
|
|
- .addr ( cpu_mem_addr[3:2] ),
|
|
|
|
- .irq ( ),
|
|
|
|
|
|
+ serial serial_tty (
|
|
|
|
+ .rst_n ( hard_rst_n ),
|
|
|
|
+ .clk ( sys_clk ),
|
|
|
|
|
|
- .tty_txd ( tty_data_out ) // DTE -> DCE
|
|
|
|
- );
|
|
|
|
|
|
+ .tx_valid ( iodev_valid_tty &
|
|
|
|
+ cpu_mem_addr[6:2] == 5'b00000 &
|
|
|
|
+ cpu_mem_wstrb[0] ),
|
|
|
|
+ .tx_data ( cpu_mem_wdata[7:0] ),
|
|
|
|
|
|
- // Detect BREAK on the hardware tty input and generate a reset,
|
|
|
|
- // regardless of any other control signals.
|
|
|
|
- reg [19:0] tty_break_ctr;
|
|
|
|
- always @(posedge sys_clk)
|
|
|
|
- begin
|
|
|
|
- if (~hard_rst_n)
|
|
|
|
- begin
|
|
|
|
- tty_break_ctr <= ~'b0;
|
|
|
|
- tty_rxd_break_rst <= ~tty_rxd;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- if (tty_rxd)
|
|
|
|
- begin
|
|
|
|
- tty_break_ctr <= 'b0;
|
|
|
|
- tty_rxd_break_rst <= 1'b0;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- tty_break_ctr <= tty_break_ctr + 1'b1;
|
|
|
|
- if (&tty_break_ctr)
|
|
|
|
- tty_rxd_break_rst <= 1'b1;
|
|
|
|
- end // else: !if(tty_rxd)
|
|
|
|
- end // else: !if(~hard_rst_n)
|
|
|
|
- end // always @ (posedge sys_clk)
|
|
|
|
|
|
+ .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.
|
|
|
|
+ assign iodev_wait_n_tty = ~(serial_tx_full & tty_dtr_in);
|
|
|
|
|
|
max80_usb #( .channels( TTY_CHANNELS ) ) usb (
|
|
max80_usb #( .channels( TTY_CHANNELS ) ) usb (
|
|
.hard_rst_n ( hard_rst_n ),
|
|
.hard_rst_n ( hard_rst_n ),
|