|
@@ -160,7 +160,7 @@ module max80 (
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
- reset_cmd_q <= reset_cmd_q | (rst_n & reset_cmd);
|
|
+ reset_cmd_q <= rst_n & (reset_cmd_q | reset_cmd);
|
|
if (~rst_n)
|
|
if (~rst_n)
|
|
{ rst_n, rst_ctr } <= rst_ctr + 1'b1;
|
|
{ rst_n, rst_ctr } <= rst_ctr + 1'b1;
|
|
end
|
|
end
|
|
@@ -386,8 +386,22 @@ module max80 (
|
|
|
|
|
|
// Decode for small devices; use address space within range of
|
|
// Decode for small devices; use address space within range of
|
|
// negative offsets from the zero register [-1K,0)
|
|
// negative offsets from the zero register [-1K,0)
|
|
|
|
+ //
|
|
|
|
+ // Device map:
|
|
|
|
+ // 0 - LED
|
|
|
|
+ // 1 - Reset
|
|
|
|
+ // 2 - SPI->SDRAM downloader
|
|
|
|
+ // 3 - Serial port
|
|
|
|
+ //
|
|
|
|
+ // A device has IRQ (devno)+16 if it needs an interrupt.
|
|
|
|
+ //
|
|
|
|
+
|
|
wire [15:0] iodev = cpu_mem_quad[3] << cpu_mem_addr[9:6];
|
|
wire [15:0] iodev = cpu_mem_quad[3] << cpu_mem_addr[9:6];
|
|
|
|
+ tri0 [15:0] iodev_irq; // tri0: if nothing is driving, value is 0
|
|
|
|
|
|
|
|
+ //
|
|
|
|
+ // SDRAM
|
|
|
|
+ //
|
|
wire [31:0] sdram_rd;
|
|
wire [31:0] sdram_rd;
|
|
wire sdram_rack;
|
|
wire sdram_rack;
|
|
wire sdram_rready;
|
|
wire sdram_rready;
|
|
@@ -489,6 +503,7 @@ module max80 (
|
|
.REGS_INIT_ZERO ( 1 ),
|
|
.REGS_INIT_ZERO ( 1 ),
|
|
.STACKADDR ( 32'h4 << cpu_fast_mem_bits )
|
|
.STACKADDR ( 32'h4 << cpu_fast_mem_bits )
|
|
)
|
|
)
|
|
|
|
+
|
|
cpu (
|
|
cpu (
|
|
.clk ( sys_clk ),
|
|
.clk ( sys_clk ),
|
|
.resetn ( rst_n ),
|
|
.resetn ( rst_n ),
|
|
@@ -508,7 +523,7 @@ module max80 (
|
|
.mem_la_addr ( cpu_la_addr ),
|
|
.mem_la_addr ( cpu_la_addr ),
|
|
.mem_la_wstrb ( cpu_la_wstrb ),
|
|
.mem_la_wstrb ( cpu_la_wstrb ),
|
|
|
|
|
|
- .irq ( 0 ),
|
|
+ .irq ( { iodev_irq, 16'b0 } ),
|
|
.eoi ( )
|
|
.eoi ( )
|
|
);
|
|
);
|
|
|
|
|
|
@@ -572,7 +587,7 @@ module max80 (
|
|
endcase
|
|
endcase
|
|
|
|
|
|
// Hard system reset under program control
|
|
// Hard system reset under program control
|
|
- assign reset_cmd = rst_n & iodev[15] & cpu_mem_wstrb[0] & cpu_mem_wdata[0];
|
|
+ assign reset_cmd = rst_n & iodev[1] & cpu_mem_wstrb[0] & cpu_mem_wdata[0];
|
|
|
|
|
|
// LED indication from the CPU
|
|
// LED indication from the CPU
|
|
reg [2:0] led_q;
|
|
reg [2:0] led_q;
|
|
@@ -627,16 +642,19 @@ 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 [31:0] tty_rdata;
|
|
|
|
|
|
assign tty_cts_out = 1'b0; // Assert CTS#
|
|
assign tty_cts_out = 1'b0; // Assert CTS#
|
|
tty tty (
|
|
tty tty (
|
|
.rst_n ( rst_n ),
|
|
.rst_n ( rst_n ),
|
|
.clk ( sys_clk ),
|
|
.clk ( sys_clk ),
|
|
|
|
|
|
- .valid ( iodev[1] ),
|
|
+ .valid ( iodev[3] ),
|
|
.wstrb ( cpu_mem_wstrb ),
|
|
.wstrb ( cpu_mem_wstrb ),
|
|
.wdata ( cpu_mem_wdata ),
|
|
.wdata ( cpu_mem_wdata ),
|
|
- .addr ( cpu_mem_addr[2] ),
|
|
+ .rdata ( tty_rdata ),
|
|
|
|
+ .addr ( cpu_mem_addr[3:2] ),
|
|
|
|
+ .irq ( iodev_irq[3] ),
|
|
|
|
|
|
.tty_txd ( tty_data_out ) // DTE -> DCE
|
|
.tty_txd ( tty_data_out ) // DTE -> DCE
|
|
);
|
|
);
|
|
@@ -670,7 +688,9 @@ module max80 (
|
|
//
|
|
//
|
|
always @(*)
|
|
always @(*)
|
|
case ( cpu_mem_addr[9:6] )
|
|
case ( cpu_mem_addr[9:6] )
|
|
|
|
+ 4'h0: iodev_rdata = { 29'b0, led_q };
|
|
4'h2: iodev_rdata = { 31'b0, rom_done_q };
|
|
4'h2: iodev_rdata = { 31'b0, rom_done_q };
|
|
|
|
+ 4'h3: iodev_rdata = tty_rdata;
|
|
default: iodev_rdata = 32'hffff_ffff;
|
|
default: iodev_rdata = 32'hffff_ffff;
|
|
endcase
|
|
endcase
|
|
|
|
|