多通道的AXI仲裁方法【第三版】:互联状态机

参考:

循环优先级仲裁~位屏蔽仲裁算法_循环优先级仲裁器-CSDN博客

真的写出来以后比想象的简单很多~

读仲裁:

  1 module  Aribe_state_rd #(
  2         parameter integer M_AXI_ID_WIDTH                    = 1          ,
  3         parameter integer M_AXI_ADDR_WIDTH                  = 32         ,
  4         parameter integer M_AXI_DATA_WIDTH                  = 64         ,
  5         parameter integer M_AXI_AWUSER_WIDTH                = 0          ,
  6         parameter integer M_AXI_ARUSER_WIDTH                = 0          ,
  7         parameter integer M_AXI_WUSER_WIDTH                 = 0          ,
  8         parameter integer M_AXI_RUSER_WIDTH                 = 0          ,
  9         parameter integer M_AXI_BUSER_WIDTH                 = 0          
 10     )(
 11         input    wire                              I_clk                       ,
 12         input    wire                              I_Rst_n                     ,
 13         //Port                 
 14         //ch0                  
 15         input    wire                              I_ch0_req                   ,
 16         input    wire                              I_ch0_start                 ,
 17         input    wire                              I_ch0_end                   ,
 18         output   wire                              O_ch0_vaild                 ,
 19         //ch1                  
 20         input    wire                              I_ch1_req                   ,
 21         input    wire                              I_ch1_start                 ,
 22         input    wire                              I_ch1_end                   ,
 23         output   wire                              O_ch1_vaild                 ,
 24         //ch2                  
 25         input    wire                              I_ch2_req                   ,
 26         input    wire                              I_ch2_start                 ,
 27         input    wire                              I_ch2_end                   ,
 28         output   wire                              O_ch2_vaild                 ,
 29         //ch3                  
 30         input    wire                              I_ch3_req                   ,
 31         input    wire                              I_ch3_start                 ,
 32         input    wire                              I_ch3_end                   ,
 33         output   wire                              O_ch3_vaild                 ,
 34     //CH0
 35         input    wire [M_AXI_ID_WIDTH-1 : 0]       CH0_M_AXI_ARID              ,
 36         input    wire [M_AXI_ADDR_WIDTH-1 : 0]     CH0_M_AXI_ARADDR            ,
 37         input    wire [7 : 0]                      CH0_M_AXI_ARLEN             ,
 38         input    wire [2 : 0]                      CH0_M_AXI_ARSIZE            ,
 39         input    wire [1 : 0]                      CH0_M_AXI_ARBURST           ,
 40         input    wire                              CH0_M_AXI_ARLOCK            ,
 41         input    wire [3 : 0]                      CH0_M_AXI_ARCACHE           ,
 42         input    wire [2 : 0]                      CH0_M_AXI_ARPROT            ,
 43         input    wire [3 : 0]                      CH0_M_AXI_ARQOS             ,
 44         input    wire [M_AXI_ARUSER_WIDTH-1 : 0]   CH0_M_AXI_ARUSER            ,
 45         input    wire                              CH0_M_AXI_ARVALID           ,
 46         output   reg                               CH0_M_AXI_ARREADY           ,
 47             
 48         output   reg  [M_AXI_ID_WIDTH-1 : 0]       CH0_M_AXI_RID               ,
 49         output   reg  [M_AXI_DATA_WIDTH-1 : 0]     CH0_M_AXI_RDATA             ,
 50         output   reg  [1 : 0]                      CH0_M_AXI_RRESP             ,
 51         output   reg                               CH0_M_AXI_RLAST             ,
 52         output   reg  [M_AXI_RUSER_WIDTH-1 : 0]    CH0_M_AXI_RUSER             ,
 53         output   reg                               CH0_M_AXI_RVALID            ,
 54         input    wire                              CH0_M_AXI_RREADY            ,
 55     //CH1
 56         input    wire [M_AXI_ID_WIDTH-1 : 0]       CH1_M_AXI_ARID              ,
 57         input    wire [M_AXI_ADDR_WIDTH-1 : 0]     CH1_M_AXI_ARADDR            ,
 58         input    wire [7 : 0]                      CH1_M_AXI_ARLEN             ,
 59         input    wire [2 : 0]                      CH1_M_AXI_ARSIZE            ,
 60         input    wire [1 : 0]                      CH1_M_AXI_ARBURST           ,
 61         input    wire                              CH1_M_AXI_ARLOCK            ,
 62         input    wire [3 : 0]                      CH1_M_AXI_ARCACHE           ,
 63         input    wire [2 : 0]                      CH1_M_AXI_ARPROT            ,
 64         input    wire [3 : 0]                      CH1_M_AXI_ARQOS             ,
 65         input    wire [M_AXI_ARUSER_WIDTH-1 : 0]   CH1_M_AXI_ARUSER            ,
 66         input    wire                              CH1_M_AXI_ARVALID           ,
 67         output   reg                               CH1_M_AXI_ARREADY           ,
 68             
 69         output   reg  [M_AXI_ID_WIDTH-1 : 0]       CH1_M_AXI_RID               ,
 70         output   reg  [M_AXI_DATA_WIDTH-1 : 0]     CH1_M_AXI_RDATA             ,
 71         output   reg  [1 : 0]                      CH1_M_AXI_RRESP             ,
 72         output   reg                               CH1_M_AXI_RLAST             ,
 73         output   reg  [M_AXI_RUSER_WIDTH-1 : 0]    CH1_M_AXI_RUSER             ,
 74         output   reg                               CH1_M_AXI_RVALID            ,
 75         input    wire                              CH1_M_AXI_RREADY            ,
 76     //CH2
 77         input    wire [M_AXI_ID_WIDTH-1 : 0]       CH2_M_AXI_ARID              ,
 78         input    wire [M_AXI_ADDR_WIDTH-1 : 0]     CH2_M_AXI_ARADDR            ,
 79         input    wire [7 : 0]                      CH2_M_AXI_ARLEN             ,
 80         input    wire [2 : 0]                      CH2_M_AXI_ARSIZE            ,
 81         input    wire [1 : 0]                      CH2_M_AXI_ARBURST           ,
 82         input    wire                              CH2_M_AXI_ARLOCK            ,
 83         input    wire [3 : 0]                      CH2_M_AXI_ARCACHE           ,
 84         input    wire [2 : 0]                      CH2_M_AXI_ARPROT            ,
 85         input    wire [3 : 0]                      CH2_M_AXI_ARQOS             ,
 86         input    wire [M_AXI_ARUSER_WIDTH-1 : 0]   CH2_M_AXI_ARUSER            ,
 87         input    wire                              CH2_M_AXI_ARVALID           ,
 88         output   reg                               CH2_M_AXI_ARREADY           ,
 89             
 90         output   reg  [M_AXI_ID_WIDTH-1 : 0]       CH2_M_AXI_RID               ,
 91         output   reg  [M_AXI_DATA_WIDTH-1 : 0]     CH2_M_AXI_RDATA             ,
 92         output   reg  [1 : 0]                      CH2_M_AXI_RRESP             ,
 93         output   reg                               CH2_M_AXI_RLAST             ,
 94         output   reg  [M_AXI_RUSER_WIDTH-1 : 0]    CH2_M_AXI_RUSER             ,
 95         output   reg                               CH2_M_AXI_RVALID            ,
 96         input    wire                              CH2_M_AXI_RREADY            ,
 97     //CH3
 98         input    wire [M_AXI_ID_WIDTH-1 : 0]       CH3_M_AXI_ARID              ,
 99         input    wire [M_AXI_ADDR_WIDTH-1 : 0]     CH3_M_AXI_ARADDR            ,
100         input    wire [7 : 0]                      CH3_M_AXI_ARLEN             ,
101         input    wire [2 : 0]                      CH3_M_AXI_ARSIZE            ,
102         input    wire [1 : 0]                      CH3_M_AXI_ARBURST           ,
103         input    wire                              CH3_M_AXI_ARLOCK            ,
104         input    wire [3 : 0]                      CH3_M_AXI_ARCACHE           ,
105         input    wire [2 : 0]                      CH3_M_AXI_ARPROT            ,
106         input    wire [3 : 0]                      CH3_M_AXI_ARQOS             ,
107         input    wire [M_AXI_ARUSER_WIDTH-1 : 0]   CH3_M_AXI_ARUSER            ,
108         input    wire                              CH3_M_AXI_ARVALID           ,
109         output   reg                               CH3_M_AXI_ARREADY           ,
110             
111         output   reg  [M_AXI_ID_WIDTH-1 : 0]       CH3_M_AXI_RID               ,
112         output   reg  [M_AXI_DATA_WIDTH-1 : 0]     CH3_M_AXI_RDATA             ,
113         output   reg  [1 : 0]                      CH3_M_AXI_RRESP             ,
114         output   reg                               CH3_M_AXI_RLAST             ,
115         output   reg  [M_AXI_RUSER_WIDTH-1 : 0]    CH3_M_AXI_RUSER             ,
116         output   reg                               CH3_M_AXI_RVALID            ,
117         input    wire                              CH3_M_AXI_RREADY            ,
118     //result
119         output   reg  [M_AXI_ID_WIDTH-1 : 0]       M_AXI_ARID                  ,
120         output   reg  [M_AXI_ADDR_WIDTH-1 : 0]     M_AXI_ARADDR                ,
121         output   reg  [7 : 0]                      M_AXI_ARLEN                 ,
122         output   reg  [2 : 0]                      M_AXI_ARSIZE                ,
123         output   reg  [1 : 0]                      M_AXI_ARBURST               ,
124         output   reg                               M_AXI_ARLOCK                ,
125         output   reg  [3 : 0]                      M_AXI_ARCACHE               ,
126         output   reg  [2 : 0]                      M_AXI_ARPROT                ,
127         output   reg  [3 : 0]                      M_AXI_ARQOS                 ,
128         output   reg  [M_AXI_ARUSER_WIDTH-1 : 0]   M_AXI_ARUSER                ,
129         output   reg                               M_AXI_ARVALID               ,
130         input    wire                              M_AXI_ARREADY               ,
131             
132         input    wire [M_AXI_ID_WIDTH-1 : 0]       M_AXI_RID                   ,
133         input    wire [M_AXI_DATA_WIDTH-1 : 0]     M_AXI_RDATA                 ,
134         input    wire [1 : 0]                      M_AXI_RRESP                 ,
135         input    wire                              M_AXI_RLAST                 ,
136         input    wire [M_AXI_RUSER_WIDTH-1 : 0]    M_AXI_RUSER                 ,
137         input    wire                              M_AXI_RVALID                ,
138         output   reg                               M_AXI_RREADY                
139 );
140 
141     //-----------------------------------------------------------------//
142         localparam  state_idle  = 10'b0000_0000_01;
143         localparam  state_aribe = 10'b0000_0000_10;
144 
145         localparam  state_ch0_0 = 10'b0000_0001_00;
146         localparam  state_ch0_1 = 10'b0000_0010_00;
147 
148         localparam  state_ch1_0 = 10'b0000_0100_00;
149         localparam  state_ch1_1 = 10'b0000_1000_00;
150 
151         localparam  state_ch2_0 = 10'b0001_0000_00;
152         localparam  state_ch2_1 = 10'b0010_0000_00;
153 
154         localparam  state_ch3_0 = 10'b0100_0000_00;
155         localparam  state_ch3_1 = 10'b1000_0000_00;
156 
157     //-----------------------------------------------------------------//
158         //req
159             //step.0
160             wire    [3:0]   single_req_Concat           ;
161             reg     [7:0]   double_req_Concat           ;
162             //step.1
163             reg     [7:0]   S1_req_Concat               ;
164             //step.2
165             reg     [7:0]   S2_req_Concat               ;
166             //step.3
167             wire    [3:0]   S3_req_Concat               ;
168         //aribe
169             wire            aribe_start                 ;
170             wire            aribe_step                  ;
171             reg             aribe_cycle                 ;
172             reg     [3:0]   aribe_value                 ;
173         //step
174             reg     [3:0]   step                        ;
175         //state
176             reg     [9:0]   state                       ;
177             wire            aribe_ch0_end               ;
178             wire            aribe_ch1_end               ;
179             wire            aribe_ch2_end               ;
180             wire            aribe_ch3_end               ;
181         //req vaild
182             reg             reg_ch0_vaild               ;
183             reg             reg_ch1_vaild               ;
184             reg             reg_ch2_vaild               ;
185             reg             reg_ch3_vaild               ;
186         //start
187             reg             r1_ch0_start                ;
188             reg             r2_ch0_start                ;
189 
190             reg             r1_ch1_start                ;
191             reg             r2_ch1_start                ;
192 
193             reg             r1_ch2_start                ;
194             reg             r2_ch2_start                ;
195 
196             reg             r1_ch3_start                ;
197             reg             r2_ch3_start                ;
198     //-----------------------------------------------------------------//
199     assign  single_req_Concat = {I_ch3_req, I_ch2_req, I_ch1_req, I_ch0_req};
200     assign  aribe_start  = |single_req_Concat;
201     assign  aribe_step   = (aribe_start == 1'b1 && aribe_cycle == 1'b0);
202 
203     assign  aribe_ch0_end = (I_ch0_end == 1'b1)&&(state == state_ch0_1);
204     assign  aribe_ch1_end = (I_ch1_end == 1'b1)&&(state == state_ch1_1);
205     assign  aribe_ch2_end = (I_ch2_end == 1'b1)&&(state == state_ch2_1);
206     assign  aribe_ch3_end = (I_ch3_end == 1'b1)&&(state == state_ch3_1);
207 
208     assign O_ch0_vaild  = reg_ch0_vaild;
209     assign O_ch1_vaild  = reg_ch1_vaild;
210     assign O_ch2_vaild  = reg_ch2_vaild;
211     assign O_ch3_vaild  = reg_ch3_vaild;
212 
213     always @(posedge I_clk) begin
214         step[3:0] <= {step[2:0],aribe_step};
215     end
216 
217     // Pose
218     always @(posedge I_clk) begin
219         {r2_ch0_start,r1_ch0_start} <= {r1_ch0_start,I_ch0_start};
220         {r2_ch1_start,r1_ch1_start} <= {r1_ch1_start,I_ch1_start};
221         {r2_ch2_start,r1_ch2_start} <= {r1_ch2_start,I_ch2_start};
222         {r2_ch3_start,r1_ch3_start} <= {r1_ch3_start,I_ch3_start};
223     end
224 
225     // aribe_cycle
226     always @(posedge I_clk) begin
227         if(I_Rst_n == 1'b0) begin
228             aribe_cycle <= 1'b0;
229         end else if(aribe_ch0_end|aribe_ch1_end|aribe_ch2_end|aribe_ch3_end) begin
230             aribe_cycle <= 1'b0;
231         end else if(aribe_start == 1'b1 && aribe_cycle == 1'b0 && state == state_idle) begin
232             aribe_cycle <= 1'b1;
233         end else begin
234             aribe_cycle <= aribe_cycle;
235         end
236     end
237 
238     // step.0
239     always @(posedge I_clk) begin
240         if(I_Rst_n == 1'b0) begin
241             double_req_Concat <= 'd0;
242         end else if(aribe_step == 1'b1 && step[0] == 1'b0) begin
243             double_req_Concat <= {2{I_ch3_req, I_ch2_req, I_ch1_req, I_ch0_req}};
244         end else begin
245             double_req_Concat <= double_req_Concat;
246         end
247     end
248 
249     // step.1
250     always @(posedge I_clk) begin
251         if(I_Rst_n == 1'b0) begin
252             S1_req_Concat <= 'd0;
253         end else if(step[0] == 1'b1 && step[1] == 1'b0) begin
254             S1_req_Concat <= ~(double_req_Concat - {4'b0,aribe_value});
255         end else begin
256             S1_req_Concat <= S1_req_Concat;
257         end
258     end
259 
260     // step.2  
261     always @(posedge I_clk) begin
262         if(I_Rst_n == 1'b0) begin
263             S2_req_Concat <= 'd0;
264         end else if(step[1] == 1'b1 && step[2] == 1'b0) begin
265             S2_req_Concat <= (S1_req_Concat & double_req_Concat);
266         end else begin
267             S2_req_Concat <= S2_req_Concat;
268         end
269     end
270 
271     assign S3_req_Concat = ((S2_req_Concat[3:0])|(S2_req_Concat[7:4]));
272 
273     // aribe_value
274     always @(posedge I_clk) begin
275         if(I_Rst_n == 1'b0) begin
276             aribe_value <= {3'b0,1'b1};
277         end else if(aribe_value[3] == 1'b1 && step[0] == 1'b1 && step[1] == 1'b0) begin
278             aribe_value <= {3'b0,1'b1};
279         end else if(step[0] == 1'b1 && step[1] == 1'b0) begin
280             aribe_value <= aribe_value << 1;
281         end else begin
282             aribe_value <= aribe_value;
283         end
284     end
285 
286     //req
287     //ch0
288     always @(posedge I_clk) begin
289         if(I_Rst_n == 1'b0) begin
290             reg_ch0_vaild <= 1'b0;
291         end else if(state == state_ch0_0 && (r1_ch0_start == 1'b1 && r2_ch0_start == 1'b0)) begin
292             reg_ch0_vaild <= 1'b0;
293         end else if(state == state_ch0_0 && reg_ch0_vaild == 1'b0) begin
294             reg_ch0_vaild <= 1'b1;
295         end
296     end
297     //ch1
298     always @(posedge I_clk) begin
299         if(I_Rst_n == 1'b0) begin
300             reg_ch1_vaild <= 1'b0;
301         end else if(state == state_ch1_0 && (r1_ch1_start == 1'b1 && r2_ch1_start == 1'b0)) begin
302             reg_ch1_vaild <= 1'b0;
303         end else if(state == state_ch1_0 && reg_ch1_vaild == 1'b0) begin
304             reg_ch1_vaild <= 1'b1;
305         end
306     end
307     //ch2
308     always @(posedge I_clk) begin
309         if(I_Rst_n == 1'b0) begin
310             reg_ch2_vaild <= 1'b0;
311         end else if(state == state_ch2_0 && (r1_ch2_start == 1'b1 && r2_ch2_start == 1'b0)) begin
312             reg_ch2_vaild <= 1'b0;
313         end else if(state == state_ch2_0 && reg_ch2_vaild == 1'b0) begin
314             reg_ch2_vaild <= 1'b1;
315         end
316     end
317     //ch3
318     always @(posedge I_clk) begin
319         if(I_Rst_n == 1'b0) begin
320             reg_ch3_vaild <= 1'b0;
321         end else if(state == state_ch3_0 && (r1_ch3_start == 1'b1 && r2_ch3_start == 1'b0)) begin
322             reg_ch3_vaild <= 1'b0;
323         end else if(state == state_ch3_0 && reg_ch3_vaild == 1'b0) begin
324             reg_ch3_vaild <= 1'b1;
325         end
326     end
327 
328     //state
329     always @(posedge I_clk) begin
330         if(I_Rst_n == 1'b0) begin
331             state <= state_idle;
332         end else begin
333             case (state)
334                 state_idle: begin
335                     if(aribe_start == 1'b1 && aribe_cycle == 1'b0) begin
336                         state <= state_aribe;
337                     end else begin
338                         state <= state_idle;
339                     end
340                 end
341                 state_aribe:begin
342                     if(step[2] == 1'b1 && step[3] == 1'b0) begin
343                         case (S3_req_Concat)
344                             4'b0001:begin
345                                 state <= state_ch0_0;
346                             end 
347                             4'b0010:begin
348                                 state <= state_ch1_0;
349                             end 
350                             4'b0100:begin
351                                 state <= state_ch2_0;
352                             end 
353                             4'b1000:begin
354                                 state <= state_ch3_0;
355                             end 
356                             default: state <= state_aribe;
357                         endcase
358                     end else begin
359                         state <= state_aribe;
360                     end
361                 end
362                 // state.step.0
363                 state_ch0_0:begin
364                     if((r1_ch0_start == 1'b1 && r2_ch0_start == 1'b0)) begin
365                         state <= state_ch0_1;
366                     end else begin
367                         state <= state_ch0_0;
368                     end
369                 end
370                 state_ch1_0:begin
371                     if((r1_ch1_start == 1'b1 && r2_ch1_start == 1'b0)) begin
372                         state <= state_ch1_1;
373                     end else begin
374                         state <= state_ch1_0;
375                     end
376                 end
377                 state_ch2_0:begin
378                     if((r1_ch2_start == 1'b1 && r2_ch2_start == 1'b0)) begin
379                         state <= state_ch2_1;
380                     end else begin
381                         state <= state_ch2_0;
382                     end
383                 end
384                 state_ch3_0:begin
385                     if((r1_ch3_start == 1'b1 && r2_ch3_start == 1'b0)) begin
386                         state <= state_ch3_1;
387                     end else begin
388                         state <= state_ch3_0;
389                     end
390                 end
391 
392                 // state.step.1
393                 state_ch0_1:begin
394                     if(I_ch0_end == 1'b1) begin
395                         state <= state_idle;
396                     end else begin
397                         state <= state_ch0_1;
398                     end
399                 end
400                 state_ch1_1:begin
401                     if(I_ch1_end == 1'b1) begin
402                         state <= state_idle;
403                     end else begin
404                         state <= state_ch1_1;
405                     end
406                 end
407                 state_ch2_1:begin
408                     if(I_ch2_end == 1'b1) begin
409                         state <= state_idle;
410                     end else begin
411                         state <= state_ch2_1;
412                     end
413                 end
414                 state_ch3_1:begin
415                     if(I_ch3_end == 1'b1) begin
416                         state <= state_idle;
417                     end else begin
418                         state <= state_ch3_1;
419                     end
420                 end
421                 default: begin
422                     state <= state_idle;
423                 end
424             endcase
425         end
426     end  
427     always @(*) begin
428         if(state == state_ch0_0||state == state_ch0_1) begin
429             M_AXI_ARID        <= CH0_M_AXI_ARID     ;
430             M_AXI_ARADDR      <= CH0_M_AXI_ARADDR   ;
431             M_AXI_ARLEN       <= CH0_M_AXI_ARLEN    ;
432             M_AXI_ARSIZE      <= CH0_M_AXI_ARSIZE   ;
433             M_AXI_ARBURST     <= CH0_M_AXI_ARBURST  ;
434             M_AXI_ARLOCK      <= CH0_M_AXI_ARLOCK   ;
435             M_AXI_ARCACHE     <= CH0_M_AXI_ARCACHE  ;
436             M_AXI_ARPROT      <= CH0_M_AXI_ARPROT   ;
437             M_AXI_ARQOS       <= CH0_M_AXI_ARQOS    ;
438             M_AXI_ARUSER      <= CH0_M_AXI_ARUSER   ;
439             M_AXI_ARVALID     <= CH0_M_AXI_ARVALID  ;
440             CH0_M_AXI_ARREADY <= M_AXI_ARREADY      ;
441 
442             CH0_M_AXI_RID     <= M_AXI_RID          ;
443             CH0_M_AXI_RDATA   <= M_AXI_RDATA        ;
444             CH0_M_AXI_RRESP   <= M_AXI_RRESP        ;
445             CH0_M_AXI_RLAST   <= M_AXI_RLAST        ;
446             CH0_M_AXI_RUSER   <= M_AXI_RUSER        ;
447             CH0_M_AXI_RVALID  <= M_AXI_RVALID       ;
448             M_AXI_RREADY      <= CH0_M_AXI_RREADY   ;
449         end else if(state == state_ch1_0 || state == state_ch1_1) begin
450             M_AXI_ARID        <= CH1_M_AXI_ARID     ;
451             M_AXI_ARADDR      <= CH1_M_AXI_ARADDR   ;
452             M_AXI_ARLEN       <= CH1_M_AXI_ARLEN    ;
453             M_AXI_ARSIZE      <= CH1_M_AXI_ARSIZE   ;
454             M_AXI_ARBURST     <= CH1_M_AXI_ARBURST  ;
455             M_AXI_ARLOCK      <= CH1_M_AXI_ARLOCK   ;
456             M_AXI_ARCACHE     <= CH1_M_AXI_ARCACHE  ;
457             M_AXI_ARPROT      <= CH1_M_AXI_ARPROT   ;
458             M_AXI_ARQOS       <= CH1_M_AXI_ARQOS    ;
459             M_AXI_ARUSER      <= CH1_M_AXI_ARUSER   ;
460             M_AXI_ARVALID     <= CH1_M_AXI_ARVALID  ;
461             CH1_M_AXI_ARREADY <= M_AXI_ARREADY      ;
462 
463             CH1_M_AXI_RID     <= M_AXI_RID          ;
464             CH1_M_AXI_RDATA   <= M_AXI_RDATA        ;
465             CH1_M_AXI_RRESP   <= M_AXI_RRESP        ;
466             CH1_M_AXI_RLAST   <= M_AXI_RLAST        ;
467             CH1_M_AXI_RUSER   <= M_AXI_RUSER        ;
468             CH1_M_AXI_RVALID  <= M_AXI_RVALID       ;
469             M_AXI_RREADY      <= CH1_M_AXI_RREADY   ;
470         end else if(state == state_ch2_0 || state == state_ch2_1) begin
471             M_AXI_ARID        <= CH2_M_AXI_ARID     ;
472             M_AXI_ARADDR      <= CH2_M_AXI_ARADDR   ;
473             M_AXI_ARLEN       <= CH2_M_AXI_ARLEN    ;
474             M_AXI_ARSIZE      <= CH2_M_AXI_ARSIZE   ;
475             M_AXI_ARBURST     <= CH2_M_AXI_ARBURST  ;
476             M_AXI_ARLOCK      <= CH2_M_AXI_ARLOCK   ;
477             M_AXI_ARCACHE     <= CH2_M_AXI_ARCACHE  ;
478             M_AXI_ARPROT      <= CH2_M_AXI_ARPROT   ;
479             M_AXI_ARQOS       <= CH2_M_AXI_ARQOS    ;
480             M_AXI_ARUSER      <= CH2_M_AXI_ARUSER   ;
481             M_AXI_ARVALID     <= CH2_M_AXI_ARVALID  ;
482             CH2_M_AXI_ARREADY <= M_AXI_ARREADY      ;
483 
484             CH2_M_AXI_RID     <= M_AXI_RID          ;
485             CH2_M_AXI_RDATA   <= M_AXI_RDATA        ;
486             CH2_M_AXI_RRESP   <= M_AXI_RRESP        ;
487             CH2_M_AXI_RLAST   <= M_AXI_RLAST        ;
488             CH2_M_AXI_RUSER   <= M_AXI_RUSER        ;
489             CH2_M_AXI_RVALID  <= M_AXI_RVALID       ;
490             M_AXI_RREADY      <= CH2_M_AXI_RREADY   ;
491         end else if(state == state_ch3_0 || state == state_ch3_1) begin
492             M_AXI_ARID        <= CH3_M_AXI_ARID     ;
493             M_AXI_ARADDR      <= CH3_M_AXI_ARADDR   ;
494             M_AXI_ARLEN       <= CH3_M_AXI_ARLEN    ;
495             M_AXI_ARSIZE      <= CH3_M_AXI_ARSIZE   ;
496             M_AXI_ARBURST     <= CH3_M_AXI_ARBURST  ;
497             M_AXI_ARLOCK      <= CH3_M_AXI_ARLOCK   ;
498             M_AXI_ARCACHE     <= CH3_M_AXI_ARCACHE  ;
499             M_AXI_ARPROT      <= CH3_M_AXI_ARPROT   ;
500             M_AXI_ARQOS       <= CH3_M_AXI_ARQOS    ;
501             M_AXI_ARUSER      <= CH3_M_AXI_ARUSER   ;
502             M_AXI_ARVALID     <= CH3_M_AXI_ARVALID  ;
503             CH3_M_AXI_ARREADY <= M_AXI_ARREADY      ;
504 
505             CH3_M_AXI_RID     <= M_AXI_RID          ;
506             CH3_M_AXI_RDATA   <= M_AXI_RDATA        ;
507             CH3_M_AXI_RRESP   <= M_AXI_RRESP        ;
508             CH3_M_AXI_RLAST   <= M_AXI_RLAST        ;
509             CH3_M_AXI_RUSER   <= M_AXI_RUSER        ;
510             CH3_M_AXI_RVALID  <= M_AXI_RVALID       ;
511             M_AXI_RREADY      <= CH3_M_AXI_RREADY   ;
512         end else begin
513             M_AXI_ARID        <= CH3_M_AXI_ARID     ;
514             M_AXI_ARADDR      <= CH3_M_AXI_ARADDR   ;
515             M_AXI_ARLEN       <= CH3_M_AXI_ARLEN    ;
516             M_AXI_ARSIZE      <= CH3_M_AXI_ARSIZE   ;
517             M_AXI_ARBURST     <= CH3_M_AXI_ARBURST  ;
518             M_AXI_ARLOCK      <= CH3_M_AXI_ARLOCK   ;
519             M_AXI_ARCACHE     <= CH3_M_AXI_ARCACHE  ;
520             M_AXI_ARPROT      <= CH3_M_AXI_ARPROT   ;
521             M_AXI_ARQOS       <= CH3_M_AXI_ARQOS    ;
522             M_AXI_ARUSER      <= CH3_M_AXI_ARUSER   ;
523             M_AXI_ARVALID     <= CH3_M_AXI_ARVALID  ;
524             CH3_M_AXI_ARREADY <= M_AXI_ARREADY      ;
525 
526             CH3_M_AXI_RID     <= M_AXI_RID          ;
527             CH3_M_AXI_RDATA   <= M_AXI_RDATA        ;
528             CH3_M_AXI_RRESP   <= M_AXI_RRESP        ;
529             CH3_M_AXI_RLAST   <= M_AXI_RLAST        ;
530             CH3_M_AXI_RUSER   <= M_AXI_RUSER        ;
531             CH3_M_AXI_RVALID  <= M_AXI_RVALID       ;
532             M_AXI_RREADY      <= CH3_M_AXI_RREADY   ;
533         end
534     end
535 endmodule
View Code

写仲裁:

  1 module  Aribe_state_wr #(
  2         parameter integer M_AXI_ID_WIDTH                    = 1          ,
  3         parameter integer M_AXI_ADDR_WIDTH                  = 32         ,
  4         parameter integer M_AXI_DATA_WIDTH                  = 64         ,
  5         parameter integer M_AXI_AWUSER_WIDTH                = 0          ,
  6         parameter integer M_AXI_ARUSER_WIDTH                = 0          ,
  7         parameter integer M_AXI_WUSER_WIDTH                 = 0          ,
  8         parameter integer M_AXI_RUSER_WIDTH                 = 0          ,
  9         parameter integer M_AXI_BUSER_WIDTH                 = 0             
 10     )(
 11         input    wire                              I_clk         ,
 12         input    wire                              I_Rst_n       ,
 13         //Port                 
 14         //ch0                  
 15         input    wire                              I_ch0_req     ,
 16         input    wire                              I_ch0_start   ,
 17         input    wire                              I_ch0_end     ,
 18         output   wire                              O_ch0_vaild   ,
 19         //ch1                  
 20         input    wire                              I_ch1_req     ,
 21         input    wire                              I_ch1_start   ,
 22         input    wire                              I_ch1_end     ,
 23         output   wire                              O_ch1_vaild   ,
 24         //ch2                  
 25         input    wire                              I_ch2_req     ,
 26         input    wire                              I_ch2_start   ,
 27         input    wire                              I_ch2_end     ,
 28         output   wire                              O_ch2_vaild   ,
 29         //ch3                  
 30         input    wire                              I_ch3_req     ,
 31         input    wire                              I_ch3_start   ,
 32         input    wire                              I_ch3_end     ,
 33         output   wire                              O_ch3_vaild   ,
 34     //CH0
 35         input    wire [M_AXI_ID_WIDTH-1 : 0]       CH0_M_AXI_AWID    ,
 36         input    wire [M_AXI_ADDR_WIDTH-1 : 0]     CH0_M_AXI_AWADDR  ,
 37         input    wire [7 : 0]                      CH0_M_AXI_AWLEN   ,
 38         input    wire [2 : 0]                      CH0_M_AXI_AWSIZE  ,
 39         input    wire [1 : 0]                      CH0_M_AXI_AWBURST ,
 40         input    wire                              CH0_M_AXI_AWLOCK  ,
 41         input    wire [3 : 0]                      CH0_M_AXI_AWCACHE ,
 42         input    wire [2 : 0]                      CH0_M_AXI_AWPROT  ,
 43         input    wire [3 : 0]                      CH0_M_AXI_AWQOS   ,
 44         input    wire [M_AXI_AWUSER_WIDTH-1 : 0]   CH0_M_AXI_AWUSER  ,
 45         input    wire                              CH0_M_AXI_AWVALID ,
 46         output   reg                               CH0_M_AXI_AWREADY ,
 47 
 48         input    wire [M_AXI_DATA_WIDTH-1 : 0]     CH0_M_AXI_WDATA   ,
 49         input    wire [M_AXI_DATA_WIDTH/8-1 : 0]   CH0_M_AXI_WSTRB   ,
 50         input    wire                              CH0_M_AXI_WLAST   ,
 51         input    wire [M_AXI_WUSER_WIDTH-1 : 0]    CH0_M_AXI_WUSER   ,
 52         input    wire                              CH0_M_AXI_WVALID  ,
 53         output   reg                               CH0_M_AXI_WREADY  ,
 54 
 55         output   reg  [M_AXI_ID_WIDTH-1 : 0]       CH0_M_AXI_BID     ,
 56         output   reg  [1 : 0]                      CH0_M_AXI_BRESP   ,
 57         output   reg  [M_AXI_BUSER_WIDTH-1 : 0]    CH0_M_AXI_BUSER   ,
 58         output   reg                               CH0_M_AXI_BVALID  ,
 59         input    wire                              CH0_M_AXI_BREADY  ,
 60     //CH1
 61         input    wire [M_AXI_ID_WIDTH-1 : 0]       CH1_M_AXI_AWID    ,
 62         input    wire [M_AXI_ADDR_WIDTH-1 : 0]     CH1_M_AXI_AWADDR  ,
 63         input    wire [7 : 0]                      CH1_M_AXI_AWLEN   ,
 64         input    wire [2 : 0]                      CH1_M_AXI_AWSIZE  ,
 65         input    wire [1 : 0]                      CH1_M_AXI_AWBURST ,
 66         input    wire                              CH1_M_AXI_AWLOCK  ,
 67         input    wire [3 : 0]                      CH1_M_AXI_AWCACHE ,
 68         input    wire [2 : 0]                      CH1_M_AXI_AWPROT  ,
 69         input    wire [3 : 0]                      CH1_M_AXI_AWQOS   ,
 70         input    wire [M_AXI_AWUSER_WIDTH-1 : 0]   CH1_M_AXI_AWUSER  ,
 71         input    wire                              CH1_M_AXI_AWVALID ,
 72         output   reg                               CH1_M_AXI_AWREADY ,
 73 
 74         input    wire [M_AXI_DATA_WIDTH-1 : 0]     CH1_M_AXI_WDATA   ,
 75         input    wire [M_AXI_DATA_WIDTH/8-1 : 0]   CH1_M_AXI_WSTRB   ,
 76         input    wire                              CH1_M_AXI_WLAST   ,
 77         input    wire [M_AXI_WUSER_WIDTH-1 : 0]    CH1_M_AXI_WUSER   ,
 78         input    wire                              CH1_M_AXI_WVALID  ,
 79         output   reg                               CH1_M_AXI_WREADY  ,
 80 
 81         output   reg  [M_AXI_ID_WIDTH-1 : 0]       CH1_M_AXI_BID     ,
 82         output   reg  [1 : 0]                      CH1_M_AXI_BRESP   ,
 83         output   reg  [M_AXI_BUSER_WIDTH-1 : 0]    CH1_M_AXI_BUSER   ,
 84         output   reg                               CH1_M_AXI_BVALID  ,
 85         input    wire                              CH1_M_AXI_BREADY  ,
 86     //CH2
 87         input    wire [M_AXI_ID_WIDTH-1 : 0]       CH2_M_AXI_AWID    ,
 88         input    wire [M_AXI_ADDR_WIDTH-1 : 0]     CH2_M_AXI_AWADDR  ,
 89         input    wire [7 : 0]                      CH2_M_AXI_AWLEN   ,
 90         input    wire [2 : 0]                      CH2_M_AXI_AWSIZE  ,
 91         input    wire [1 : 0]                      CH2_M_AXI_AWBURST ,
 92         input    wire                              CH2_M_AXI_AWLOCK  ,
 93         input    wire [3 : 0]                      CH2_M_AXI_AWCACHE ,
 94         input    wire [2 : 0]                      CH2_M_AXI_AWPROT  ,
 95         input    wire [3 : 0]                      CH2_M_AXI_AWQOS   ,
 96         input    wire [M_AXI_AWUSER_WIDTH-1 : 0]   CH2_M_AXI_AWUSER  ,
 97         input    wire                              CH2_M_AXI_AWVALID ,
 98         output   reg                               CH2_M_AXI_AWREADY ,
 99 
100         input    wire [M_AXI_DATA_WIDTH-1 : 0]     CH2_M_AXI_WDATA   ,
101         input    wire [M_AXI_DATA_WIDTH/8-1 : 0]   CH2_M_AXI_WSTRB   ,
102         input    wire                              CH2_M_AXI_WLAST   ,
103         input    wire [M_AXI_WUSER_WIDTH-1 : 0]    CH2_M_AXI_WUSER   ,
104         input    wire                              CH2_M_AXI_WVALID  ,
105         output   reg                               CH2_M_AXI_WREADY  ,
106 
107         output   reg  [M_AXI_ID_WIDTH-1 : 0]       CH2_M_AXI_BID     ,
108         output   reg  [1 : 0]                      CH2_M_AXI_BRESP   ,
109         output   reg  [M_AXI_BUSER_WIDTH-1 : 0]    CH2_M_AXI_BUSER   ,
110         output   reg                               CH2_M_AXI_BVALID  ,
111         input    wire                              CH2_M_AXI_BREADY  ,
112     //CH3
113         input    wire [M_AXI_ID_WIDTH-1 : 0]       CH3_M_AXI_AWID    ,
114         input    wire [M_AXI_ADDR_WIDTH-1 : 0]     CH3_M_AXI_AWADDR  ,
115         input    wire [7 : 0]                      CH3_M_AXI_AWLEN   ,
116         input    wire [2 : 0]                      CH3_M_AXI_AWSIZE  ,
117         input    wire [1 : 0]                      CH3_M_AXI_AWBURST ,
118         input    wire                              CH3_M_AXI_AWLOCK  ,
119         input    wire [3 : 0]                      CH3_M_AXI_AWCACHE ,
120         input    wire [2 : 0]                      CH3_M_AXI_AWPROT  ,
121         input    wire [3 : 0]                      CH3_M_AXI_AWQOS   ,
122         input    wire [M_AXI_AWUSER_WIDTH-1 : 0]   CH3_M_AXI_AWUSER  ,
123         input    wire                              CH3_M_AXI_AWVALID ,
124         output   reg                               CH3_M_AXI_AWREADY ,
125 
126         input    wire [M_AXI_DATA_WIDTH-1 : 0]     CH3_M_AXI_WDATA   ,
127         input    wire [M_AXI_DATA_WIDTH/8-1 : 0]   CH3_M_AXI_WSTRB   ,
128         input    wire                              CH3_M_AXI_WLAST   ,
129         input    wire [M_AXI_WUSER_WIDTH-1 : 0]    CH3_M_AXI_WUSER   ,
130         input    wire                              CH3_M_AXI_WVALID  ,
131         output   reg                               CH3_M_AXI_WREADY  ,
132 
133         output   reg  [M_AXI_ID_WIDTH-1 : 0]       CH3_M_AXI_BID     ,
134         output   reg  [1 : 0]                      CH3_M_AXI_BRESP   ,
135         output   reg  [M_AXI_BUSER_WIDTH-1 : 0]    CH3_M_AXI_BUSER   ,
136         output   reg                               CH3_M_AXI_BVALID  ,
137         input    wire                              CH3_M_AXI_BREADY  ,
138     //result
139         output   reg  [M_AXI_ID_WIDTH-1 : 0]       M_AXI_AWID    ,
140         output   reg  [M_AXI_ADDR_WIDTH-1 : 0]     M_AXI_AWADDR  ,
141         output   reg  [7 : 0]                      M_AXI_AWLEN   ,
142         output   reg  [2 : 0]                      M_AXI_AWSIZE  ,
143         output   reg  [1 : 0]                      M_AXI_AWBURST ,
144         output   reg                               M_AXI_AWLOCK  ,
145         output   reg  [3 : 0]                      M_AXI_AWCACHE ,
146         output   reg  [2 : 0]                      M_AXI_AWPROT  ,
147         output   reg  [3 : 0]                      M_AXI_AWQOS   ,
148         output   reg  [M_AXI_AWUSER_WIDTH-1 : 0]   M_AXI_AWUSER  ,
149         output   reg                               M_AXI_AWVALID ,
150         input    wire                              M_AXI_AWREADY ,
151 
152         output   reg  [M_AXI_DATA_WIDTH-1 : 0]     M_AXI_WDATA   ,
153         output   reg  [M_AXI_DATA_WIDTH/8-1 : 0]   M_AXI_WSTRB   ,
154         output   reg                               M_AXI_WLAST   ,
155         output   reg  [M_AXI_WUSER_WIDTH-1 : 0]    M_AXI_WUSER   ,
156         output   reg                               M_AXI_WVALID  ,
157         input    wire                              M_AXI_WREADY  ,
158 
159         input    wire [M_AXI_ID_WIDTH-1 : 0]       M_AXI_BID     ,
160         input    wire [1 : 0]                      M_AXI_BRESP   ,
161         input    wire [M_AXI_BUSER_WIDTH-1 : 0]    M_AXI_BUSER   ,
162         input    wire                              M_AXI_BVALID  ,
163         output   reg                               M_AXI_BREADY  
164 );
165 
166     //-----------------------------------------------------------------//
167         localparam  state_idle  = 10'b0000_0000_01;
168         localparam  state_aribe = 10'b0000_0000_10;
169 
170         localparam  state_ch0_0 = 10'b0000_0001_00;
171         localparam  state_ch0_1 = 10'b0000_0010_00;
172 
173         localparam  state_ch1_0 = 10'b0000_0100_00;
174         localparam  state_ch1_1 = 10'b0000_1000_00;
175 
176         localparam  state_ch2_0 = 10'b0001_0000_00;
177         localparam  state_ch2_1 = 10'b0010_0000_00;
178 
179         localparam  state_ch3_0 = 10'b0100_0000_00;
180         localparam  state_ch3_1 = 10'b1000_0000_00;
181 
182     //-----------------------------------------------------------------//
183         //req
184             //step.0
185             wire    [3:0]   single_req_Concat           ;
186             reg     [7:0]   double_req_Concat           ;
187             //step.1
188             reg     [7:0]   S1_req_Concat               ;
189             //step.2
190             reg     [7:0]   S2_req_Concat               ;
191             //step.3
192             wire    [3:0]   S3_req_Concat               ;
193         //aribe
194             wire            aribe_start                 ;
195             wire            aribe_step                  ;
196             reg             aribe_cycle                 ;
197             reg     [3:0]   aribe_value                 ;
198         //step
199             reg     [3:0]   step                        ;
200         //state
201             reg     [9:0]   state                       ;
202             wire            aribe_ch0_end               ;
203             wire            aribe_ch1_end               ;
204             wire            aribe_ch2_end               ;
205             wire            aribe_ch3_end               ;
206         //req vaild
207             reg             reg_ch0_vaild               ;
208             reg             reg_ch1_vaild               ;
209             reg             reg_ch2_vaild               ;
210             reg             reg_ch3_vaild               ;
211         //start
212             reg             r1_ch0_start                ;
213             reg             r2_ch0_start                ;
214 
215             reg             r1_ch1_start                ;
216             reg             r2_ch1_start                ;
217 
218             reg             r1_ch2_start                ;
219             reg             r2_ch2_start                ;
220 
221             reg             r1_ch3_start                ;
222             reg             r2_ch3_start                ;
223     //-----------------------------------------------------------------//
224     assign  single_req_Concat = {I_ch3_req, I_ch2_req, I_ch1_req, I_ch0_req};
225     assign  aribe_start  = |single_req_Concat;
226     assign  aribe_step   = (aribe_start == 1'b1 && aribe_cycle == 1'b0);
227 
228     assign  aribe_ch0_end = (I_ch0_end == 1'b1)&&(state == state_ch0_1);
229     assign  aribe_ch1_end = (I_ch1_end == 1'b1)&&(state == state_ch1_1);
230     assign  aribe_ch2_end = (I_ch2_end == 1'b1)&&(state == state_ch2_1);
231     assign  aribe_ch3_end = (I_ch3_end == 1'b1)&&(state == state_ch3_1);
232 
233     assign O_ch0_vaild  = reg_ch0_vaild;
234     assign O_ch1_vaild  = reg_ch1_vaild;
235     assign O_ch2_vaild  = reg_ch2_vaild;
236     assign O_ch3_vaild  = reg_ch3_vaild;
237 
238     always @(posedge I_clk) begin
239         step[3:0] <= {step[2:0],aribe_step};
240     end
241 
242     // Pose
243     always @(posedge I_clk) begin
244         {r2_ch0_start,r1_ch0_start} <= {r1_ch0_start,I_ch0_start};
245         {r2_ch1_start,r1_ch1_start} <= {r1_ch1_start,I_ch1_start};
246         {r2_ch2_start,r1_ch2_start} <= {r1_ch2_start,I_ch2_start};
247         {r2_ch3_start,r1_ch3_start} <= {r1_ch3_start,I_ch3_start};
248     end
249 
250     // aribe_cycle
251     always @(posedge I_clk) begin
252         if(I_Rst_n == 1'b0) begin
253             aribe_cycle <= 1'b0;
254         end else if(aribe_ch0_end|aribe_ch1_end|aribe_ch2_end|aribe_ch3_end) begin
255             aribe_cycle <= 1'b0;
256         end else if(aribe_start == 1'b1 && aribe_cycle == 1'b0 && state == state_idle) begin
257             aribe_cycle <= 1'b1;
258         end else begin
259             aribe_cycle <= aribe_cycle;
260         end
261     end
262 
263     // step.0
264     always @(posedge I_clk) begin
265         if(I_Rst_n == 1'b0) begin
266             double_req_Concat <= 'd0;
267         end else if(aribe_step == 1'b1 && step[0] == 1'b0) begin
268             double_req_Concat <= {2{I_ch3_req, I_ch2_req, I_ch1_req, I_ch0_req}};
269         end else begin
270             double_req_Concat <= double_req_Concat;
271         end
272     end
273 
274     // step.1
275     always @(posedge I_clk) begin
276         if(I_Rst_n == 1'b0) begin
277             S1_req_Concat <= 'd0;
278         end else if(step[0] == 1'b1 && step[1] == 1'b0) begin
279             S1_req_Concat <= ~(double_req_Concat - {4'b0,aribe_value});
280         end else begin
281             S1_req_Concat <= S1_req_Concat;
282         end
283     end
284 
285     // step.2  
286     always @(posedge I_clk) begin
287         if(I_Rst_n == 1'b0) begin
288             S2_req_Concat <= 'd0;
289         end else if(step[1] == 1'b1 && step[2] == 1'b0) begin
290             S2_req_Concat <= (S1_req_Concat & double_req_Concat);
291         end else begin
292             S2_req_Concat <= S2_req_Concat;
293         end
294     end
295 
296     assign S3_req_Concat = ((S2_req_Concat[3:0])|(S2_req_Concat[7:4]));
297 
298     // aribe_value
299     always @(posedge I_clk) begin
300         if(I_Rst_n == 1'b0) begin
301             aribe_value <= {3'b0,1'b1};
302         end else if(aribe_value[3] == 1'b1 && step[0] == 1'b1 && step[1] == 1'b0) begin
303             aribe_value <= {3'b0,1'b1};
304         end else if(step[0] == 1'b1 && step[1] == 1'b0) begin
305             aribe_value <= aribe_value << 1;
306         end else begin
307             aribe_value <= aribe_value;
308         end
309     end
310 
311     //req
312     //ch0
313     always @(posedge I_clk) begin
314         if(I_Rst_n == 1'b0) begin
315             reg_ch0_vaild <= 1'b0;
316         end else if(state == state_ch0_0 && (r1_ch0_start == 1'b1 && r2_ch0_start == 1'b0)) begin
317             reg_ch0_vaild <= 1'b0;
318         end else if(state == state_ch0_0 && reg_ch0_vaild == 1'b0) begin
319             reg_ch0_vaild <= 1'b1;
320         end
321     end
322     //ch1
323     always @(posedge I_clk) begin
324         if(I_Rst_n == 1'b0) begin
325             reg_ch1_vaild <= 1'b0;
326         end else if(state == state_ch1_0 && (r1_ch1_start == 1'b1 && r2_ch1_start == 1'b0)) begin
327             reg_ch1_vaild <= 1'b0;
328         end else if(state == state_ch1_0 && reg_ch1_vaild == 1'b0) begin
329             reg_ch1_vaild <= 1'b1;
330         end
331     end
332     //ch2
333     always @(posedge I_clk) begin
334         if(I_Rst_n == 1'b0) begin
335             reg_ch2_vaild <= 1'b0;
336         end else if(state == state_ch2_0 && (r1_ch2_start == 1'b1 && r2_ch2_start == 1'b0)) begin
337             reg_ch2_vaild <= 1'b0;
338         end else if(state == state_ch2_0 && reg_ch2_vaild == 1'b0) begin
339             reg_ch2_vaild <= 1'b1;
340         end
341     end
342     //ch3
343     always @(posedge I_clk) begin
344         if(I_Rst_n == 1'b0) begin
345             reg_ch3_vaild <= 1'b0;
346         end else if(state == state_ch3_0 && (r1_ch3_start == 1'b1 && r2_ch3_start == 1'b0)) begin
347             reg_ch3_vaild <= 1'b0;
348         end else if(state == state_ch3_0 && reg_ch3_vaild == 1'b0) begin
349             reg_ch3_vaild <= 1'b1;
350         end
351     end
352 
353     //state
354     always @(posedge I_clk) begin
355         if(I_Rst_n == 1'b0) begin
356             state <= state_idle;
357         end else begin
358             case (state)
359                 state_idle: begin
360                     if(aribe_start == 1'b1 && aribe_cycle == 1'b0) begin
361                         state <= state_aribe;
362                     end else begin
363                         state <= state_idle;
364                     end
365                 end
366                 state_aribe:begin
367                     if(step[2] == 1'b1 && step[3] == 1'b0) begin
368                         case (S3_req_Concat)
369                             4'b0001:begin
370                                 state <= state_ch0_0;
371                             end 
372                             4'b0010:begin
373                                 state <= state_ch1_0;
374                             end 
375                             4'b0100:begin
376                                 state <= state_ch2_0;
377                             end 
378                             4'b1000:begin
379                                 state <= state_ch3_0;
380                             end 
381                             default: state <= state_aribe;
382                         endcase
383                     end else begin
384                         state <= state_aribe;
385                     end
386                 end
387                 // state.step.0
388                 state_ch0_0:begin
389                     if((r1_ch0_start == 1'b1 && r2_ch0_start == 1'b0)) begin
390                         state <= state_ch0_1;
391                     end else begin
392                         state <= state_ch0_0;
393                     end
394                 end
395                 state_ch1_0:begin
396                     if((r1_ch1_start == 1'b1 && r2_ch1_start == 1'b0)) begin
397                         state <= state_ch1_1;
398                     end else begin
399                         state <= state_ch1_0;
400                     end
401                 end
402                 state_ch2_0:begin
403                     if((r1_ch2_start == 1'b1 && r2_ch2_start == 1'b0)) begin
404                         state <= state_ch2_1;
405                     end else begin
406                         state <= state_ch2_0;
407                     end
408                 end
409                 state_ch3_0:begin
410                     if((r1_ch3_start == 1'b1 && r2_ch3_start == 1'b0)) begin
411                         state <= state_ch3_1;
412                     end else begin
413                         state <= state_ch3_0;
414                     end
415                 end
416 
417                 // state.step.1
418                 state_ch0_1:begin
419                     if(I_ch0_end == 1'b1) begin
420                         state <= state_idle;
421                     end else begin
422                         state <= state_ch0_1;
423                     end
424                 end
425                 state_ch1_1:begin
426                     if(I_ch1_end == 1'b1) begin
427                         state <= state_idle;
428                     end else begin
429                         state <= state_ch1_1;
430                     end
431                 end
432                 state_ch2_1:begin
433                     if(I_ch2_end == 1'b1) begin
434                         state <= state_idle;
435                     end else begin
436                         state <= state_ch2_1;
437                     end
438                 end
439                 state_ch3_1:begin
440                     if(I_ch3_end == 1'b1) begin
441                         state <= state_idle;
442                     end else begin
443                         state <= state_ch3_1;
444                     end
445                 end
446                 default: begin
447                     state <= state_idle;
448                 end
449             endcase
450         end
451     end  
452 
453     always @(*) begin
454         if(state == state_ch0_0||state == state_ch0_1) begin
455             M_AXI_AWID        <= CH0_M_AXI_AWID   ;
456             M_AXI_AWADDR      <= CH0_M_AXI_AWADDR ;
457             M_AXI_AWLEN       <= CH0_M_AXI_AWLEN  ;
458             M_AXI_AWSIZE      <= CH0_M_AXI_AWSIZE ;
459             M_AXI_AWBURST     <= CH0_M_AXI_AWBURST;
460             M_AXI_AWLOCK      <= CH0_M_AXI_AWLOCK ;
461             M_AXI_AWCACHE     <= CH0_M_AXI_AWCACHE;
462             M_AXI_AWPROT      <= CH0_M_AXI_AWPROT ;
463             M_AXI_AWQOS       <= CH0_M_AXI_AWQOS  ;
464             M_AXI_AWUSER      <= CH0_M_AXI_AWUSER ;
465             M_AXI_AWVALID     <= CH0_M_AXI_AWVALID;
466             CH0_M_AXI_AWREADY <= M_AXI_AWREADY    ;
467             M_AXI_WDATA       <= CH0_M_AXI_WDATA  ;
468             M_AXI_WSTRB       <= CH0_M_AXI_WSTRB  ;
469             M_AXI_WLAST       <= CH0_M_AXI_WLAST  ;
470             M_AXI_WUSER       <= CH0_M_AXI_WUSER  ;
471             M_AXI_WVALID      <= CH0_M_AXI_WVALID ;
472             CH0_M_AXI_WREADY  <= M_AXI_WREADY     ;
473             CH0_M_AXI_BID     <= M_AXI_BID        ;
474             CH0_M_AXI_BRESP   <= M_AXI_BRESP      ;
475             CH0_M_AXI_BUSER   <= M_AXI_BUSER      ;
476             CH0_M_AXI_BVALID  <= M_AXI_BVALID     ;
477             M_AXI_BREADY      <= CH0_M_AXI_BREADY ;
478         end else if(state == state_ch1_0 || state == state_ch1_1) begin
479             M_AXI_AWID        <= CH1_M_AXI_AWID   ;
480             M_AXI_AWADDR      <= CH1_M_AXI_AWADDR ;
481             M_AXI_AWLEN       <= CH1_M_AXI_AWLEN  ;
482             M_AXI_AWSIZE      <= CH1_M_AXI_AWSIZE ;
483             M_AXI_AWBURST     <= CH1_M_AXI_AWBURST;
484             M_AXI_AWLOCK      <= CH1_M_AXI_AWLOCK ;
485             M_AXI_AWCACHE     <= CH1_M_AXI_AWCACHE;
486             M_AXI_AWPROT      <= CH1_M_AXI_AWPROT ;
487             M_AXI_AWQOS       <= CH1_M_AXI_AWQOS  ;
488             M_AXI_AWUSER      <= CH1_M_AXI_AWUSER ;
489             M_AXI_AWVALID     <= CH1_M_AXI_AWVALID;
490             CH1_M_AXI_AWREADY <= M_AXI_AWREADY    ;
491             M_AXI_WDATA       <= CH1_M_AXI_WDATA  ;
492             M_AXI_WSTRB       <= CH1_M_AXI_WSTRB  ;
493             M_AXI_WLAST       <= CH1_M_AXI_WLAST  ;
494             M_AXI_WUSER       <= CH1_M_AXI_WUSER  ;
495             M_AXI_WVALID      <= CH1_M_AXI_WVALID ;
496             CH1_M_AXI_WREADY  <= M_AXI_WREADY     ;
497             CH1_M_AXI_BID     <= M_AXI_BID        ;
498             CH1_M_AXI_BRESP   <= M_AXI_BRESP      ;
499             CH1_M_AXI_BUSER   <= M_AXI_BUSER      ;
500             CH1_M_AXI_BVALID  <= M_AXI_BVALID     ;
501             M_AXI_BREADY      <= CH1_M_AXI_BREADY ;
502         end else if(state == state_ch2_0 || state == state_ch2_1) begin
503             M_AXI_AWID        <= CH2_M_AXI_AWID   ;
504             M_AXI_AWADDR      <= CH2_M_AXI_AWADDR ;
505             M_AXI_AWLEN       <= CH2_M_AXI_AWLEN  ;
506             M_AXI_AWSIZE      <= CH2_M_AXI_AWSIZE ;
507             M_AXI_AWBURST     <= CH2_M_AXI_AWBURST;
508             M_AXI_AWLOCK      <= CH2_M_AXI_AWLOCK ;
509             M_AXI_AWCACHE     <= CH2_M_AXI_AWCACHE;
510             M_AXI_AWPROT      <= CH2_M_AXI_AWPROT ;
511             M_AXI_AWQOS       <= CH2_M_AXI_AWQOS  ;
512             M_AXI_AWUSER      <= CH2_M_AXI_AWUSER ;
513             M_AXI_AWVALID     <= CH2_M_AXI_AWVALID;
514             CH2_M_AXI_AWREADY <= M_AXI_AWREADY    ;
515             M_AXI_WDATA       <= CH2_M_AXI_WDATA  ;
516             M_AXI_WSTRB       <= CH2_M_AXI_WSTRB  ;
517             M_AXI_WLAST       <= CH2_M_AXI_WLAST  ;
518             M_AXI_WUSER       <= CH2_M_AXI_WUSER  ;
519             M_AXI_WVALID      <= CH2_M_AXI_WVALID ;
520             CH2_M_AXI_WREADY  <= M_AXI_WREADY     ;
521             CH2_M_AXI_BID     <= M_AXI_BID        ;
522             CH2_M_AXI_BRESP   <= M_AXI_BRESP      ;
523             CH2_M_AXI_BUSER   <= M_AXI_BUSER      ;
524             CH2_M_AXI_BVALID  <= M_AXI_BVALID     ;
525             M_AXI_BREADY      <= CH2_M_AXI_BREADY ;
526         end else if(state == state_ch3_0 || state == state_ch3_1) begin
527             M_AXI_AWID        <= CH3_M_AXI_AWID   ;
528             M_AXI_AWADDR      <= CH3_M_AXI_AWADDR ;
529             M_AXI_AWLEN       <= CH3_M_AXI_AWLEN  ;
530             M_AXI_AWSIZE      <= CH3_M_AXI_AWSIZE ;
531             M_AXI_AWBURST     <= CH3_M_AXI_AWBURST;
532             M_AXI_AWLOCK      <= CH3_M_AXI_AWLOCK ;
533             M_AXI_AWCACHE     <= CH3_M_AXI_AWCACHE;
534             M_AXI_AWPROT      <= CH3_M_AXI_AWPROT ;
535             M_AXI_AWQOS       <= CH3_M_AXI_AWQOS  ;
536             M_AXI_AWUSER      <= CH3_M_AXI_AWUSER ;
537             M_AXI_AWVALID     <= CH3_M_AXI_AWVALID;
538             CH3_M_AXI_AWREADY <= M_AXI_AWREADY    ;
539             M_AXI_WDATA       <= CH3_M_AXI_WDATA  ;
540             M_AXI_WSTRB       <= CH3_M_AXI_WSTRB  ;
541             M_AXI_WLAST       <= CH3_M_AXI_WLAST  ;
542             M_AXI_WUSER       <= CH3_M_AXI_WUSER  ;
543             M_AXI_WVALID      <= CH3_M_AXI_WVALID ;
544             CH3_M_AXI_WREADY  <= M_AXI_WREADY     ;
545             CH3_M_AXI_BID     <= M_AXI_BID        ;
546             CH3_M_AXI_BRESP   <= M_AXI_BRESP      ;
547             CH3_M_AXI_BUSER   <= M_AXI_BUSER      ;
548             CH3_M_AXI_BVALID  <= M_AXI_BVALID     ;
549             M_AXI_BREADY      <= CH3_M_AXI_BREADY ;
550         end else begin
551             M_AXI_AWID        <= CH3_M_AXI_AWID   ;
552             M_AXI_AWADDR      <= CH3_M_AXI_AWADDR ;
553             M_AXI_AWLEN       <= CH3_M_AXI_AWLEN  ;
554             M_AXI_AWSIZE      <= CH3_M_AXI_AWSIZE ;
555             M_AXI_AWBURST     <= CH3_M_AXI_AWBURST;
556             M_AXI_AWLOCK      <= CH3_M_AXI_AWLOCK ;
557             M_AXI_AWCACHE     <= CH3_M_AXI_AWCACHE;
558             M_AXI_AWPROT      <= CH3_M_AXI_AWPROT ;
559             M_AXI_AWQOS       <= CH3_M_AXI_AWQOS  ;
560             M_AXI_AWUSER      <= CH3_M_AXI_AWUSER ;
561             M_AXI_AWVALID     <= CH3_M_AXI_AWVALID;
562             CH3_M_AXI_AWREADY <= M_AXI_AWREADY    ;
563             M_AXI_WDATA       <= CH3_M_AXI_WDATA  ;
564             M_AXI_WSTRB       <= CH3_M_AXI_WSTRB  ;
565             M_AXI_WLAST       <= CH3_M_AXI_WLAST  ;
566             M_AXI_WUSER       <= CH3_M_AXI_WUSER  ;
567             M_AXI_WVALID      <= CH3_M_AXI_WVALID ;
568             CH3_M_AXI_WREADY  <= M_AXI_WREADY     ;
569             CH3_M_AXI_BID     <= M_AXI_BID        ;
570             CH3_M_AXI_BRESP   <= M_AXI_BRESP      ;
571             CH3_M_AXI_BUSER   <= M_AXI_BUSER      ;
572             CH3_M_AXI_BVALID  <= M_AXI_BVALID     ;
573             M_AXI_BREADY      <= CH3_M_AXI_BREADY ;
574         end
575     end
576 endmodule
View Code

 

posted @ 2024-04-13 13:14  NoNounknow  阅读(9)  评论(0编辑  收藏  举报