OpenCores
URL https://opencores.org/ocsvn/usb_ft232h_avalon-mm_interface/usb_ft232h_avalon-mm_interface/trunk

Subversion Repositories usb_ft232h_avalon-mm_interface

[/] [usb_ft232h_avalon-mm_interface/] [trunk/] [hw/] [usb_ft232h.sv] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 melman701
/*
2
 *      Если error срабатывает на последнем байте пакета, то он не будет отправлен, пока
3
 * не придет следующий пакет
4
 */
5
 
6
`define WRDATA_ADDR             0
7
`define RDDATA_ADDR             1
8
`define TXSTATUSL_ADDR  2
9
`define TXSTATUSH_ADDR  3
10
`define RXSTATUSL_ADDR  4
11
`define RXSTATUSH_ADDR  5
12
 
13
module usb_ft232h (
14
        //Avalon-MM Slave
15
        clk,
16
        reset,
17
        address,
18
        read,
19
        readdata,
20
        write,
21
        writedata,
22
 
23
        //FT232H
24
        usb_clk,
25
        usb_data,
26
        usb_rxf_n,
27
        usb_txe_n,
28
        usb_rd_n,
29
        usb_wr_n,
30
        usb_oe_n
31
);
32
 
33
parameter FIFO_DEPTH = 512;
34
parameter FIFO_WIDTHU = 9;
35
 
36
 
37
input logic clk;
38
input logic reset;
39
input logic [3:0]address;
40
input logic read;
41
output logic [7:0]readdata;
42
input logic write;
43
input logic [7:0]writedata;
44
 
45
input logic usb_clk;
46
inout logic [7:0]usb_data;
47
input logic usb_rxf_n;
48
input logic usb_txe_n;
49
output logic usb_rd_n;
50
output logic usb_wr_n;
51
output logic usb_oe_n;
52
 
53
 
54
logic [15:0]txstatus;
55
logic [15:0]rxstatus;
56
 
57
logic [3:0]addr;
58
reg reg_usb_rd_n;
59
reg reg_usb_oe_n;
60
reg reg_usb_wr_n;
61
reg reg_rxf_wrreq;
62
reg reg_txf_rdreq;
63
reg error;
64
 
65
 
66
logic [7:0]txf_wrdata;
67
logic txf_wrclk;
68
logic txf_wrreq;
69
logic txf_wrfull;
70
logic [FIFO_WIDTHU-1:0]txf_wrusedw;
71
logic txf_rdclk;
72
logic txf_rdreq;
73
logic [7:0]txf_rddata;
74
logic txf_rdempty;
75
 
76
logic [7:0]rxf_wrdata;
77
logic rxf_wrclk;
78
logic rxf_wrreq;
79
logic rxf_wrfull;
80
logic [FIFO_WIDTHU-1:0]rxf_rdusedw;
81
logic rxf_rdclk;
82
logic rxf_rdreq;
83
logic [7:0]rxf_rddata;
84
logic rxf_rdempty;
85
logic rxf_rdfull;
86
 
87
 
88
 
89
assign usb_data = usb_oe_n ? txf_rddata : {8{1'bZ}};
90
assign rxf_wrdata = usb_oe_n ? 8'b0 : usb_data;
91
 
92
assign usb_oe_n = (~usb_rxf_n & ~rxf_wrfull) ? reg_usb_oe_n : 1'b1;
93
assign usb_rd_n = (~usb_rxf_n & ~rxf_wrfull) ? reg_usb_rd_n : 1'b1;
94
assign usb_wr_n = (usb_oe_n & ~usb_txe_n) ? reg_usb_wr_n : 1'b1;
95
assign rxf_wrreq = (~usb_rxf_n & ~rxf_wrfull) ? reg_rxf_wrreq : 1'b0;
96
assign txf_rdreq = (reg_txf_rdreq & (~error));
97
 
98
assign txstatus[15] = ~txf_wrfull; //can write
99
assign txstatus[14:FIFO_WIDTHU+1] = 0;
100
assign txstatus[FIFO_WIDTHU] = txf_wrfull;
101
assign txstatus[FIFO_WIDTHU-1:0] = txf_wrusedw;
102
 
103
assign rxstatus[15] = ~rxf_rdempty; //can read
104
assign rxstatus[14:FIFO_WIDTHU+1] = 0;
105
assign rxstatus[FIFO_WIDTHU] = rxf_rdfull;
106
assign rxstatus[FIFO_WIDTHU-1:0] = rxf_rdusedw;
107
 
108
assign txf_wrclk = ~clk;
109
assign txf_wrreq = (~txf_wrfull & (address == `WRDATA_ADDR)) ? write : 0;
110
assign txf_wrdata = writedata;
111
assign txf_rdclk = usb_clk;
112
 
113
assign rxf_wrclk = usb_clk;
114
assign rxf_rdclk = ~clk;
115
assign rxf_rdreq = (address == `RDDATA_ADDR) ? read : 0;
116
 
117
 
118
dcfifo  txfifo (
119
                                .aclr (reset),
120
                                .data (txf_wrdata),
121
                                .rdclk (txf_rdclk),
122
                                .rdreq (txf_rdreq),
123
                                .wrclk (txf_wrclk),
124
                                .wrreq (txf_wrreq),
125
                                .q (txf_rddata),
126
                                .rdempty (txf_rdempty),
127
                                .wrfull (txf_wrfull),
128
                                .wrusedw (txf_wrusedw),
129
                                .eccstatus (),
130
                                .rdfull (),
131
                                .rdusedw (),
132
                                .wrempty ());
133
        defparam
134
                txfifo.intended_device_family = "Cyclone IV E",
135
                txfifo.lpm_numwords = FIFO_DEPTH,
136
                txfifo.lpm_showahead = "OFF",
137
                txfifo.lpm_type = "dcfifo",
138
                txfifo.lpm_width = 8,
139
                txfifo.lpm_widthu = FIFO_WIDTHU,
140
                txfifo.overflow_checking = "ON",
141
                txfifo.rdsync_delaypipe = 4,
142
                txfifo.read_aclr_synch = "OFF",
143
                txfifo.underflow_checking = "ON",
144
                txfifo.use_eab = "ON",
145
                txfifo.write_aclr_synch = "OFF",
146
                txfifo.wrsync_delaypipe = 4;
147
 
148
 
149
dcfifo  rxfifo (
150
                                .aclr (reset),
151
                                .data (rxf_wrdata),
152
                                .rdclk (rxf_rdclk),
153
                                .rdreq (rxf_rdreq),
154
                                .wrclk (rxf_wrclk),
155
                                .wrreq (rxf_wrreq),
156
                                .q (rxf_rddata),
157
                                .rdempty (rxf_rdempty),
158
                                .wrfull (rxf_wrfull),
159
                                .wrusedw (),
160
                                .eccstatus (),
161
                                .rdfull (rxf_rdfull),
162
                                .rdusedw (rxf_rdusedw),
163
                                .wrempty ());
164
        defparam
165
                rxfifo.intended_device_family = "Cyclone IV E",
166
                rxfifo.lpm_numwords = FIFO_DEPTH,
167
                rxfifo.lpm_showahead = "OFF",
168
                rxfifo.lpm_type = "dcfifo",
169
                rxfifo.lpm_width = 8,
170
                rxfifo.lpm_widthu = FIFO_WIDTHU,
171
                rxfifo.overflow_checking = "ON",
172
                rxfifo.rdsync_delaypipe = 4,
173
                rxfifo.read_aclr_synch = "OFF",
174
                rxfifo.underflow_checking = "ON",
175
                rxfifo.use_eab = "ON",
176
                rxfifo.write_aclr_synch = "OFF",
177
                rxfifo.wrsync_delaypipe = 4;
178
 
179
 
180
 
181
always_ff @(negedge clk)
182
begin
183
        if(read)
184
                addr <= address;
185
end
186
 
187
always_ff @(posedge clk)
188
begin
189
                case(addr)
190
                `RDDATA_ADDR: begin
191
                        readdata <= rxf_rddata;
192
                end
193
                `TXSTATUSL_ADDR: begin
194
                        readdata <= txstatus[7:0];
195
                end
196
                `TXSTATUSH_ADDR: begin
197
                        readdata <= txstatus[15:8];
198
                end
199
                `RXSTATUSL_ADDR: begin
200
                        readdata <= rxstatus[7:0];
201
                end
202
                `RXSTATUSH_ADDR: begin
203
                        readdata <= rxstatus[15:8];
204
                end
205
                default: begin
206
                        readdata <= 8'b0;
207
                end
208
                endcase
209
end
210
 
211
 
212
always_ff @(negedge txf_rdclk or posedge reset)
213
begin
214
        if(reset)
215
        begin
216
                reg_txf_rdreq <= 1'b0;
217
                error <= 1'b0;
218
        end
219
        else
220
        begin
221
                if(usb_oe_n & (~txf_rdempty | error) & ~usb_txe_n)
222
                begin
223
                        reg_txf_rdreq <= 1'b1;
224
                end
225
                else
226
                begin
227
                        reg_txf_rdreq <= 1'b0;
228
                end
229
 
230
                if(reg_txf_rdreq)
231
                begin
232
                        if(usb_txe_n)
233
                                error <= 1'b1;
234
                        else
235
                                error <= 1'b0;
236
                end
237
        end
238
end
239
 
240
always_ff @(posedge usb_clk or posedge reset)
241
begin
242
        if(reset)
243
        begin
244
                reg_usb_wr_n <= 1'b1;
245
        end
246
        else
247
        begin
248
                if(reg_txf_rdreq)
249
                begin
250
                        reg_usb_wr_n <= 1'b0;
251
                end
252
                else
253
                        reg_usb_wr_n <= 1'b1;
254
        end
255
end
256
 
257
always_ff @(posedge usb_clk or posedge reset)
258
begin
259
        if(reset)
260
        begin
261
                reg_usb_rd_n <= 1'b1;
262
                reg_usb_oe_n <= 1'b1;
263
        end
264
        else
265
        begin
266
                if((txf_rdempty | usb_txe_n | ~usb_oe_n) & ~rxf_wrfull & ~usb_rxf_n)
267
                begin
268
                        reg_usb_oe_n <= 1'b0;
269
                        if(~reg_usb_oe_n)
270
                        begin
271
                                reg_usb_rd_n <= 1'b0;
272
                        end
273
                        else
274
                        begin
275
                                reg_usb_rd_n <= 1'b1;
276
                        end
277
                end
278
                else
279
                begin
280
                        reg_usb_oe_n <= 1'b1;
281
                        reg_usb_rd_n <= 1'b1;
282
                end
283
        end
284
end
285
 
286
always_ff @(negedge rxf_wrclk or posedge reset)
287
begin
288
        if(reset)
289
        begin
290
                reg_rxf_wrreq <= 1'b0;
291
        end
292
        else
293
        begin
294
                if(~usb_rd_n & ~usb_rxf_n)
295
                        reg_rxf_wrreq <= 1'b1;
296
                else
297
                        reg_rxf_wrreq <= 1'b0;
298
        end
299
end
300
 
301
 
302
 
303
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.