mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-12-28 05:51:53 +01:00
120 lines
2.9 KiB
Systemverilog
120 lines
2.9 KiB
Systemverilog
module cpu_usb (
|
|
if_system sys,
|
|
if_cpu_bus bus,
|
|
if_dma dma,
|
|
|
|
output usb_clk,
|
|
output usb_cs,
|
|
input usb_miso,
|
|
inout [3:0] usb_miosi,
|
|
input usb_pwren
|
|
);
|
|
|
|
logic rx_flush;
|
|
logic rx_empty;
|
|
logic rx_read;
|
|
logic [7:0] rx_rdata;
|
|
|
|
logic tx_flush;
|
|
logic tx_full;
|
|
logic tx_write;
|
|
logic [7:0] tx_wdata;
|
|
|
|
logic rx_escape_valid;
|
|
logic rx_escape_ack;
|
|
logic [7:0] rx_escape;
|
|
|
|
logic cpu_rx_read;
|
|
logic cpu_tx_write;
|
|
|
|
logic usb_enabled;
|
|
|
|
always_comb begin
|
|
dma.rx_empty = rx_empty;
|
|
rx_read = cpu_rx_read || dma.rx_read;
|
|
dma.rx_rdata = rx_rdata;
|
|
|
|
dma.tx_full = tx_full;
|
|
tx_write = cpu_tx_write || dma.tx_write;
|
|
tx_wdata = dma.tx_write ? dma.tx_wdata : bus.wdata[7:0];
|
|
end
|
|
|
|
always_ff @(posedge sys.clk) begin
|
|
bus.ack <= 1'b0;
|
|
if (bus.request) begin
|
|
bus.ack <= 1'b1;
|
|
end
|
|
end
|
|
|
|
always_comb begin
|
|
bus.rdata = 32'd0;
|
|
if (bus.ack) begin
|
|
case (bus.address[3:2])
|
|
0: bus.rdata = {25'd0, rx_escape_valid, usb_pwren, usb_enabled, 2'b00, ~tx_full, ~rx_empty};
|
|
1: bus.rdata = {24'd0, rx_rdata};
|
|
2: bus.rdata = {24'd0, rx_escape};
|
|
default: bus.rdata = 32'd0;
|
|
endcase
|
|
end
|
|
end
|
|
|
|
always_ff @(posedge sys.clk) begin
|
|
rx_flush <= 1'b0;
|
|
cpu_rx_read <= 1'b0;
|
|
|
|
tx_flush <= 1'b0;
|
|
cpu_tx_write <= 1'b0;
|
|
|
|
rx_escape_ack <= 1'b0;
|
|
|
|
if (sys.reset) begin
|
|
usb_enabled <= 1'b0;
|
|
end else begin
|
|
if (bus.request) begin
|
|
case (bus.address[2:2])
|
|
2'd0: begin
|
|
if (bus.wmask[0]) begin
|
|
rx_escape_ack <= bus.wdata[7];
|
|
{usb_enabled, tx_flush, rx_flush} <= bus.wdata[4:2];
|
|
end
|
|
end
|
|
|
|
2'd1: begin
|
|
if (bus.wmask[0]) begin
|
|
cpu_tx_write <= 1'b1;
|
|
end else begin
|
|
cpu_rx_read <= 1'b1;
|
|
end
|
|
end
|
|
endcase
|
|
end
|
|
end
|
|
end
|
|
|
|
usb_ft1248 usb_ft1248_inst (
|
|
.sys(sys),
|
|
|
|
.usb_enabled(usb_enabled),
|
|
|
|
.usb_clk(usb_clk),
|
|
.usb_cs(usb_cs),
|
|
.usb_miso(usb_miso),
|
|
.usb_miosi(usb_miosi),
|
|
|
|
.rx_flush(rx_flush),
|
|
.rx_empty(rx_empty),
|
|
.rx_read(rx_read),
|
|
.rx_rdata(rx_rdata),
|
|
|
|
.tx_flush(tx_flush),
|
|
.tx_full(tx_full),
|
|
.tx_write(tx_write),
|
|
.tx_wdata(tx_wdata),
|
|
|
|
.rx_escape_valid(rx_escape_valid),
|
|
.rx_escape_ack(rx_escape_ack),
|
|
.rx_escape(rx_escape)
|
|
);
|
|
|
|
endmodule
|