blob: c0b91e0d2776d498bb4d77679c303a9dbaa2277d [file] [log] [blame]
`default_nettype none
module top
(
inout wire [7:0] data_io,
output reg [7:0] rdata_o,
input wire [7:0] wdata_i,
input wire rxf_n_i,
input wire txe_n_i,
output reg rd_n_o,
output reg wr_n_o,
output reg siwua_n_o,
input wire clk_i,
output reg oe_n_o,
input wire suspend_n_i
);
initial begin
rdata_o = {8{1'b0}};
rd_n_o = 1;
wr_n_o = 1;
siwua_n_o = 1; /* Never flush TX data. */
end
assign data_io = (!txe_n_i && !wr_n_o) ? wdata_i : {8{1'bz}};
always @(posedge clk_i, negedge suspend_n_i) begin
if (!suspend_n_i) begin
wr_n_o <= 1;
rd_n_o <= 1;
oe_n_o <= 1;
rdata_o <= {8{1'b0}};
end
else begin
// Give TX bus precedence.
if (!txe_n_i) begin
wr_n_o <= 0;
rd_n_o <= 1;
oe_n_o <= 1;
rdata_o <= {8{1'b0}};
end
// oe_n_o must be driven low at least one period before we can read.
else if (!rxf_n_i && oe_n_o) begin
wr_n_o <= 1;
rd_n_o <= 1;
oe_n_o <= 0;
rdata_o <= {8{1'b0}};
end
else if (!rxf_n_i && !oe_n_o) begin
wr_n_o <= 1;
rd_n_o <= 0;
oe_n_o <= 0;
rdata_o <= data_io;
end
else begin
wr_n_o <= 1;
rd_n_o <= 1;
oe_n_o <= 1;
rdata_o <= {8{1'b0}};
end
end // else: !if(!suspend_n_i)
end
endmodule // usb