| `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 |