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_fifos_avalon_mm_interface.sv] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 melman701
module usb_fifos_avalon_mm_interface(
2
  reset_i,
3
  clk_i,
4
 
5
  // Avalon-MM
6
  address_i,
7
  read_i,
8
  readdata_o,
9
  readdatavalid_o,
10
  write_i,
11
  writedata_i,
12
  waitrequest_o,
13
 
14
  // RX FIFO
15
  rxf_rdclk_o,
16
  rxf_rdempty_i,
17
  rxf_rdfull_i,
18
  rxf_rdreq_o,
19
  rxf_rddata_i,
20
  rxf_rdusedw_i,
21
 
22
  // TX FIFO
23
  txf_wrclk_o,
24
  txf_wrfull_i,
25
  txf_wrreq_o,
26
  txf_wrdata_o,
27
  txf_wrusedw_i
28
);
29
 
30
 
31
parameter RX_FIFO_WIDTHU  = 9;
32
parameter TX_FIFO_WIDTHU  = 9;
33
parameter CMD_LATENCY     = 1;
34
parameter READ_LATENCY    = 1;
35
parameter WRITE_LATENCY   = 1;
36
 
37
 
38
localparam WRDATA_ADDR    = 3'd0;
39
localparam RDDATA_ADDR    = 3'd1;
40
localparam TXSTATUSL_ADDR = 3'd2;
41
localparam TXSTATUSH_ADDR = 3'd3;
42
localparam RXSTATUSL_ADDR = 3'd4;
43
localparam RXSTATUSH_ADDR = 3'd5;
44
 
45
 
46
 
47
input  logic                      reset_i;
48
input  logic                      clk_i;
49
  // Avalon-MM
50
input  logic [2:0]                address_i;
51
input  logic                      read_i;
52
output logic [7:0]                readdata_o;
53
output logic                      readdatavalid_o;
54
input  logic                      write_i;
55
input  logic [7:0]                writedata_i;
56
output logic                      waitrequest_o;
57
  // RX FIFO
58
output logic                      rxf_rdclk_o;
59
input  logic                      rxf_rdempty_i;
60
input  logic                      rxf_rdfull_i;
61
output logic                      rxf_rdreq_o;
62
input  logic [7:0]                rxf_rddata_i;
63
input  logic [RX_FIFO_WIDTHU-1:0] rxf_rdusedw_i;
64
  // TX FIFO
65
output logic                      txf_wrclk_o;
66
input  logic                      txf_wrfull_i;
67
output logic                      txf_wrreq_o;
68
output logic [7:0]                txf_wrdata_o;
69
input  logic [TX_FIFO_WIDTHU-1:0] txf_wrusedw_i;
70
 
71
 
72
 
73
 
74
logic [15:0]  txstatus;
75
logic [15:0]  rxstatus;
76
 
77
 
78
logic         read_ready;
79
logic         read_waitrequest;
80
 
81
logic         read_pipe;
82
logic [2:0]   address_pipe;
83
 
84
logic [7:0]   read_data;
85
logic         read_datavalid;
86
 
87
logic         rxf_rdreq_reg;
88
 
89
logic [5:0]   address_decode;
90
logic [5:0]   address_decode_pipe;
91
 
92
logic         ad_en;
93
logic         ad_clken;
94
logic         ad_en_reg;
95
logic [3:0]   ad_status;
96
 
97
logic         ad_rdata;
98
logic         ad_rxsl;
99
logic         ad_rxsh;
100
logic         ad_txsl;
101
logic         ad_txsh;
102
 
103
 
104
 
105
 
106
assign rxf_rdclk_o = clk_i;
107
 
108
 
109
// READ
110
assign read_ready = ~rxf_rdempty_i;
111
assign read_waitrequest = ad_rdata & ~read_ready;
112
 
113
assign ad_en = read_pipe | read_waitrequest;
114
assign ad_clken = (ad_en | ad_en_reg) & ~read_waitrequest;
115
 
116
assign ad_rdata  = address_decode_pipe[1];
117
assign ad_rxsl  = ad_status[2];
118
assign ad_rxsh  = ad_status[3];
119
assign ad_txsl  = ad_status[0];
120
assign ad_txsh  = ad_status[1];
121
 
122
 
123
 
124
 
125
pipeline cmd_pipe_inst (
126
  .clk_i   (clk_i),
127
  .reset_i (reset_i),
128
  // data source side
129
  .valid_i (1'b1),
130
  .data_i  (read_i),
131
  .ready_o (),
132
  // data destination side
133
  .ready_i (~read_waitrequest),
134
  .valid_o (),
135
  .data_o  (read_pipe)
136
  );
137
  defparam
138
    cmd_pipe_inst.LATENCY = CMD_LATENCY,
139
    cmd_pipe_inst.DATA_WIDTH = 1;
140
 
141
 
142
pipeline addr_pipe_inst (
143
  .clk_i   (clk_i),
144
  .reset_i (reset_i),
145
  // data source side
146
  .valid_i (1'b1),
147
  .data_i  (address_i),
148
  .ready_o (),
149
  // data destination side
150
  .ready_i (~read_waitrequest),
151
  .valid_o (),
152
  .data_o  (address_pipe)
153
  );
154
  defparam
155
    addr_pipe_inst.LATENCY = CMD_LATENCY,
156
    addr_pipe_inst.DATA_WIDTH = 3;
157
 
158
 
159
pipeline read_pipe_inst (
160
  .clk_i   (clk_i),
161
  .reset_i (reset_i),
162
  // data source side
163
  .valid_i (read_datavalid),
164
  .data_i  (read_data),
165
  .ready_o (),
166
  // data destination side
167
  .ready_i (1'b1),
168
  .valid_o (readdatavalid_o),
169
  .data_o  (readdata_o)
170
  );
171
  defparam
172
    read_pipe_inst.LATENCY = READ_LATENCY;
173
 
174
 
175
lpm_decode LPM_DECODE_component (
176
  .clock (clk_i),
177
  .data (address_pipe),
178
  .eq (address_decode),
179
  .aclr (),
180
  .clken (ad_clken),
181
  .enable (ad_en)
182
  );
183
  defparam
184
    LPM_DECODE_component.lpm_decodes = 6,
185
    LPM_DECODE_component.lpm_pipeline = 1,
186
    LPM_DECODE_component.lpm_type = "LPM_DECODE",
187
    LPM_DECODE_component.lpm_width = 3;
188
 
189
 
190
 
191
 
192
always_ff @(posedge clk_i)
193
begin
194
  txstatus[15]                  <= ~txf_wrfull_i; //can write
195
  txstatus[14:TX_FIFO_WIDTHU+1] <= 0;
196
  txstatus[TX_FIFO_WIDTHU]      <= txf_wrfull_i;
197
  txstatus[TX_FIFO_WIDTHU-1:0]  <= ( txf_wrfull_i ? {TX_FIFO_WIDTHU{1'b0}} : txf_wrusedw_i );
198
 
199
  rxstatus[15]                  <= ~rxf_rdempty_i; //can read
200
  rxstatus[14:RX_FIFO_WIDTHU+1] <= 0;
201
  rxstatus[RX_FIFO_WIDTHU]      <= rxf_rdfull_i;
202
  rxstatus[RX_FIFO_WIDTHU-1:0]  <= ( rxf_rdempty_i ? {RX_FIFO_WIDTHU{1'b0}} : rxf_rdusedw_i );
203
end
204
 
205
 
206
 
207
/* READ */
208
always_ff @(posedge clk_i)
209
begin
210
  if (~read_waitrequest)
211
    address_decode_pipe <= address_decode;
212
 
213
  ad_en_reg <= ad_en;
214
 
215
  ad_status <= address_decode_pipe[5:2];
216
end
217
 
218
 
219
always_ff @(posedge clk_i)
220
begin
221
  if (rxf_rdreq_reg)
222
    begin
223
      read_data <= rxf_rddata_i;
224
      read_datavalid <= 1;
225
    end
226
  else if (ad_rxsl)
227
    begin
228
      read_data <= rxstatus[7:0];
229
      read_datavalid <= 1;
230
    end
231
  else if (ad_rxsh)
232
    begin
233
      read_data <= rxstatus[15:8];
234
      read_datavalid <= 1;
235
    end
236
  else if (ad_txsl)
237
    begin
238
      read_data <= txstatus[7:0];
239
      read_datavalid <= 1;
240
    end
241
  else if (ad_txsh)
242
    begin
243
      read_data <= txstatus[15:8];
244
      read_datavalid <= 1;
245
    end
246
  else
247
    begin
248
      read_data <= 0;
249
      read_datavalid <= 0;
250
    end
251
end
252
 
253
 
254
always_ff @(negedge rxf_rdclk_o or posedge reset_i)
255
begin
256
  if (reset_i)
257
    begin
258
      rxf_rdreq_o <= 1'b0;
259
    end
260
  else
261
    begin
262
      if (ad_rdata & ~rxf_rdempty_i)
263
        rxf_rdreq_o <= 1'b1;
264
      else
265
        rxf_rdreq_o <= 1'b0;
266
    end
267
end
268
 
269
 
270
always_ff @(posedge clk_i)
271
begin
272
  rxf_rdreq_reg <= rxf_rdreq_o;
273
end
274
/*==========================================*/
275
 
276
 
277
 
278
 
279
/*          ----=== WRITE ===----           */
280
 
281
logic         write_reg;
282
logic         write_data_request;
283
logic         write_ready;
284
logic [7:0]   write_data;
285
logic         write_datavalid;
286
logic         write_waitrequest;
287
 
288
logic         txf_wrfull_reg;
289
 
290
logic [2:0]   write_data_addr = WRDATA_ADDR;
291
 
292
 
293
 
294
assign txf_wrclk_o = ~clk_i;
295
 
296
assign write_ready = ~txf_wrfull_reg;
297
assign write_datavalid = write_reg & write_data_request & write_ready;
298
assign write_waitrequest = ~write_ready;
299
 
300
 
301
 
302
lpm_compare LPM_COMPARE_component (
303
  .clken (1'b1),
304
  .clock (clk_i),
305
  .dataa (address_i),
306
  .datab (write_data_addr),
307
  .aeb (write_data_request),
308
  .aclr (reset_i),
309
  .agb (),
310
  .ageb (),
311
  .alb (),
312
  .aleb (),
313
  .aneb ());
314
  defparam
315
    LPM_COMPARE_component.lpm_hint = "ONE_INPUT_IS_CONSTANT=YES",
316
    LPM_COMPARE_component.lpm_pipeline = 1,
317
    LPM_COMPARE_component.lpm_representation = "UNSIGNED",
318
    LPM_COMPARE_component.lpm_type = "LPM_COMPARE",
319
    LPM_COMPARE_component.lpm_width = 3;
320
 
321
 
322
pipeline write_pipe_inst (
323
  .clk_i   (clk_i),
324
  .reset_i (reset_i),
325
  // data source side
326
  .valid_i (write_datavalid),
327
  .data_i  (write_data),
328
  .ready_o (),
329
  // data destination side
330
  .ready_i (write_ready),
331
  .valid_o (txf_wrreq_o),
332
  .data_o  (txf_wrdata_o)
333
  );
334
  defparam
335
    write_pipe_inst.LATENCY = WRITE_LATENCY;
336
 
337
 
338
 
339
 
340
always_ff @(posedge clk_i)
341
begin
342
  txf_wrfull_reg <= txf_wrfull_i;
343
end
344
 
345
 
346
always_ff @(posedge clk_i or posedge reset_i)
347
begin
348
  if (reset_i)
349
    begin
350
      write_data <= '0;
351
      write_reg <= 1'b0;
352
    end
353
  else
354
    begin
355
      if (write_i & write_ready)
356
        write_data <= writedata_i;
357
 
358
      if (~write_waitrequest)
359
        write_reg <= write_i;
360
    end
361
end
362
/*==========================================*/
363
 
364
 
365
 
366
assign waitrequest_o = (read_waitrequest & read_i) | (write_i & write_waitrequest);
367
 
368
 
369
endmodule

powered by: WebSVN 2.1.0

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