OpenCores
URL https://opencores.org/ocsvn/qaz_libs/qaz_libs/trunk

Subversion Repositories qaz_libs

[/] [qaz_libs/] [trunk/] [axi4_stream_lib/] [src/] [axis_to_memory.sv] - Blame information for rev 50

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 50 qaztronic
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
//// Copyright (C) 2019 Authors and OPENCORES.ORG                 ////
4
////                                                              ////
5
//// This source file may be used and distributed without         ////
6
//// restriction provided that this copyright statement is not    ////
7
//// removed from the file and that any derivative work contains  ////
8
//// the original copyright notice and the associated disclaimer. ////
9
////                                                              ////
10
//// This source file is free software; you can redistribute it   ////
11
//// and/or modify it under the terms of the GNU Lesser General   ////
12
//// Public License as published by the Free Software Foundation; ////
13
//// either version 2.1 of the License, or (at your option) any   ////
14
//// later version.                                               ////
15
////                                                              ////
16
//// This source is distributed in the hope that it will be       ////
17
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
18
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
19
//// PURPOSE.  See the GNU Lesser General Public License for more ////
20
//// details.                                                     ////
21
////                                                              ////
22
//// You should have received a copy of the GNU Lesser General    ////
23
//// Public License along with this source; if not, download it   ////
24
//// from http://www.opencores.org/lgpl.shtml                     ////
25
////                                                              ////
26
//////////////////////////////////////////////////////////////////////
27
 
28
module
29
  axis_to_memory
30
  #(
31
    W, // data width in bits
32
    A, // address width in bits
33
    P = 1 // pipeline delay
34
  )
35
  (
36
    axis_if        axis_ar,
37
    axis_if        axis_r,
38
    output         wr,
39
    output [A-1:0] addr,
40
    output [W-1:0] din,
41
    input  [W-1:0] dout,
42
    input          aclk,
43
    input          aresetn
44
  );
45
 
46
  // --------------------------------------------------------------------
47
  localparam CW = ($clog2(P) == 0) ? 1 : $clog2(P);
48
  localparam D = 2 ** CW;
49
  localparam UB = $clog2(D);
50
 
51
  // --------------------------------------------------------------------
52
  reg [P-1:0] pipeline;
53
  wire ar = axis_ar.tready & axis_ar.tvalid;
54
  wire rd_ready = pipeline[0];
55
  wire bypass;
56
 
57
  generate
58
    if(P > 1) begin: pipeline_gen
59
      always_ff @(posedge aclk)
60
        if(~aresetn)
61
          pipeline <= 0;
62
        else
63
          pipeline <= {ar, pipeline[P-1:1]};
64
    end
65
    else begin: min_pipeline_gen // P == 1
66
      always_ff @(posedge aclk)
67
        if(~aresetn)
68
          pipeline <= 0;
69
        else
70
          pipeline <= ar;
71
    end
72
  endgenerate
73
 
74
  // --------------------------------------------------------------------
75
  wire          wr_full;
76
  wire [W-1:0]  wr_data = dout;
77
  wire          wr_en = bypass ? 0 : rd_ready;
78
  wire          rd_empty;
79
  wire [W-1:0]  rd_data;
80
  wire          rd_en = axis_r.tready & axis_r.tvalid & ~bypass;
81
  wire [UB:0]   count;
82
 
83
  sync_fifo #(W, D) fifo_i(.clk(aclk), .reset(~aresetn), .*);
84
 
85
  // --------------------------------------------------------------------
86
  // assign bypass = rd_empty & (count != 0) & rd_ready;
87
  assign bypass = 0;
88
 
89
  // // --------------------------------------------------------------------
90
  // logic [$clog2($bits(pipeline)+1)-1:0] in_pipeline;
91
 
92
  // always_comb begin
93
    // in_pipeline = '0;
94
 
95
    // foreach(pipeline[idx]) begin
96
      // in_pipeline += pipeline[idx];
97
    // end
98
  // end
99
 
100
  // --------------------------------------------------------------------
101
  reg [$clog2($bits(pipeline)+1)-1:0] pipeline_count;
102
  reg [$clog2($bits(pipeline)+1)-1:0] next_pipeline_count;
103
 
104
  always_comb
105
    case({rd_ready, ar})
106
      2'b0_0: next_pipeline_count = pipeline_count;
107
      2'b0_1: next_pipeline_count = pipeline_count + 1;
108
      2'b1_0: next_pipeline_count = pipeline_count - 1;
109
      2'b1_1: next_pipeline_count = pipeline_count;
110
  endcase
111
 
112
  always_ff @(posedge aclk)
113
    if(~aresetn)
114
      pipeline_count <= 0;
115
    else
116
      pipeline_count <= next_pipeline_count;
117
 
118
  // --------------------------------------------------------------------
119
  assign axis_ar.tready = (pipeline_count + count < D) | rd_en;
120
  assign axis_r.tdata = bypass ? dout : rd_data;
121
  assign axis_r.tlast = 1;
122
  assign axis_r.tvalid = ~rd_empty | bypass;
123
 
124
  // --------------------------------------------------------------------
125
  assign wr = 0;
126
  // assign addr = axis_ar.tdata;
127
 
128
// --------------------------------------------------------------------
129
endmodule

powered by: WebSVN 2.1.0

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