1 |
2 |
angelobacc |
library IEEE;
|
2 |
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
3 |
|
|
use IEEE.std_logic_arith.all;
|
4 |
|
|
use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
5 |
|
|
use IEEE.math_real."log2";
|
6 |
|
|
|
7 |
|
|
entity filterV is
|
8 |
|
|
generic (
|
9 |
|
|
DATA_WIDTH : integer := 8;
|
10 |
|
|
GRAD_WIDTH : integer := 16
|
11 |
|
|
);
|
12 |
|
|
port (
|
13 |
|
|
clk : in std_logic;
|
14 |
|
|
fsync : in std_logic;
|
15 |
|
|
--
|
16 |
|
|
pData1x : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
17 |
|
|
pData2x : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
18 |
|
|
pData3x : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
19 |
|
|
pData4x : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
20 |
|
|
pData5x : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
21 |
|
|
pData6x : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
22 |
|
|
pData7x : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
23 |
|
|
pData8x : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
24 |
|
|
pData9x : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
25 |
|
|
--
|
26 |
|
|
pData1y : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
27 |
|
|
pData2y : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
28 |
|
|
pData3y : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
29 |
|
|
pData4y : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
30 |
|
|
pData5y : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
31 |
|
|
pData6y : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
32 |
|
|
pData7y : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
33 |
|
|
pData8y : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
34 |
|
|
pData9y : in STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0);
|
35 |
|
|
--
|
36 |
|
|
Mdata_o : out STD_LOGIC_VECTOR(GRAD_WIDTH-1-16 downto 0); -- X gradient
|
37 |
|
|
Ddata_o : out STD_LOGIC_VECTOR(1 downto 0) -- Y gradient
|
38 |
|
|
);
|
39 |
|
|
end entity filterV;
|
40 |
|
|
|
41 |
|
|
|
42 |
|
|
architecture Behavioral of filterV is
|
43 |
|
|
|
44 |
|
|
signal p1x,p2x,p3x,p4x,p5x,p6x,p7x,p8x,p9x : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
45 |
|
|
signal p1xa,p2xa,p3xa,p4xa,p5xa,p6xa,p7xa,p8xa,p9xa : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
46 |
|
|
signal p1xb,p2xb,p3xb,p4xb,p5xb,p6xb,p7xb,p8xb,p9xb : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
47 |
|
|
|
48 |
|
|
signal p1y,p2y,p3y,p4y,p5y,p6y,p7y,p8y,p9y : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
49 |
|
|
signal p1ya,p2ya,p3ya,p4ya,p5ya,p6ya,p7ya,p8ya,p9ya : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
50 |
|
|
signal p1yb,p2yb,p3yb,p4yb,p5yb,p6yb,p7yb,p8yb,p9yb : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
51 |
|
|
|
52 |
|
|
signal sY1,sY2,sX1,sX2 : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
53 |
|
|
signal sX1a,sX1b,sX2a,sX2b : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
54 |
|
|
signal sY1a,sY1b,sY2a,sY2b : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
55 |
|
|
signal sY1c,sY2c,sXc : STD_LOGIC_VECTOR(GRAD_WIDTH-1 downto 0);
|
56 |
|
|
signal Xgrad,Ygrad,XgradM,YgradM : STD_LOGIC_VECTOR(GRAD_WIDTH-1-16 downto 0);
|
57 |
|
|
signal XgradS,YgradS : STD_LOGIC;
|
58 |
|
|
|
59 |
|
|
begin
|
60 |
|
|
|
61 |
|
|
--1----------------------------------------
|
62 |
|
|
prod1 : process (clk) -- for the frame sync signal
|
63 |
|
|
begin
|
64 |
|
|
if rising_edge(clk) then
|
65 |
|
|
if fsync ='1' then
|
66 |
|
|
|
67 |
|
|
-------------------------------------------------------------------GRAD_Y_hardwired multipliers
|
68 |
|
|
|
69 |
|
|
p1ya <=(pData1y(GRAD_WIDTH-1) & pData1y(GRAD_WIDTH-2-7 downto 0) & (7-1 downto 0 => '0')) +
|
70 |
|
|
(pData1y(GRAD_WIDTH-1) & pData1y(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0'));
|
71 |
|
|
p1yb <=(pData1y(GRAD_WIDTH-1) & pData1y(GRAD_WIDTH-2 downto 0));
|
72 |
|
|
|
73 |
|
|
p2ya <=(pData2y(GRAD_WIDTH-1) & pData2y(GRAD_WIDTH-2-8 downto 0) & (8-1 downto 0 => '0')) +
|
74 |
|
|
(pData2y(GRAD_WIDTH-1) & pData2y(GRAD_WIDTH-2-7 downto 0) & (7-1 downto 0 => '0'));
|
75 |
|
|
p2yb <=(pData2y(GRAD_WIDTH-1) & pData2y(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0')) +
|
76 |
|
|
(pData2y(GRAD_WIDTH-1) & pData2y(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0')) +
|
77 |
|
|
(pData2y(GRAD_WIDTH-1) & pData2y(GRAD_WIDTH-2-2 downto 0) & (2-1 downto 0 => '0'));
|
78 |
|
|
|
79 |
|
|
p3ya <=(pData3y(GRAD_WIDTH-1) & pData3y(GRAD_WIDTH-2-9 downto 0) & (9-1 downto 0 => '0')) +
|
80 |
|
|
(pData3y(GRAD_WIDTH-1) & pData3y(GRAD_WIDTH-2-7 downto 0) & (7-1 downto 0 => '0'));
|
81 |
|
|
p3yb <=(pData3y(GRAD_WIDTH-1) & pData3y(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0')) +
|
82 |
|
|
(pData3y(GRAD_WIDTH-1) & pData3y(GRAD_WIDTH-2-3 downto 0) & (3-1 downto 0 => '0')) +
|
83 |
|
|
(pData3y(GRAD_WIDTH-1) & pData3y(GRAD_WIDTH-2-1 downto 0) & (1-1 downto 0 => '0'));
|
84 |
|
|
|
85 |
|
|
p4ya <=(pData4y(GRAD_WIDTH-1) & pData4y(GRAD_WIDTH-2-8 downto 0) & (8-1 downto 0 => '0')) +
|
86 |
|
|
(pData4y(GRAD_WIDTH-1) & pData4y(GRAD_WIDTH-2-6 downto 0) & (6-1 downto 0 => '0'));
|
87 |
|
|
p4yb <=(pData4y(GRAD_WIDTH-1) & pData4y(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0')) +
|
88 |
|
|
(pData4y(GRAD_WIDTH-1) & pData4y(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0'));
|
89 |
|
|
|
90 |
|
|
p5ya <= (others => '0');
|
91 |
|
|
p5yb <= (others => '0');
|
92 |
|
|
--p5ya <= pData5x;--------DEBUG-------------
|
93 |
|
|
|
94 |
|
|
p6ya <=(pData6y(GRAD_WIDTH-1) & pData6y(GRAD_WIDTH-2-8 downto 0) & (8-1 downto 0 => '0')) +
|
95 |
|
|
(pData6y(GRAD_WIDTH-1) & pData6y(GRAD_WIDTH-2-6 downto 0) & (6-1 downto 0 => '0'));
|
96 |
|
|
p6yb <=(pData6y(GRAD_WIDTH-1) & pData6y(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0')) +
|
97 |
|
|
(pData6y(GRAD_WIDTH-1) & pData6y(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0'));
|
98 |
|
|
|
99 |
|
|
p7ya <=(pData7y(GRAD_WIDTH-1) & pData7y(GRAD_WIDTH-2-9 downto 0) & (9-1 downto 0 => '0')) +
|
100 |
|
|
(pData7y(GRAD_WIDTH-1) & pData7y(GRAD_WIDTH-2-7 downto 0) & (7-1 downto 0 => '0'));
|
101 |
|
|
p7yb <=(pData7y(GRAD_WIDTH-1) & pData7y(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0')) +
|
102 |
|
|
(pData7y(GRAD_WIDTH-1) & pData7y(GRAD_WIDTH-2-3 downto 0) & (3-1 downto 0 => '0')) +
|
103 |
|
|
(pData7y(GRAD_WIDTH-1) & pData7y(GRAD_WIDTH-2-1 downto 0) & (1-1 downto 0 => '0'));
|
104 |
|
|
|
105 |
|
|
p8ya <=(pData8y(GRAD_WIDTH-1) & pData8y(GRAD_WIDTH-2-8 downto 0) & (8-1 downto 0 => '0')) +
|
106 |
|
|
(pData8y(GRAD_WIDTH-1) & pData8y(GRAD_WIDTH-2-7 downto 0) & (7-1 downto 0 => '0'));
|
107 |
|
|
p8yb <=(pData8y(GRAD_WIDTH-1) & pData8y(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0')) +
|
108 |
|
|
(pData8y(GRAD_WIDTH-1) & pData8y(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0')) +
|
109 |
|
|
(pData8y(GRAD_WIDTH-1) & pData8y(GRAD_WIDTH-2-2 downto 0) & (2-1 downto 0 => '0'));
|
110 |
|
|
|
111 |
|
|
p9ya <=(pData9y(GRAD_WIDTH-1) & pData9y(GRAD_WIDTH-2-7 downto 0) & (7-1 downto 0 => '0')) +
|
112 |
|
|
(pData9y(GRAD_WIDTH-1) & pData9y(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0'));
|
113 |
|
|
p9yb <=(pData9y(GRAD_WIDTH-1) & pData9y(GRAD_WIDTH-2 downto 0));
|
114 |
|
|
|
115 |
|
|
-------------------------------------------------------------------GRAD_X_hardwired multipliers
|
116 |
|
|
|
117 |
|
|
p1xa <=(pData1x(GRAD_WIDTH-1) & pData1x(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0'));
|
118 |
|
|
p1xb <=(others=>'0');
|
119 |
|
|
|
120 |
|
|
p2xa <=(pData2x(GRAD_WIDTH-1) & pData2x(GRAD_WIDTH-2-6 downto 0) & (6-1 downto 0 => '0')) +
|
121 |
|
|
(pData2x(GRAD_WIDTH-1) & pData2x(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0'));
|
122 |
|
|
p2xb <=(pData2x(GRAD_WIDTH-1) & pData2x(GRAD_WIDTH-2-2 downto 0) & (2-1 downto 0 => '0'));
|
123 |
|
|
|
124 |
|
|
p3xa <=(pData3x(GRAD_WIDTH-1) & pData3x(GRAD_WIDTH-2-8 downto 0) & (8-1 downto 0 => '0')) +
|
125 |
|
|
(pData3x(GRAD_WIDTH-1) & pData3x(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0'));
|
126 |
|
|
p3xb <=(pData3x(GRAD_WIDTH-1) & pData3x(GRAD_WIDTH-2-3 downto 0) & (3-1 downto 0 => '0'));
|
127 |
|
|
|
128 |
|
|
p4xa <=(pData4x(GRAD_WIDTH-1) & pData4x(GRAD_WIDTH-2-9 downto 0) & (9-1 downto 0 => '0')) +
|
129 |
|
|
(pData4x(GRAD_WIDTH-1) & pData4x(GRAD_WIDTH-2-6 downto 0) & (6-1 downto 0 => '0'));
|
130 |
|
|
p4xb <=(pData4x(GRAD_WIDTH-1) & pData4x(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0')) +
|
131 |
|
|
(pData4x(GRAD_WIDTH-1) & pData4x(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0')) +
|
132 |
|
|
(pData4x(GRAD_WIDTH-1) & pData4x(GRAD_WIDTH-2-1 downto 0) & (1-1 downto 0 => '0'));
|
133 |
|
|
|
134 |
|
|
p5xa <=(pData5x(GRAD_WIDTH-1) & pData5x(GRAD_WIDTH-2-9 downto 0) & (9-1 downto 0 => '0')) +
|
135 |
|
|
(pData5x(GRAD_WIDTH-1) & pData5x(GRAD_WIDTH-2-8 downto 0) & (8-1 downto 0 => '0'));
|
136 |
|
|
p5xb <=(pData5x(GRAD_WIDTH-1) & pData5x(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0')) +
|
137 |
|
|
(pData5x(GRAD_WIDTH-1) & pData5x(GRAD_WIDTH-2-2 downto 0) & (2-1 downto 0 => '0'));
|
138 |
|
|
|
139 |
|
|
p6xa <=(pData6x(GRAD_WIDTH-1) & pData6x(GRAD_WIDTH-2-9 downto 0) & (9-1 downto 0 => '0')) +
|
140 |
|
|
(pData6x(GRAD_WIDTH-1) & pData6x(GRAD_WIDTH-2-6 downto 0) & (6-1 downto 0 => '0'));
|
141 |
|
|
p6xb <=(pData6x(GRAD_WIDTH-1) & pData6x(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0')) +
|
142 |
|
|
(pData6x(GRAD_WIDTH-1) & pData6x(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0')) +
|
143 |
|
|
(pData6x(GRAD_WIDTH-1) & pData6x(GRAD_WIDTH-2-1 downto 0) & (1-1 downto 0 => '0'));
|
144 |
|
|
|
145 |
|
|
p7xa <=(pData7x(GRAD_WIDTH-1) & pData7x(GRAD_WIDTH-2-8 downto 0) & (8-1 downto 0 => '0')) +
|
146 |
|
|
(pData7x(GRAD_WIDTH-1) & pData7x(GRAD_WIDTH-2-5 downto 0) & (5-1 downto 0 => '0'));
|
147 |
|
|
p7xb <=(pData7x(GRAD_WIDTH-1) & pData7x(GRAD_WIDTH-2-3 downto 0) & (3-1 downto 0 => '0'));
|
148 |
|
|
|
149 |
|
|
p8xa <=(pData8x(GRAD_WIDTH-1) & pData8x(GRAD_WIDTH-2-6 downto 0) & (6-1 downto 0 => '0')) +
|
150 |
|
|
(pData8x(GRAD_WIDTH-1) & pData8x(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0'));
|
151 |
|
|
p8xb <=(pData8x(GRAD_WIDTH-1) & pData8x(GRAD_WIDTH-2-2 downto 0) & (2-1 downto 0 => '0'));
|
152 |
|
|
|
153 |
|
|
p9xa <= (pData9x(GRAD_WIDTH-1) & pData9x(GRAD_WIDTH-2-4 downto 0) & (4-1 downto 0 => '0'));
|
154 |
|
|
p9xb <=(others=>'0');
|
155 |
|
|
|
156 |
|
|
end if;
|
157 |
|
|
end if;
|
158 |
|
|
end process prod1;
|
159 |
|
|
|
160 |
|
|
--2----------------------------------------
|
161 |
|
|
prod2 : process (clk) -- for the frame sync signal
|
162 |
|
|
begin
|
163 |
|
|
if rising_edge(clk) then
|
164 |
|
|
if fsync ='1' then
|
165 |
|
|
p1x <= p1xa + p1xb;
|
166 |
|
|
p2x <= p2xa + p2xb;
|
167 |
|
|
p3x <= p3xa + p3xb;
|
168 |
|
|
p4x <= p4xa + p4xb;
|
169 |
|
|
p5x <= p5xa + p5xb;
|
170 |
|
|
p6x <= p6xa + p6xb;
|
171 |
|
|
p7x <= p7xa + p7xb;
|
172 |
|
|
p8x <= p8xa + p8xb;
|
173 |
|
|
p9x <= p9xa + p9xb;
|
174 |
|
|
--
|
175 |
|
|
p1y <= p1ya + p1yb;
|
176 |
|
|
p2y <= p2ya + p2yb;
|
177 |
|
|
p3y <= p3ya + p3yb;
|
178 |
|
|
p4y <= p4ya + p4yb;
|
179 |
|
|
p5y <= p5ya + p5yb;
|
180 |
|
|
p6y <= p6ya + p6yb;
|
181 |
|
|
p7y <= p7ya + p7yb;
|
182 |
|
|
p8y <= p8ya + p8yb;
|
183 |
|
|
p9y <= p9ya + p9yb;
|
184 |
|
|
end if;
|
185 |
|
|
end if;
|
186 |
|
|
end process prod2;
|
187 |
|
|
|
188 |
|
|
--3----------------------------------------
|
189 |
|
|
sum1 : process (clk)
|
190 |
|
|
begin
|
191 |
|
|
if rising_edge(clk) then
|
192 |
|
|
if fsync ='1' then
|
193 |
|
|
--sY1a <= p5y; ----DEBUG-----------
|
194 |
|
|
sY1a <= p1y+p2y;
|
195 |
|
|
SY1b <= p3y+p4y;
|
196 |
|
|
sY2a <= p6y+p7y;
|
197 |
|
|
sY2b <= p8y+p9y;
|
198 |
|
|
sX1a <= p1x+p2x;
|
199 |
|
|
sX1b <= p3x+p4x;
|
200 |
|
|
sX2a <= p5x+p6x;
|
201 |
|
|
sX2b <= p7x+p8x+p9x;
|
202 |
|
|
end if;
|
203 |
|
|
end if;
|
204 |
|
|
end process sum1;
|
205 |
|
|
|
206 |
|
|
--4----------------------------------------
|
207 |
|
|
sum2 : process (clk)
|
208 |
|
|
begin
|
209 |
|
|
if rising_edge(clk) then
|
210 |
|
|
if fsync ='1' then
|
211 |
|
|
--sY1 <= sY1a; ----DEBUG-----------
|
212 |
|
|
sY1 <= sY1a+sY1b;
|
213 |
|
|
sY2 <= sY2a+sY2b;
|
214 |
|
|
sX1 <= sX1a+sX1b;
|
215 |
|
|
sX2 <= sX2a+sX2b;
|
216 |
|
|
end if;
|
217 |
|
|
end if;
|
218 |
|
|
end process sum2;
|
219 |
|
|
|
220 |
|
|
--5----------------------------------------
|
221 |
|
|
sum3 : process (clk) -- for the frame sync signal
|
222 |
|
|
begin
|
223 |
|
|
if rising_edge(clk) then
|
224 |
|
|
if fsync ='1' then
|
225 |
|
|
sY2c <= (not sY2) + 1;
|
226 |
|
|
sY1c <= Sy1;
|
227 |
|
|
sXc <= sX1+sX2;
|
228 |
|
|
end if;
|
229 |
|
|
end if;
|
230 |
|
|
end process sum3;
|
231 |
|
|
|
232 |
|
|
--6----------------------------------------
|
233 |
|
|
outp : process (clk)
|
234 |
|
|
begin
|
235 |
|
|
if rising_edge(clk) then
|
236 |
|
|
if fsync ='1' then
|
237 |
|
|
--Ygrad <= sY1c(15 downto 0); -------DEBUG-------
|
238 |
|
|
Ygrad <= sY1c(GRAD_WIDTH-1 downto 16)+sY2c(GRAD_WIDTH-1 downto 16);
|
239 |
|
|
Xgrad <= (not sXc(GRAD_WIDTH-1 downto 16)) + 1;
|
240 |
|
|
end if;
|
241 |
|
|
end if;
|
242 |
|
|
end process outp;
|
243 |
|
|
|
244 |
|
|
--7----------------------------------------
|
245 |
|
|
mag : process (clk)
|
246 |
|
|
begin
|
247 |
|
|
if rising_edge(clk) then
|
248 |
|
|
if fsync ='1' then
|
249 |
|
|
if Ygrad(GRAD_WIDTH-1-16)='1' then
|
250 |
|
|
YgradM <= (not Ygrad) + 1;
|
251 |
|
|
else
|
252 |
|
|
YgradM <= Ygrad;
|
253 |
|
|
end if;
|
254 |
|
|
if Xgrad(GRAD_WIDTH-1-16)='1' then
|
255 |
|
|
XgradM <= (not Xgrad) + 1;
|
256 |
|
|
else
|
257 |
|
|
XgradM <= Xgrad;
|
258 |
|
|
end if;
|
259 |
|
|
XgradS <= Xgrad(GRAD_WIDTH-1-16);
|
260 |
|
|
YgradS <= Ygrad(GRAD_WIDTH-1-16);
|
261 |
|
|
end if;
|
262 |
|
|
end if;
|
263 |
|
|
end process ;
|
264 |
|
|
|
265 |
|
|
--8----------------------------------------
|
266 |
|
|
outMag : process (clk)
|
267 |
|
|
begin
|
268 |
|
|
if rising_edge(clk) then
|
269 |
|
|
if fsync ='1' then
|
270 |
|
|
Mdata_o <= XgradM + YgradM;
|
271 |
|
|
--Mdata_o <= YgradM; ----------------DEBUG-------------
|
272 |
|
|
end if;
|
273 |
|
|
end if;
|
274 |
|
|
end process ;
|
275 |
|
|
|
276 |
|
|
-------------------------------------------------------------------------------------------------------
|
277 |
|
|
-- If we want to get get rid of the atan2() we can just use tan(Gy/Gx):
|
278 |
|
|
-- basically the tangent of the angle T defined by Gx and Gy is Gy/Gx: tan(T) = Gy/Gx.
|
279 |
|
|
-- So we just have to compare Gy/Gx against the tangent of the reference angle,
|
280 |
|
|
-- which are the following constants:
|
281 |
|
|
-- tan( p/8) = v2 - 1 ~ 1/2
|
282 |
|
|
-- tan(3p/8) = v2 + 1 ~ 2
|
283 |
|
|
-- And to avoid the division of Gy/Gx, we can simply compare Gy against Gx multiplied by these constants
|
284 |
|
|
-------------------------------------------------------------------------------------------------------
|
285 |
|
|
|
286 |
|
|
--8
|
287 |
|
|
------------------------------------------------------------
|
288 |
|
|
edge_sobel_getdir2: process (clk)
|
289 |
|
|
begin
|
290 |
|
|
if rising_edge(clk) then
|
291 |
|
|
if fsync ='1' then
|
292 |
|
|
if YgradM(GRAD_WIDTH-1-16 downto 0) < ('0' & XgradM(GRAD_WIDTH-1-16 downto 1)) then Ddata_o <= "01"; --DIRECTION_HORIZONTAL
|
293 |
|
|
elsif ('0' & YgradM(GRAD_WIDTH-1-16 downto 1)) > XgradM(GRAD_WIDTH-1-16 downto 0) then Ddata_o <= "00"; -- DIRECTION_VERTICAL
|
294 |
|
|
else
|
295 |
|
|
if XgradS = YgradS then Ddata_o <= "10"; -- DIRECTION_45R
|
296 |
|
|
else Ddata_o <= "11"; -- DIRECTION_45F
|
297 |
|
|
end if;
|
298 |
|
|
end if;
|
299 |
|
|
--Ddata_o <= Ygrada(1 downto 0); ---------DEBUG-------------
|
300 |
|
|
end if;
|
301 |
|
|
end if;
|
302 |
|
|
end process edge_sobel_getdir2;
|
303 |
|
|
|
304 |
|
|
|
305 |
|
|
|
306 |
|
|
end Behavioral;
|