OpenCores
URL https://opencores.org/ocsvn/canny_edge_detector/canny_edge_detector/trunk

Subversion Repositories canny_edge_detector

[/] [canny_edge_detector/] [trunk/] [vhdl_src/] [filterV.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
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;

powered by: WebSVN 2.1.0

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