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 2

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

Line No. Rev Author Line
1 2 eyalhoc
//---------------------------------------------------------
2
//-- File generated by RobustVerilog parser
3
//-- Version: 1.0
4
//-- Invoked Fri Mar 25 23:36:57 2011
5
//--
6
//-- Source file: dma_ch_wr_slicer.v
7
//---------------------------------------------------------
8
 
9
 
10
 
11
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);
12
 
13
   input               clk;
14
   input               reset;
15
 
16
   input               ch_update;
17
   input               rd_clr_line;
18
 
19
   input               fifo_wr;
20
   input [64-1:0]      fifo_wdata;
21
   input [4-1:0]      fifo_wsize;
22
   input [3-1:0]      wr_align;
23
   input [5-1:0]      wr_ptr;
24
   input               rd_incr;
25
   input [1:0]               end_swap;
26
 
27
   output               slice_wr;
28
   output               slice_wr_fifo;
29
   output [5-1:0]     slice_wr_ptr;
30
   output [8-1:0]     slice_bsel;
31
   output [64-1:0]     slice_wdata;
32
   output [4-1:0]     slice_wsize;
33
 
34
 
35
 
36
   reg [4-1:0]           line_remain;
37
   wire [4-1:0]       join_wsize;
38
   wire [4-1:0]       append_wsize;
39
   wire [4-1:0]       direct_wsize;
40
   reg                   append;
41
   reg [4-1:0]           next_size;
42
 
43
   reg [64-1:0]           align_wdata;
44
   reg [64-1:0]           align_wdata_d;
45
   wire [3-1:0]       wr_align_valid;
46
   reg [64-1:0]           next_wdata;
47
   wire [8-1:0]       bsel_dec;
48
   reg [8-1:0]           bsel_shift;
49
 
50
   wire               next_wr;
51
 
52
   wire               slice_wr_pre;
53
   wire [5-1:0]       slice_wr_ptr_pre;
54
   wire [8-1:0]       slice_bsel_pre;
55
   wire [8-1:0]       slice_bsel_swap;
56
   wire [64-1:0]       slice_wdata_pre;
57
   reg [64-1:0]           slice_wdata_pre_d;
58
   wire [64-1:0]       slice_wdata_swap;
59
   wire [4-1:0]       slice_wsize_pre;
60
 
61
   wire               slice_wr;
62
   wire               slice_wr_fifo;
63
   reg [5-1:0]           slice_wr_ptr;
64
   reg [8-1:0]           slice_bsel;
65
   reg [64-1:0]           slice_wdata;
66
   reg [4-1:0]           slice_wsize;
67
 
68
 
69
   always @(posedge clk or posedge reset)
70
     if (reset)
71
       line_remain <= #1 4'd8;
72
     else if (ch_update |  rd_clr_line)
73
       line_remain <= #1 4'd8;
74
     else if (slice_wr_pre & (line_remain == slice_wsize_pre))
75
       line_remain <= #1 4'd8;
76
     else if (slice_wr_pre)
77
       line_remain <= #1 line_remain - slice_wsize_pre;
78
 
79
   assign               join_wsize = next_size + fifo_wsize;
80
 
81
   prgen_min2 #(4) min2_append(
82
                     .a(join_wsize),
83
                     .b(4'd8),
84
                     .min(append_wsize)
85
                     );
86
 
87
   prgen_min2 #(4) min2_direct(
88
                     .a(line_remain),
89
                     .b(fifo_wsize),
90
                     .min(direct_wsize)
91
                     );
92
 
93
 
94
   always @(posedge clk or posedge reset)
95
     if (reset)
96
       append  <= #1 1'b0;
97
     else if (next_wr)
98
       append  <= #1 1'b0;
99
     else if (fifo_wr & (slice_wsize_pre == join_wsize))
100
       append  <= #1 1'b0;
101
     else if (fifo_wr)
102
       append  <= #1 1'b1;
103
 
104
 
105
   always @(posedge clk or posedge reset)
106
     if (reset)
107
       next_size  <= #1 {4{1'b0}};
108
     else if (next_wr)
109
       next_size  <= #1 {4{1'b0}};
110
     else if (fifo_wr & append)
111
       next_size  <= #1 join_wsize - append_wsize;
112
     else if (fifo_wr)
113
       next_size  <= #1 join_wsize - direct_wsize;
114
 
115
 
116
   //WDATA
117
   always @(posedge clk or posedge reset)
118
     if (reset)
119
       align_wdata_d <= #1 {64{1'b0}};
120
     else if (fifo_wr)
121
       align_wdata_d <= #1 align_wdata;
122
 
123
 
124
   assign               wr_align_valid =
125
                  rd_incr ? wr_align :
126
                  wr_align - wr_ptr[3-1:0];
127
 
128
   //always @(/*AUTOSENSE*/) - no AUTOSENSE because of fifo_wr
129
   always @(fifo_wdata or wr_align_valid or fifo_wr)
130
     begin
131
    case (wr_align_valid[3-1:0])
132
      3'd0 : align_wdata = fifo_wdata;
133
      3'd1 : align_wdata = {fifo_wdata[7:0],  fifo_wdata[63:8]};
134
      3'd2 : align_wdata = {fifo_wdata[15:0], fifo_wdata[63:16]};
135
      3'd3 : align_wdata = {fifo_wdata[23:0], fifo_wdata[63:24]};
136
      3'd4 : align_wdata = {fifo_wdata[31:0], fifo_wdata[63:32]};
137
      3'd5 : align_wdata = {fifo_wdata[39:0], fifo_wdata[63:40]};
138
      3'd6 : align_wdata = {fifo_wdata[47:0], fifo_wdata[63:48]};
139
      3'd7 : align_wdata = {fifo_wdata[55:0], fifo_wdata[63:56]};
140
    endcase
141
     end
142
 
143
 
144
   always @(/*AUTOSENSE*/align_wdata or align_wdata_d or next_size)
145
     begin
146
    case (next_size[3-1:0])
147
      3'd0 : next_wdata = align_wdata_d;
148
      3'd1 : next_wdata = {align_wdata[63:8],  align_wdata_d[7:0]};
149
      3'd2 : next_wdata = {align_wdata[63:16], align_wdata_d[15:0]};
150
      3'd3 : next_wdata = {align_wdata[63:24], align_wdata_d[23:0]};
151
      3'd4 : next_wdata = {align_wdata[63:32], align_wdata_d[31:0]};
152
      3'd5 : next_wdata = {align_wdata[63:40], align_wdata_d[39:0]};
153
      3'd6 : next_wdata = {align_wdata[63:48], align_wdata_d[47:0]};
154
      3'd7 : next_wdata = {align_wdata[63:56], align_wdata_d[55:0]};
155
    endcase
156
     end
157
 
158
 
159
   //BSEL
160
   assign bsel_dec =
161
      slice_wsize == 4'd1 ? 8'b00000001 :
162
      slice_wsize == 4'd2 ? 8'b00000011 :
163
      slice_wsize == 4'd3 ? 8'b00000111 :
164
      slice_wsize == 4'd4 ? 8'b00001111 :
165
      slice_wsize == 4'd5 ? 8'b00011111 :
166
      slice_wsize == 4'd6 ? 8'b00111111 :
167
      slice_wsize == 4'd7 ? 8'b01111111 :
168
      slice_wsize == 4'd8 ? 8'b11111111 :
169
             {8{1'b0}};
170
 
171
 
172
   always @(/*AUTOSENSE*/bsel_dec or wr_ptr)
173
     begin
174
    case (wr_ptr[3-1:0])
175
      3'd0 : bsel_shift = bsel_dec;
176
      3'd1 : bsel_shift = {bsel_dec[6:0], 1'b0};
177
      3'd2 : bsel_shift = {bsel_dec[5:0], 2'b0};
178
      3'd3 : bsel_shift = {bsel_dec[4:0], 3'b0};
179
      3'd4 : bsel_shift = {bsel_dec[3:0], 4'b0};
180
      3'd5 : bsel_shift = {bsel_dec[2:0], 5'b0};
181
      3'd6 : bsel_shift = {bsel_dec[1:0], 6'b0};
182
      3'd7 : bsel_shift = {bsel_dec[0],   7'b0};
183
    endcase
184
     end
185
 
186
 
187
   //CMD
188
   assign next_wr             = (~fifo_wr) & (|next_size);
189
 
190
   assign slice_wr_pre        = fifo_wr | next_wr;
191
 
192
   assign slice_wsize_pre     =
193
      next_wr ? next_size    :
194
      append  ? append_wsize : direct_wsize;
195
 
196
   assign slice_wr_ptr_pre    = wr_ptr;
197
 
198
   assign slice_wdata_pre     = append ? next_wdata : align_wdata;
199
 
200
   assign slice_bsel_pre      = bsel_shift;
201
 
202
 
203
   prgen_delay #(1) delay_wr0(.clk(clk), .reset(reset), .din(slice_wr_pre), .dout(slice_wr));
204
   prgen_delay #(1) delay_wr(.clk(clk), .reset(reset), .din(slice_wr), .dout(slice_wr_fifo));
205
 
206
 
207
   always @(posedge clk or posedge reset)
208
     if (reset)
209
       begin
210
      slice_wsize       <= #1 {4{1'b0}};
211
      slice_wdata_pre_d <= #1 {64{1'b0}};
212
       end
213
     else if (slice_wr_pre)
214
       begin
215
      slice_wsize       <= #1 slice_wsize_pre;
216
      slice_wdata_pre_d <= #1 slice_wdata_pre;
217
       end
218
 
219
 
220
   prgen_swap64 swap64(
221
               .end_swap(end_swap),
222
               .data_in(slice_wdata_pre_d),
223
               .data_out(slice_wdata_swap),
224
               .bsel_in(slice_bsel_pre),
225
               .bsel_out(slice_bsel_swap)
226
               );
227
 
228
   always @(posedge clk or posedge reset)
229
     if (reset)
230
       begin
231
      slice_wdata   <= #1 {64{1'b0}};
232
      slice_wr_ptr  <= #1 {5{1'b0}};
233
      slice_bsel    <= #1 {8{1'b0}};
234
       end
235
     else if (slice_wr)
236
       begin
237
      slice_wdata   <= #1 slice_wdata_swap;
238
      slice_wr_ptr  <= #1 slice_wr_ptr_pre;
239
      slice_bsel    <= #1 slice_bsel_swap;
240
       end
241
 
242
endmodule
243
 
244
 
245
 
246
 
247
 
248
 

powered by: WebSVN 2.1.0

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