|
@@ -125,15 +125,16 @@ module max80 (
|
|
|
|
|
|
// Clocks
|
|
// Clocks
|
|
wire sdram_clk;
|
|
wire sdram_clk;
|
|
- wire clk; // System clock
|
|
|
|
|
|
+ wire sys_clk; // System clock
|
|
wire vid_clk; // Video pixel clock
|
|
wire vid_clk; // Video pixel clock
|
|
wire vid_hdmiclk; // D:o in the HDMI clock domain
|
|
wire vid_hdmiclk; // D:o in the HDMI clock domain
|
|
|
|
+ wire tty_clk = vid_clk; // 48 MHz
|
|
|
|
|
|
pll pll (
|
|
pll pll (
|
|
.areset ( 1'b0 ),
|
|
.areset ( 1'b0 ),
|
|
.inclk0 ( clock_48 ),
|
|
.inclk0 ( clock_48 ),
|
|
.c0 ( sdram_clk ), // SDRAM clock (168 MHz)
|
|
.c0 ( sdram_clk ), // SDRAM clock (168 MHz)
|
|
- .c1 ( clk ), // System clock (84 MHz)
|
|
|
|
|
|
+ .c1 ( sys_clk ), // System clock (84 MHz)
|
|
.c2 ( vid_clk ), // Video pixel clock (48 MHz)
|
|
.c2 ( vid_clk ), // Video pixel clock (48 MHz)
|
|
.locked ( pll_locked[0] ),
|
|
.locked ( pll_locked[0] ),
|
|
.phasestep ( 1'b0 ),
|
|
.phasestep ( 1'b0 ),
|
|
@@ -145,7 +146,7 @@ module max80 (
|
|
|
|
|
|
wire all_plls_locked = &pll_locked;
|
|
wire all_plls_locked = &pll_locked;
|
|
|
|
|
|
- always @(negedge all_plls_locked or posedge clk)
|
|
|
|
|
|
+ always @(negedge all_plls_locked or posedge sys_clk)
|
|
if (~&all_plls_locked)
|
|
if (~&all_plls_locked)
|
|
begin
|
|
begin
|
|
rst_ctr <= 1'b0;
|
|
rst_ctr <= 1'b0;
|
|
@@ -311,17 +312,6 @@ module max80 (
|
|
assign exth_q = 6'b0;
|
|
assign exth_q = 6'b0;
|
|
assign exth_oe = 6'b0;
|
|
assign exth_oe = 6'b0;
|
|
|
|
|
|
- // LED blink counter
|
|
|
|
- reg [28:0] led_ctr;
|
|
|
|
-
|
|
|
|
- always @(posedge clk or negedge rst_n)
|
|
|
|
- if (~rst_n)
|
|
|
|
- led_ctr <= 29'b0;
|
|
|
|
- else
|
|
|
|
- led_ctr <= led_ctr + 1'b1;
|
|
|
|
-
|
|
|
|
- //assign led = led_ctr[28:26];
|
|
|
|
-
|
|
|
|
// SDRAM controller
|
|
// SDRAM controller
|
|
reg abc_rrq;
|
|
reg abc_rrq;
|
|
reg abc_wrq;
|
|
reg abc_wrq;
|
|
@@ -461,7 +451,7 @@ module max80 (
|
|
.STACKADDR ( 32'h4 << cpu_fast_mem_bits )
|
|
.STACKADDR ( 32'h4 << cpu_fast_mem_bits )
|
|
)
|
|
)
|
|
cpu (
|
|
cpu (
|
|
- .clk ( clk ),
|
|
|
|
|
|
+ .clk ( sys_clk ),
|
|
.resetn ( rst_n ),
|
|
.resetn ( rst_n ),
|
|
.trap ( ),
|
|
.trap ( ),
|
|
|
|
|
|
@@ -499,7 +489,7 @@ module max80 (
|
|
fast_mem // #(.bits(cpu_fast_mem_bits), .mif("../fw/boot"))
|
|
fast_mem // #(.bits(cpu_fast_mem_bits), .mif("../fw/boot"))
|
|
fast_mem(
|
|
fast_mem(
|
|
.rst_n ( rst_n ),
|
|
.rst_n ( rst_n ),
|
|
- .clk ( clk ),
|
|
|
|
|
|
+ .clk ( sys_clk ),
|
|
.read ( cpu_la_read & cpu_la_addr[31:30] == 2'b00 ),
|
|
.read ( cpu_la_read & cpu_la_addr[31:30] == 2'b00 ),
|
|
.write ( cpu_la_write & cpu_la_addr[31:30] == 2'b00 ),
|
|
.write ( cpu_la_write & cpu_la_addr[31:30] == 2'b00 ),
|
|
.wstrb ( cpu_la_wstrb ),
|
|
.wstrb ( cpu_la_wstrb ),
|
|
@@ -520,7 +510,7 @@ module max80 (
|
|
|
|
|
|
// LED indication from the CPU
|
|
// LED indication from the CPU
|
|
reg [2:0] led_q;
|
|
reg [2:0] led_q;
|
|
- always @(negedge rst_n or posedge clk)
|
|
|
|
|
|
+ always @(negedge rst_n or posedge sys_clk)
|
|
if (~rst_n)
|
|
if (~rst_n)
|
|
led_q <= 3'b000;
|
|
led_q <= 3'b000;
|
|
else
|
|
else
|
|
@@ -529,18 +519,59 @@ module max80 (
|
|
|
|
|
|
assign led = led_q;
|
|
assign led = led_q;
|
|
|
|
|
|
- // USB serial
|
|
|
|
- assign tty_cts = 1'b0; // Assert CTS#
|
|
|
|
|
|
+ //
|
|
|
|
+ // Serial port. Direct to the CP2102N for reworked
|
|
|
|
+ // boards or to GPIO for non-reworked boards, depending on
|
|
|
|
+ // whether DTR# is asserted on either.
|
|
|
|
+ //
|
|
|
|
+ // The GPIO numbering matches the order of pins for FT[2]232H.
|
|
|
|
+ // gpio[0] - TxD
|
|
|
|
+ // gpio[1] - RxD
|
|
|
|
+ // gpio[2] - RTS#
|
|
|
|
+ // gpio[3] - CTS#
|
|
|
|
+ // gpio[4] - DTR#
|
|
|
|
+ //
|
|
|
|
+ wire tty_data_out; // Output data
|
|
|
|
+ wire tty_data_in; // Input data
|
|
|
|
+ wire tty_cts_out; // Assert CTS# externally
|
|
|
|
+ wire tty_rts_in; // RTS# received from outside
|
|
|
|
+
|
|
|
|
+ assign tty_cts_out = 1'b0; // Assert CTS#
|
|
tty tty (
|
|
tty tty (
|
|
.rst_n ( rst_n ),
|
|
.rst_n ( rst_n ),
|
|
.sys_clk ( sys_clk ),
|
|
.sys_clk ( sys_clk ),
|
|
- .tty_clk ( vid_clk ), // 48 MHz
|
|
|
|
|
|
+ .tty_clk ( tty_clk ),
|
|
|
|
|
|
.valid ( iodev[1] ),
|
|
.valid ( iodev[1] ),
|
|
.wstrb ( cpu_mem_wstrb ),
|
|
.wstrb ( cpu_mem_wstrb ),
|
|
.wdata ( cpu_mem_wdata ),
|
|
.wdata ( cpu_mem_wdata ),
|
|
.addr ( cpu_mem_addr[2] ),
|
|
.addr ( cpu_mem_addr[2] ),
|
|
|
|
|
|
- .tty_txd ( tty_rxd ) // DTE -> DCE
|
|
|
|
|
|
+ .tty_txd ( tty_data_out ) // DTE -> DCE
|
|
);
|
|
);
|
|
|
|
+
|
|
|
|
+ reg [1:0] tty_dtr_q;
|
|
|
|
+ always @(posedge tty_clk)
|
|
|
|
+ begin
|
|
|
|
+ tty_dtr_q[0] <= tty_dtr;
|
|
|
|
+ tty_dtr_q[1] <= gpio[4];
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ //
|
|
|
|
+ // Route data to the two output ports
|
|
|
|
+ //
|
|
|
|
+
|
|
|
|
+ // tty_rxd because pins are DCE named
|
|
|
|
+ assign tty_data_in = (tty_txd | tty_dtr_q[0]) &
|
|
|
|
+ (gpio[0] | tty_dtr_q[1]);
|
|
|
|
+
|
|
|
|
+ assign tty_rxd = tty_dtr_q[0] ? 1'bz : tty_data_out;
|
|
|
|
+ assign gpio[1] = tty_dtr_q[1] ? 1'bz : tty_data_out;
|
|
|
|
+
|
|
|
|
+ assign tty_rts_in = (tty_rts | tty_dtr_q[0]) &
|
|
|
|
+ (gpio[2] | tty_dtr_q[1]);
|
|
|
|
+
|
|
|
|
+ assign tty_cts = tty_dtr_q[0] ? 1'bz : tty_cts_out;
|
|
|
|
+ assign gpio[3] = tty_dtr_q[1] ? 1'bz : tty_cts_out;
|
|
|
|
+
|
|
endmodule
|
|
endmodule
|