x393
1.0
FPGAcodeforElphelNC393camera
Main Page
+
Packages
Packages
+
Package Functions
All
Functions/Tasks/Always Construct
Variables
+
Design Unit List
Design Unit List
Design Units
Design Unit Hierarchy
+
Design Unit Members
+
All
1
2
3
5
7
8
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
+
Functions/Tasks/Always Construct
_
a
c
e
f
g
l
p
r
s
t
w
+
Variables
1
2
3
5
7
8
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
+
Files
File List
+
File Members
+
All
c
d
s
u
+
Variables
c
d
s
u
•
All
Classes
Namespaces
Files
Functions
Variables
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
,
42
input
afi_wvalid_in
,
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
,
49
input
afi_rready_in
,
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
;
71
wire
arwr
= !
hrst
&&
afi_arvalid
&&
afi_arready
;
72
wire
drd
= !
hrst
&&
afi_rvalid
&&
afi_rready_in
;
73
wire
awr
= !
hrst
&&
afi_awvalid
&&
afi_awready
;
74
reg
ard_r
=
0
;
// additional length read if not much data
75
wire
ard
=
adav
&& ((|
w_count
[
7
:
4
]) ||
ard_r
);
76
wire
wwr
= !
hrst
&&
afi_wready
&&
afi_wvalid_in
;
77
reg
afi_rready_r
;
78
reg
afi_wlast_r
;
// wait one cycle after last in each burst (just to ease timing)
79
reg
busy_aborting
;
// actually aborting
80
wire
reset_counters
=
busy_r
&& !
busy_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
]));
84
assign
afi_wlast
=
busy_aborting
&&
adav
&& (
w_count
[
3
:
0
] ==
aw_lengths_ram
[
aw_lengths_raddr
]);
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
102
if
(
awr
)
aw_lengths_ram
[
aw_lengths_waddr
] <=
afi_awlen
;
103
104
if
(
reset_counters
)
aw_lengths_waddr
<=
0
;
105
else
if
(
awr
)
aw_lengths_waddr
<=
aw_lengths_waddr
+
1
;
106
107
if
(
reset_counters
)
aw_lengths_raddr
<=
0
;
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
)
120
if
(
ard
)
w_count
<=
w_count
- {
4'b0
,
aw_lengths_ram
[
aw_lengths_raddr
]};
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
;
139
afi_rready_r
<=
afi_rready
;
140
afi_wlast_r
<=
afi_wlast
;
141
142
axi_mismatch
<=
busy
&& !
busy_aborting
&&
dirty
;
//
143
end
144
145
146
endmodule
147
axi_hp_abort.14187aw_lengths_ram
[0:31] 14187aw_lengths_ramreg[3:0]
Definition:
axi_hp_abort.v:64
axi_hp_abort.14177afi_wlast
14177afi_wlast
Definition:
axi_hp_abort.v:52
axi_hp_abort.14158hclk
14158hclk
Definition:
axi_hp_abort.v:33
axi_hp_abort.14198ard
14198ardwire
Definition:
axi_hp_abort.v:75
axi_hp_abort.14195drd
14195drdwire
Definition:
axi_hp_abort.v:72
axi_hp_abort.14169afi_wvalid
14169afi_wvalid
Definition:
axi_hp_abort.v:44
axi_hp_abort.14161busy
14161busy
Definition:
axi_hp_abort.v:36
axi_hp_abort.14164afi_awready
14164afi_awready
Definition:
axi_hp_abort.v:39
axi_hp_abort.14184debug
[21:0] 14184debug
Definition:
axi_hp_abort.v:60
axi_hp_abort.14165afi_awid
[ 5:0] 14165afi_awid
Definition:
axi_hp_abort.v:40
axi_hp_abort.14186done_w
14186done_wwire
Definition:
axi_hp_abort.v:63
axi_hp_abort.14175afi_rvalid
14175afi_rvalid
Definition:
axi_hp_abort.v:50
axi_hp_abort.14185busy_r
14185busy_rreg
Definition:
axi_hp_abort.v:62
axi_hp_abort.14174afi_rready_in
14174afi_rready_in
Definition:
axi_hp_abort.v:49
axi_hp_abort.14173afi_arlen
[ 3:0] 14173afi_arlen
Definition:
axi_hp_abort.v:48
axi_hp_abort.14188aw_lengths_waddr
14188aw_lengths_waddrreg[4:0]
Definition:
axi_hp_abort.v:65
axi_hp_abort.14183axi_mismatch
reg 14183axi_mismatch
Definition:
axi_hp_abort.v:59
axi_hp_abort.14167afi_wvalid_in
14167afi_wvalid_in
Definition:
axi_hp_abort.v:42
axi_hp_abort.14200afi_rready_r
14200afi_rready_rreg
Definition:
axi_hp_abort.v:77
axi_hp_abort.14191w_count
14191w_countreg[7:0]
Definition:
axi_hp_abort.v:68
axi_hp_abort.14172afi_arready
14172afi_arready
Definition:
axi_hp_abort.v:47
axi_hp_abort.14168afi_wready
14168afi_wready
Definition:
axi_hp_abort.v:43
axi_hp_abort.14179afi_rcount
[ 7:0] 14179afi_rcount
Definition:
axi_hp_abort.v:55
axi_hp_abort.14194arwr
14194arwrwire
Definition:
axi_hp_abort.v:71
axi_hp_abort.14162done
reg 14162done
Definition:
axi_hp_abort.v:37
axi_hp_abort.14171afi_arvalid
14171afi_arvalid
Definition:
axi_hp_abort.v:46
axi_hp_abort.14170afi_wid
reg [ 5:0] 14170afi_wid
Definition:
axi_hp_abort.v:45
axi_hp_abort.14202busy_aborting
14202busy_abortingreg
Definition:
axi_hp_abort.v:79
axi_hp_abort.14189aw_lengths_raddr
14189aw_lengths_raddrreg[4:0]
Definition:
axi_hp_abort.v:66
axi_hp_abort.14190aw_count
14190aw_countreg[5:0]
Definition:
axi_hp_abort.v:67
axi_hp_abort.14196awr
14196awrwire
Definition:
axi_hp_abort.v:73
axi_hp_abort.14199wwr
14199wwrwire
Definition:
axi_hp_abort.v:76
axi_hp_abort.14163afi_awvalid
14163afi_awvalid
Definition:
axi_hp_abort.v:38
axi_hp_abort.14166afi_awlen
[3:0] 14166afi_awlen
Definition:
axi_hp_abort.v:41
axi_hp_abort.14160abort
14160abort
Definition:
axi_hp_abort.v:35
axi_hp_abort.14193adav
14193adavreg
Definition:
axi_hp_abort.v:70
axi_hp_abort.14181afi_wcount
[ 7:0] 14181afi_wcount
Definition:
axi_hp_abort.v:57
axi_hp_abort.14197ard_r
14197ard_rreg
Definition:
axi_hp_abort.v:74
axi_hp_abort.14203reset_counters
14203reset_counterswire
Definition:
axi_hp_abort.v:80
axi_hp_abort
Definition:
axi_hp_abort.v:32
axi_hp_abort.14182dirty
reg 14182dirty
Definition:
axi_hp_abort.v:58
axi_hp_abort.14192r_count
14192r_countreg[7:0]
Definition:
axi_hp_abort.v:69
axi_hp_abort.14201afi_wlast_r
14201afi_wlast_rreg
Definition:
axi_hp_abort.v:78
axi_hp_abort.14159hrst
14159hrst
Definition:
axi_hp_abort.v:34
axi_hp_abort.14180afi_wacount
[ 5:0] 14180afi_wacount
Definition:
axi_hp_abort.v:56
axi_hp_abort.14178afi_racount
[ 2:0] 14178afi_racount
Definition:
axi_hp_abort.v:54
axi_hp_abort.14176afi_rready
14176afi_rready
Definition:
axi_hp_abort.v:51
x393_sata
ahci
axi_hp_abort.v
Generated by
1.8.12