|  | @@ -13,123 +13,123 @@ module max80
 | 
	
		
			
				|  |  |      parameter logic [7:0] fpga_ver)
 | 
	
		
			
				|  |  |     (
 | 
	
		
			
				|  |  |      // 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
 | 
	
		
			
				|  |  | -    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,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // LED (2 = D23/G, 1 = D22/R, 0 = D17/B)
 | 
	
		
			
				|  |  |      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
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     // -----------------------------------------------------------------------
 | 
	
	
		
			
				|  | @@ -140,7 +140,6 @@ module max80
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     tri1 [4:1]		    pll_locked;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   assign   reset_plls = 1'b0;
 | 
	
		
			
				|  |  |     assign   pll_locked[2] = master_pll_locked;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     //
 | 
	
	
		
			
				|  | @@ -204,32 +203,41 @@ module max80
 | 
	
		
			
				|  |  |     reg [31:1] sys_clk_stb;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     // 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)
 | 
	
		
			
				|  |  |       if (~all_plls_locked)
 | 
	
		
			
				|  |  |         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
 | 
	
		
			
				|  |  |       else
 | 
	
		
			
				|  |  |         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
 | 
	
		
			
				|  |  | +	       // Soft or hard reset
 | 
	
		
			
				|  |  |  	       sys_clk_ctr   <= (-'sb1) << reset_pow2;
 | 
	
		
			
				|  |  |  	       sys_clk_ctr_q <= 1'b0;
 | 
	
		
			
				|  |  |  	       sys_clk_stb   <= 1'b0;
 | 
	
		
			
				|  |  |  	       rst_n         <= 1'b0;
 | 
	
		
			
				|  |  | +	       hard_rst_n    <= hard_rst_n & ~|reset_cmd_q[3:2];
 | 
	
		
			
				|  |  | +	       reset_plls    <= reset_cmd_q[3];
 | 
	
		
			
				|  |  |  	    end
 | 
	
		
			
				|  |  |  	  else
 | 
	
		
			
				|  |  |  	    begin
 | 
	
	
		
			
				|  | @@ -593,10 +601,10 @@ module max80
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     // System reset
 | 
	
		
			
				|  |  |     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];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     //
 | 
	
	
		
			
				|  | @@ -606,20 +614,22 @@ module max80
 | 
	
		
			
				|  |  |     // Triggered by:
 | 
	
		
			
				|  |  |     //  - CPU reset command 1
 | 
	
		
			
				|  |  |     //  - 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
 | 
	
		
			
				|  |  |     //
 | 
	
		
			
				|  |  | -   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
 | 
	
		
			
				|  |  |     reg [2:0]   led_q;
 | 
	
	
		
			
				|  | @@ -685,57 +695,41 @@ module max80
 | 
	
		
			
				|  |  |     wire        tty_data_in;	// Input data
 | 
	
		
			
				|  |  |     wire        tty_cts_out;	// Assert CTS# externally
 | 
	
		
			
				|  |  |     wire        tty_rts_in;	// RTS# received from outside
 | 
	
		
			
				|  |  | +   wire        tty_dtr_in;	// DTR# received from outside
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     assign tty_data_in      = tty_txd;
 | 
	
		
			
				|  |  |     assign tty_rxd          = tty_data_out;
 | 
	
		
			
				|  |  |     assign tty_rts_in       = ~tty_rts;
 | 
	
		
			
				|  |  | +   assign tty_dtr_in       = ~tty_dtr;
 | 
	
		
			
				|  |  |     assign tty_cts          = ~tty_cts_out;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     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
 | 
	
		
			
				|  |  |     // 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 (
 | 
	
		
			
				|  |  |  		  .hard_rst_n         ( hard_rst_n ),
 |