1 | module usb_fifo
|
---|
2 | (
|
---|
3 | input wire usb_clk,
|
---|
4 | inout wire [7:0] usb_data,
|
---|
5 | input wire usb_full, usb_empty,
|
---|
6 | output wire usb_wrreq, usb_rdreq, usb_rden, usb_pktend,
|
---|
7 | output wire [1:0] usb_addr,
|
---|
8 |
|
---|
9 | input wire clk, aclr,
|
---|
10 | input wire tx_wrreq, rx_rdreq,
|
---|
11 | input wire [7:0] tx_data,
|
---|
12 | output wire tx_full, rx_empty,
|
---|
13 | output wire [7:0] rx_data,
|
---|
14 | output wire led
|
---|
15 | );
|
---|
16 |
|
---|
17 | // bidirectional data bus
|
---|
18 | reg int_addr, int_wren, int_rden, int_wrreq, int_rdreq;
|
---|
19 | wire [7:0] int_datain = usb_data;
|
---|
20 | wire [7:0] int_dataout;
|
---|
21 |
|
---|
22 | assign usb_data = int_wren ? int_dataout : 8'bz;
|
---|
23 |
|
---|
24 | wire rx_full, tx_empty;
|
---|
25 | wire rx_ready, tx_ready;
|
---|
26 | reg [8:0] byte_counter;
|
---|
27 | reg [4:0] idle_counter;
|
---|
28 |
|
---|
29 | assign led = ~usb_empty;
|
---|
30 |
|
---|
31 | fifo32x8 fifo_tx_unit (
|
---|
32 | .aclr(aclr),
|
---|
33 | .data(tx_data),
|
---|
34 | .rdclk(usb_clk),
|
---|
35 | .rdreq(int_wrreq),
|
---|
36 | .wrclk(clk),
|
---|
37 | .wrreq(tx_wrreq),
|
---|
38 | .q(int_dataout),
|
---|
39 | .rdempty(tx_empty),
|
---|
40 | .wrfull(tx_full));
|
---|
41 |
|
---|
42 | fifo32x8 fifo_rx_unit (
|
---|
43 | .aclr(aclr),
|
---|
44 | .data(int_datain),
|
---|
45 | .rdclk(clk),
|
---|
46 | .rdreq(rx_rdreq),
|
---|
47 | .wrclk(usb_clk),
|
---|
48 | .wrreq(int_rdreq),
|
---|
49 | .q(rx_data),
|
---|
50 | .rdempty(rx_empty),
|
---|
51 | .wrfull(rx_full));
|
---|
52 |
|
---|
53 | assign rx_ready = (~usb_empty) & (~rx_full);
|
---|
54 | assign tx_ready = (~usb_full) & (~tx_empty);
|
---|
55 |
|
---|
56 | always @ (posedge usb_clk)
|
---|
57 | begin
|
---|
58 | casez ({rx_ready, tx_ready, int_addr, int_rden})
|
---|
59 | 4'b00??: // idle
|
---|
60 | begin
|
---|
61 | int_addr <= 1'b0;
|
---|
62 | int_rden <= 1'b0;
|
---|
63 | int_wren <= 1'b0;
|
---|
64 | int_rdreq <= 1'b0;
|
---|
65 | int_wrreq <= 1'b0;
|
---|
66 | end
|
---|
67 | 4'b1?1?: // set read addr
|
---|
68 | begin
|
---|
69 | int_addr <= 1'b0;
|
---|
70 | int_rden <= 1'b0;
|
---|
71 | int_wren <= 1'b0;
|
---|
72 | int_rdreq <= 1'b0;
|
---|
73 | int_wrreq <= 1'b0;
|
---|
74 | end
|
---|
75 | 4'b1?00: // enable reads
|
---|
76 | begin
|
---|
77 | int_addr <= 1'b0;
|
---|
78 | int_rden <= 1'b1;
|
---|
79 | int_wren <= 1'b0;
|
---|
80 | int_rdreq <= 1'b0;
|
---|
81 | int_wrreq <= 1'b0;
|
---|
82 | end
|
---|
83 | 4'b1?01: // read
|
---|
84 | begin
|
---|
85 | int_addr <= 1'b0;
|
---|
86 | int_rden <= 1'b1;
|
---|
87 | int_wren <= 1'b0;
|
---|
88 | int_rdreq <= 1'b1;
|
---|
89 | int_wrreq <= 1'b0;
|
---|
90 | end
|
---|
91 | 4'b0101: // disable reads
|
---|
92 | begin
|
---|
93 | int_addr <= 1'b0;
|
---|
94 | int_rden <= 1'b0;
|
---|
95 | int_wren <= 1'b0;
|
---|
96 | int_rdreq <= 1'b0;
|
---|
97 | int_wrreq <= 1'b0;
|
---|
98 | end
|
---|
99 | 4'b0100: // set write addr
|
---|
100 | begin
|
---|
101 | int_addr <= 1'b1;
|
---|
102 | int_rden <= 1'b0;
|
---|
103 | int_wren <= 1'b1;
|
---|
104 | int_rdreq <= 1'b0;
|
---|
105 | int_wrreq <= 1'b0;
|
---|
106 | end
|
---|
107 | 4'b011?: // write
|
---|
108 | begin
|
---|
109 | int_addr <= 1'b1;
|
---|
110 | int_rden <= 1'b0;
|
---|
111 | int_wren <= 1'b1;
|
---|
112 | int_rdreq <= 1'b0;
|
---|
113 | int_wrreq <= 1'b1;
|
---|
114 | end
|
---|
115 | endcase
|
---|
116 | /*
|
---|
117 | if (usb_pktend)
|
---|
118 | begin
|
---|
119 | byte_counter <= 9'd0;
|
---|
120 | idle_counter <= 5'd0;
|
---|
121 | end
|
---|
122 | else if (usb_wrreq)
|
---|
123 | begin
|
---|
124 | byte_counter <= byte_counter + 9'd1;
|
---|
125 | idle_counter <= 5'd0;
|
---|
126 | end
|
---|
127 | else if ((|byte_counter) & (tx_empty))
|
---|
128 | begin
|
---|
129 | byte_counter <= byte_counter;
|
---|
130 | idle_counter <= idle_counter + 5'd1;
|
---|
131 | end
|
---|
132 | */
|
---|
133 | end
|
---|
134 |
|
---|
135 | assign usb_addr = {1'b1, int_addr};
|
---|
136 | assign usb_rden = int_rden;
|
---|
137 | assign usb_rdreq = int_rdreq;
|
---|
138 | assign usb_wrreq = int_wrreq;
|
---|
139 | // assign usb_pktend = (&idle_counter);
|
---|
140 | assign usb_pktend = 1'b0;
|
---|
141 |
|
---|
142 | endmodule
|
---|