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

Subversion Repositories dma_axi

[/] [dma_axi/] [trunk/] [src/] [dma_axi64/] [dma_axi64_core0_ch_wr_slicer.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 eyalhoc
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Author: Eyal Hochberg                                      ////
4
////          eyal@provartec.com                                 ////
5
////                                                             ////
6
////  Downloaded from: http://www.opencores.org                  ////
7
/////////////////////////////////////////////////////////////////////
8
////                                                             ////
9
//// Copyright (C) 2010 Provartec LTD                            ////
10
//// www.provartec.com                                           ////
11
//// info@provartec.com                                          ////
12
////                                                             ////
13
//// This source file may be used and distributed without        ////
14
//// restriction provided that this copyright statement is not   ////
15
//// removed from the file and that any derivative work contains ////
16
//// the original copyright notice and the associated disclaimer.////
17
////                                                             ////
18
//// This source file is free software; you can redistribute it  ////
19
//// and/or modify it under the terms of the GNU Lesser General  ////
20
//// Public License as published by the Free Software Foundation.////
21
////                                                             ////
22
//// This source is distributed in the hope that it will be      ////
23
//// useful, but WITHOUT ANY WARRANTY; without even the implied  ////
24
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR     ////
25
//// PURPOSE.  See the GNU Lesser General Public License for more////
26
//// details. http://www.gnu.org/licenses/lgpl.html              ////
27
////                                                             ////
28
/////////////////////////////////////////////////////////////////////
29 2 eyalhoc
//---------------------------------------------------------
30
//-- File generated by RobustVerilog parser
31
//-- Version: 1.0
32
//-- Invoked Fri Mar 25 23:36:57 2011
33
//--
34
//-- Source file: dma_ch_wr_slicer.v
35
//---------------------------------------------------------
36
 
37
 
38
 
39
module  dma_axi64_core0_ch_wr_slicer (clk,reset,ch_update,rd_clr_line,fifo_wr,fifo_wdata,fifo_wsize,wr_align,wr_ptr,rd_incr,end_swap,slice_wr,slice_wr_fifo,slice_wr_ptr,slice_bsel,slice_wdata,slice_wsize);
40
 
41
   input               clk;
42
   input               reset;
43
 
44
   input               ch_update;
45
   input               rd_clr_line;
46
 
47
   input               fifo_wr;
48
   input [64-1:0]      fifo_wdata;
49
   input [4-1:0]      fifo_wsize;
50
   input [3-1:0]      wr_align;
51
   input [5-1:0]      wr_ptr;
52
   input               rd_incr;
53
   input [1:0]               end_swap;
54
 
55
   output               slice_wr;
56
   output               slice_wr_fifo;
57
   output [5-1:0]     slice_wr_ptr;
58
   output [8-1:0]     slice_bsel;
59
   output [64-1:0]     slice_wdata;
60
   output [4-1:0]     slice_wsize;
61
 
62
 
63
 
64
   reg [4-1:0]           line_remain;
65
   wire [4-1:0]       join_wsize;
66
   wire [4-1:0]       append_wsize;
67
   wire [4-1:0]       direct_wsize;
68
   reg                   append;
69
   reg [4-1:0]           next_size;
70
 
71
   reg [64-1:0]           align_wdata;
72
   reg [64-1:0]           align_wdata_d;
73
   wire [3-1:0]       wr_align_valid;
74
   reg [64-1:0]           next_wdata;
75
   wire [8-1:0]       bsel_dec;
76
   reg [8-1:0]           bsel_shift;
77
 
78
   wire               next_wr;
79
 
80
   wire               slice_wr_pre;
81
   wire [5-1:0]       slice_wr_ptr_pre;
82
   wire [8-1:0]       slice_bsel_pre;
83
   wire [8-1:0]       slice_bsel_swap;
84
   wire [64-1:0]       slice_wdata_pre;
85
   reg [64-1:0]           slice_wdata_pre_d;
86
   wire [64-1:0]       slice_wdata_swap;
87
   wire [4-1:0]       slice_wsize_pre;
88
 
89
   wire               slice_wr;
90
   wire               slice_wr_fifo;
91
   reg [5-1:0]           slice_wr_ptr;
92
   reg [8-1:0]           slice_bsel;
93
   reg [64-1:0]           slice_wdata;
94
   reg [4-1:0]           slice_wsize;
95
 
96
 
97
   always @(posedge clk or posedge reset)
98
     if (reset)
99
       line_remain <= #1 4'd8;
100
     else if (ch_update |  rd_clr_line)
101
       line_remain <= #1 4'd8;
102
     else if (slice_wr_pre & (line_remain == slice_wsize_pre))
103
       line_remain <= #1 4'd8;
104
     else if (slice_wr_pre)
105
       line_remain <= #1 line_remain - slice_wsize_pre;
106
 
107
   assign               join_wsize = next_size + fifo_wsize;
108
 
109
   prgen_min2 #(4) min2_append(
110
                     .a(join_wsize),
111
                     .b(4'd8),
112
                     .min(append_wsize)
113
                     );
114
 
115
   prgen_min2 #(4) min2_direct(
116
                     .a(line_remain),
117
                     .b(fifo_wsize),
118
                     .min(direct_wsize)
119
                     );
120
 
121
 
122
   always @(posedge clk or posedge reset)
123
     if (reset)
124
       append  <= #1 1'b0;
125
     else if (next_wr)
126
       append  <= #1 1'b0;
127
     else if (fifo_wr & (slice_wsize_pre == join_wsize))
128
       append  <= #1 1'b0;
129
     else if (fifo_wr)
130
       append  <= #1 1'b1;
131
 
132
 
133
   always @(posedge clk or posedge reset)
134
     if (reset)
135
       next_size  <= #1 {4{1'b0}};
136
     else if (next_wr)
137
       next_size  <= #1 {4{1'b0}};
138
     else if (fifo_wr & append)
139
       next_size  <= #1 join_wsize - append_wsize;
140
     else if (fifo_wr)
141
       next_size  <= #1 join_wsize - direct_wsize;
142
 
143
 
144
   //WDATA
145
   always @(posedge clk or posedge reset)
146
     if (reset)
147
       align_wdata_d <= #1 {64{1'b0}};
148
     else if (fifo_wr)
149
       align_wdata_d <= #1 align_wdata;
150
 
151
 
152
   assign               wr_align_valid =
153
                  rd_incr ? wr_align :
154
                  wr_align - wr_ptr[3-1:0];
155
 
156
   //always @(/*AUTOSENSE*/) - no AUTOSENSE because of fifo_wr
157
   always @(fifo_wdata or wr_align_valid or fifo_wr)
158
     begin
159
    case (wr_align_valid[3-1:0])
160
      3'd0 : align_wdata = fifo_wdata;
161
      3'd1 : align_wdata = {fifo_wdata[7:0],  fifo_wdata[63:8]};
162
      3'd2 : align_wdata = {fifo_wdata[15:0], fifo_wdata[63:16]};
163
      3'd3 : align_wdata = {fifo_wdata[23:0], fifo_wdata[63:24]};
164
      3'd4 : align_wdata = {fifo_wdata[31:0], fifo_wdata[63:32]};
165
      3'd5 : align_wdata = {fifo_wdata[39:0], fifo_wdata[63:40]};
166
      3'd6 : align_wdata = {fifo_wdata[47:0], fifo_wdata[63:48]};
167
      3'd7 : align_wdata = {fifo_wdata[55:0], fifo_wdata[63:56]};
168
    endcase
169
     end
170
 
171
 
172
   always @(/*AUTOSENSE*/align_wdata or align_wdata_d or next_size)
173
     begin
174
    case (next_size[3-1:0])
175
      3'd0 : next_wdata = align_wdata_d;
176
      3'd1 : next_wdata = {align_wdata[63:8],  align_wdata_d[7:0]};
177
      3'd2 : next_wdata = {align_wdata[63:16], align_wdata_d[15:0]};
178
      3'd3 : next_wdata = {align_wdata[63:24], align_wdata_d[23:0]};
179
      3'd4 : next_wdata = {align_wdata[63:32], align_wdata_d[31:0]};
180
      3'd5 : next_wdata = {align_wdata[63:40], align_wdata_d[39:0]};
181
      3'd6 : next_wdata = {align_wdata[63:48], align_wdata_d[47:0]};
182
      3'd7 : next_wdata = {align_wdata[63:56], align_wdata_d[55:0]};
183
    endcase
184
     end
185
 
186
 
187
   //BSEL
188
   assign bsel_dec =
189
      slice_wsize == 4'd1 ? 8'b00000001 :
190
      slice_wsize == 4'd2 ? 8'b00000011 :
191
      slice_wsize == 4'd3 ? 8'b00000111 :
192
      slice_wsize == 4'd4 ? 8'b00001111 :
193
      slice_wsize == 4'd5 ? 8'b00011111 :
194
      slice_wsize == 4'd6 ? 8'b00111111 :
195
      slice_wsize == 4'd7 ? 8'b01111111 :
196
      slice_wsize == 4'd8 ? 8'b11111111 :
197
             {8{1'b0}};
198
 
199
 
200
   always @(/*AUTOSENSE*/bsel_dec or wr_ptr)
201
     begin
202
    case (wr_ptr[3-1:0])
203
      3'd0 : bsel_shift = bsel_dec;
204
      3'd1 : bsel_shift = {bsel_dec[6:0], 1'b0};
205
      3'd2 : bsel_shift = {bsel_dec[5:0], 2'b0};
206
      3'd3 : bsel_shift = {bsel_dec[4:0], 3'b0};
207
      3'd4 : bsel_shift = {bsel_dec[3:0], 4'b0};
208
      3'd5 : bsel_shift = {bsel_dec[2:0], 5'b0};
209
      3'd6 : bsel_shift = {bsel_dec[1:0], 6'b0};
210
      3'd7 : bsel_shift = {bsel_dec[0],   7'b0};
211
    endcase
212
     end
213
 
214
 
215
   //CMD
216
   assign next_wr             = (~fifo_wr) & (|next_size);
217
 
218
   assign slice_wr_pre        = fifo_wr | next_wr;
219
 
220
   assign slice_wsize_pre     =
221
      next_wr ? next_size    :
222
      append  ? append_wsize : direct_wsize;
223
 
224
   assign slice_wr_ptr_pre    = wr_ptr;
225
 
226
   assign slice_wdata_pre     = append ? next_wdata : align_wdata;
227
 
228
   assign slice_bsel_pre      = bsel_shift;
229
 
230
 
231
   prgen_delay #(1) delay_wr0(.clk(clk), .reset(reset), .din(slice_wr_pre), .dout(slice_wr));
232
   prgen_delay #(1) delay_wr(.clk(clk), .reset(reset), .din(slice_wr), .dout(slice_wr_fifo));
233
 
234
 
235
   always @(posedge clk or posedge reset)
236
     if (reset)
237
       begin
238
      slice_wsize       <= #1 {4{1'b0}};
239
      slice_wdata_pre_d <= #1 {64{1'b0}};
240
       end
241
     else if (slice_wr_pre)
242
       begin
243
      slice_wsize       <= #1 slice_wsize_pre;
244
      slice_wdata_pre_d <= #1 slice_wdata_pre;
245
       end
246
 
247
 
248
   prgen_swap64 swap64(
249
               .end_swap(end_swap),
250
               .data_in(slice_wdata_pre_d),
251
               .data_out(slice_wdata_swap),
252
               .bsel_in(slice_bsel_pre),
253
               .bsel_out(slice_bsel_swap)
254
               );
255
 
256
   always @(posedge clk or posedge reset)
257
     if (reset)
258
       begin
259
      slice_wdata   <= #1 {64{1'b0}};
260
      slice_wr_ptr  <= #1 {5{1'b0}};
261
      slice_bsel    <= #1 {8{1'b0}};
262
       end
263
     else if (slice_wr)
264
       begin
265
      slice_wdata   <= #1 slice_wdata_swap;
266
      slice_wr_ptr  <= #1 slice_wr_ptr_pre;
267
      slice_bsel    <= #1 slice_bsel_swap;
268
       end
269
 
270
endmodule
271
 
272
 
273
 
274
 
275
 
276
 

powered by: WebSVN 2.1.0

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