x393  1.0
FPGAcodeforElphelNC393camera
axi_hp_abort.v
Go to the documentation of this file.
1 
30 `timescale 1ns/1ps
31 
32 module axi_hp_abort(
33  input hclk,
34  input hrst, // just disables processing inputs
35  input abort,
36  output busy, // should disable control of afi_wvalid, afi_awid
37  output reg done,
38  input afi_awvalid, // afi_awready is supposed to be always on when afi_awvalid (caller uses fifo counetrs) ?
39  input afi_awready, //
40  input [ 5:0] afi_awid,
41  input [3:0] afi_awlen,
43  input afi_wready,
44  output afi_wvalid,
45  output reg [ 5:0] afi_wid,
46  input afi_arvalid,
47  input afi_arready,
48  input [ 3:0] afi_arlen,
50  input afi_rvalid,
51  output afi_rready,
52  output afi_wlast,
53 // TODO: Try to resolve problems when afi_racount, afi_wacount afi_wcount do not match expected
54  input [ 2:0] afi_racount,
55  input [ 7:0] afi_rcount,
56  input [ 5:0] afi_wacount,
57  input [ 7:0] afi_wcount,
58  output reg dirty, // single bit to be sampled in different clock domain to see if flushing is needed
59  output reg axi_mismatch, // calculated as 'dirty' but axi hp counters are 0
60  output [21:0] debug
61 );
62  reg busy_r;
63  wire done_w = busy_r && !dirty ;
64  reg [3:0] aw_lengths_ram[0:31];
65  reg [4:0] aw_lengths_waddr = 0;
66  reg [4:0] aw_lengths_raddr = 0;
67  reg [5:0] aw_count = 0;
68  reg [7:0] w_count = 0;
69  reg [7:0] r_count = 0;
70  reg adav = 0;
74  reg ard_r = 0; // additional length read if not much data
75  wire ard = adav && ((|w_count[7:4]) || ard_r);
78  reg afi_wlast_r; // wait one cycle after last in each burst (just to ease timing)
79  reg busy_aborting; // actually aborting
81  assign busy = busy_r;
82 
83  assign afi_rready = busy_aborting && (|r_count) && ((|afi_rcount[7:1]) || (!afi_rready_r && afi_rcount[0]));
85  assign afi_wvalid = busy_aborting && adav && !afi_wlast_r;
86  assign debug = {aw_count[5:0], w_count[7:0], r_count[7:0]};
87 
88  // Watch for transactios performed by others (and this one too)
89  always @ (posedge hclk) begin
90  // read channel
91  if (reset_counters) r_count <= 0;
92  else if (drd)
93  if (arwr) r_count <= r_count + {4'b0, afi_arlen};
94  else r_count <= r_count - 1;
95  else
96  if (arwr) r_count <= w_count + {4'b0, afi_arlen} + 1;
97 
98  // write channel
99 
100  if (awr) afi_wid <= afi_awid; // one command is supposed to use just one awid/wid
101 
103 
105  else if (awr) aw_lengths_waddr <= aw_lengths_waddr + 1;
106 
108  else if (ard) aw_lengths_raddr <= aw_lengths_raddr + 1;
109 
110  if (reset_counters) aw_count <= 0;
111  else if ( awr && !ard) aw_count <= aw_count + 1;
112  else if (!awr && ard) aw_count <= aw_count - 1;
113 
114  adav <= !reset_counters && (|aw_count[5:1]) || ((awr || aw_count[0]) && !ard) || (awr && aw_count[0]);
115 
116  ard_r <= !ard && adav && (w_count[3:0] > aw_lengths_ram[aw_lengths_raddr]);
117 
118  if (reset_counters) w_count <= 0;
119  else if (wwr)
121  else w_count <= w_count + 1;
122  else
123  if (ard) w_count <= w_count - {4'b0, aw_lengths_ram[aw_lengths_raddr]} - 1;
124 
125  dirty <= (|r_count) || (|aw_count); // assuming w_count can never be non-zero? - no
126  end
127 
128  // flushing part
129  always @ (posedge hclk) begin
130 
131  if (abort) busy_r <= 1;
132  else if (done_w) busy_r <= 0;
133 
134  if (abort && ((|afi_racount) || (|afi_rcount) || (|afi_wacount) || (|afi_wcount))) busy_aborting <= 1;
135  else if (done_w) busy_aborting <= 0;
136 
137 
138  done <= done_w;
141 
142  axi_mismatch <= busy && !busy_aborting && dirty; //
143  end
144 
145 
146 endmodule
147 
[0:31] 14187aw_lengths_ramreg[3:0]
Definition: axi_hp_abort.v:64
[21:0] 14184debug
Definition: axi_hp_abort.v:60
[ 5:0] 14165afi_awid
Definition: axi_hp_abort.v:40
[ 3:0] 14173afi_arlen
Definition: axi_hp_abort.v:48
14188aw_lengths_waddrreg[4:0]
Definition: axi_hp_abort.v:65
reg 14183axi_mismatch
Definition: axi_hp_abort.v:59
14200afi_rready_rreg
Definition: axi_hp_abort.v:77
14191w_countreg[7:0]
Definition: axi_hp_abort.v:68
[ 7:0] 14179afi_rcount
Definition: axi_hp_abort.v:55
reg 14162done
Definition: axi_hp_abort.v:37
reg [ 5:0] 14170afi_wid
Definition: axi_hp_abort.v:45
14202busy_abortingreg
Definition: axi_hp_abort.v:79
14189aw_lengths_raddrreg[4:0]
Definition: axi_hp_abort.v:66
14190aw_countreg[5:0]
Definition: axi_hp_abort.v:67
[3:0] 14166afi_awlen
Definition: axi_hp_abort.v:41
[ 7:0] 14181afi_wcount
Definition: axi_hp_abort.v:57
14203reset_counterswire
Definition: axi_hp_abort.v:80
reg 14182dirty
Definition: axi_hp_abort.v:58
14192r_countreg[7:0]
Definition: axi_hp_abort.v:69
14201afi_wlast_rreg
Definition: axi_hp_abort.v:78
[ 5:0] 14180afi_wacount
Definition: axi_hp_abort.v:56
[ 2:0] 14178afi_racount
Definition: axi_hp_abort.v:54