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

Subversion Repositories qaz_libs

[/] [qaz_libs/] [trunk/] [video/] [src/] [avf_line_buffer_merge.sv] - Blame information for rev 49

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 49 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
  avf_line_buffer_merge #(N, U, L)
30
  (
31
    axis_if merge_in[L],
32
    axis_if axis_out,
33
    input [L-2:0] initialized,
34
    input   init,
35
    input   flush,
36
    input   enable,
37
    input   aclk,
38
    input   aresetn
39
  );
40
 
41
  // --------------------------------------------------------------------
42
  localparam W = (N*8) + U + 1; // tdata + tuser + tlast
43
 
44
  // --------------------------------------------------------------------
45
  wire int_done[L];
46
  assign int_done[0] = ~init;
47
 
48
  generate
49
    for(genvar j = 1; j < L; j++)
50
    begin: trailing_gen
51
      assign int_done[j] = initialized[j-1];
52
    end
53
  endgenerate
54
 
55
  // --------------------------------------------------------------------
56
  wire [L-1:0]  wr_full;
57
  wire          wr_en[L];
58
  wire [L-1:0]  rd_empty;
59
  wire [W-1:0]  rd_data[L];
60
  wire          rd_en = axis_out.tready & axis_out.tvalid;
61
  wire [L-1:0] valid;
62
  wire all_valid = &valid;
63
  wire all_not_full = ~(|wr_full);
64
  wire all_not_empty = ~(|rd_empty);
65
  wire tlast[L];
66
  wire [U-1:0] tuser[L];
67
  wire [(N*8)-1:0] tdata[L];
68
 
69
  generate
70
    for(genvar j = 0; j < L; j++)
71
    begin: row_gen
72
      tiny_sync_fifo #(W)
73
        tiny_sync_fifo_i
74
        (
75
          .wr_full(wr_full[j]),
76
          .wr_data({merge_in[j].tlast, merge_in[j].tuser, merge_in[j].tdata}),
77
          .wr_en(wr_en[j]),
78
          .rd_empty(rd_empty[j]),
79
          .rd_data(rd_data[j]),
80
          // .rd_en(rd_en[j]),
81
          .rd_en(rd_en),
82
          .clk(aclk),
83
          .reset(~aresetn),
84
          .*
85
        );
86
 
87
      assign wr_en[j] = ~init & ~flush & merge_in[j].tready & merge_in[j].tvalid;
88
      // assign merge_in[j].tready = flush | (init & ~int_done[j]) | (all_valid & all_not_full); // fixme
89
      assign merge_in[j].tready = (init & ~int_done[j]) | (all_valid & all_not_full);
90
      assign valid[j] = merge_in[j].tvalid;
91
      assign {tlast[j], tuser[j], tdata[j]} = rd_data[j];
92
    end
93
  endgenerate
94
 
95
  // --------------------------------------------------------------------
96
  assign axis_out.tvalid = all_not_empty;
97
  assign axis_out.tdata = {tdata[2], tdata[1], tdata[0]};
98
  assign axis_out.tlast = tlast[0];
99
  assign axis_out.tuser[1:0] = tuser[0][1:0];
100
  assign axis_out.tuser[2] = tuser[0][2];
101
 
102
// --------------------------------------------------------------------
103
endmodule

powered by: WebSVN 2.1.0

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