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

Subversion Repositories image_component_labeling_and_feature_extraction

[/] [image_component_labeling_and_feature_extraction/] [trunk/] [label8AndFeatures.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 malikpearl
library ieee;
2
use ieee.std_logic_1164.all;
3
use IEEE.STD_LOGIC_UNSIGNED.ALL;
4
use ieee.numeric_std.all;
5
use ieee.std_logic_arith.all;
6
 
7
 
8
---- Uncomment the following library declaration if instantiating
9
---- any Xilinx primitives in this code.
10
library UNISIM;
11
use UNISIM.VComponents.all;
12
 
13
entity label8AndFeatures is
14
        generic( CODE_BITS : integer := 10;
15
                                row : natural := 480;
16
                                col : natural := 640);
17
 
18
        port (
19
                ip9 : in std_logic_vector(CODE_BITS-1 downto 0);
20
                ip8 : in std_logic_vector(CODE_BITS-1 downto 0);
21
                ip7 : in std_logic_vector(CODE_BITS-1 downto 0);
22
                ip6 : in std_logic_vector(CODE_BITS-1 downto 0);
23
                ibin : in std_logic;
24
                pdata_in : in std_logic_vector(7 downto 0);
25
                fsync_in : in std_logic;
26
                fsync_out : out std_logic;
27
                pdata_o : out std_logic_vector(CODE_BITS-1 downto 0) :=  (others => '0');
28
                rsync_in : in std_logic;
29
                rsync_out : out std_logic;
30
                Reset : in std_logic;
31
                pclk : in std_logic;
32
                featureDataStrobe       : out std_logic;
33
                acknowledge : in std_logic;
34
                cntObjects : out std_logic_vector(9 downto 0);
35
                x_cog : out  std_logic_vector(16 downto 0);
36
                y_cog : out  std_logic_vector (16 downto 0)
37
        );
38
end label8AndFeatures;
39
 
40
 
41
architecture struct of label8AndFeatures is
42
 
43
 
44
signal a,b,dout,indexMax,equalcnt : std_logic_vector(9 downto 0):=  (others => '0');
45
signal readAddr: std_logic_vector(9 downto 0);
46
signal tableReady,tablePreset,we,computeDone : std_logic;
47
signal hit : std_logic_vector(CODE_BITS-1 downto 0);
48
signal selectspace : std_logic := '0';
49
signal pdata_osig : std_logic_vector(CODE_BITS-1 downto 0) :=  (others => '0');
50
signal pdata_delayed : std_logic_vector(7 downto 0);
51
signal eindex : std_logic_vector(CODE_BITS-1 downto 0);
52
signal compuCode : std_logic_vector(9 downto 0);
53
signal mergeEnable, compute : std_logic;
54
signal refa,refb:std_logic_vector(9 downto 0);
55
subtype col_range is natural range 0 to col ;
56
subtype row_range is natural range 0 to row + 1;
57
 
58
begin
59
 
60
        equtbl : entity work.equivalenceTable Port map
61
                        ( a                             => a,
62
           b                            => b,
63
                     c                          => refa,--contents of memory locations are set for merging not just labels      
64
           d                            => refb,
65
                          we                            => we,
66
                          readAddr              => readAddr,
67
           dout                         => dout,
68
                          equalcnt              => equalcnt,
69
           fsync                        => fsync_in,
70
           tableReady   => tableReady,
71
                          tablePreset   => tablePreset,
72
                          space                 => selectspace,
73
                          reset                 => Reset,
74
           clk                  => pclk,
75
                          SetdoutrefA     => refa,
76
                          SetdoutrefB     => refb
77
                          );
78
 
79
 
80
 
81
        MAC : entity work.mac_module
82
               generic map( ROW=>row, COL=>col,CODE_BITS=>CODE_BITS)
83
               Port Map
84
                        (       code => pdata_osig,
85
                                fsync_in => fsync_in,
86
                                rsync_in => rsync_in,
87
                                Reset => reset,
88
                                pclk => pclk,
89
                                pdata_in => pdata_delayed,
90
                           tablePreset  => tablePreset,
91
                                divready_out => computeDone,
92
                                selectspace     => selectspace,
93
                                y_cog => y_cog,
94
                                compuCode => compuCode,
95
                                mergeEnable => mergeEnable,
96
                                compute => compute,
97
                                x_cog => x_cog
98
                        );
99
 
100
        Sequencer : entity work.compuSequencer Port map
101
                        ( clk => pclk,
102
           reset => fsync_in,
103
                          tableReady => tableReady,
104
                          computeDone => computeDone,
105
                          featureDataStrobe => featureDataStrobe,
106
                          acknowledge => acknowledge,
107
                          indexMax => indexMax,
108
           eqData => dout,
109
           eqAddress => readAddr,
110
           compuCode => compuCode,
111
                          cntObjects => cntObjects,
112
           mergeEnable => mergeEnable,
113
           compute => compute,
114
           tablePreset => tablePreset
115
                        );
116
                                                a <= (others=>'0') when reset= '1' else --check all the conditions for labelling
117
                                                    ip6 when (ibin = '1' and ip7 /= 0 and ip6 /= 0) else
118
                                                    ip6 when (ibin = '1' and ip8 /= 0 and ip6 /= 0) else
119
                                                    ip6 when (ibin = '1' and ip9 /= 0 and ip6 /= 0) else
120
                                                    ip8 when (ibin = '1' and ip8 /= 0 and ip9 /= 0) else
121
                                                    ip7 when (ibin = '1' and ip7 /= 0 and ip9 /= 0) else
122
                                                         ip7 when (ibin = '1' and ip7 /= 0 and ip8 /= 0) else
123
                                                         ip6 when (ibin = '1' and ip7 /= 0 and ip6 /= 0) else
124
                                                         ip8 when (ibin = '1' and ip8 /= 0) else
125
                                                         ip6 when (ibin = '1' and ip6 /= 0)else
126
                                                         ip9 when (ibin=  '1' and ip9 /= 0) else
127
                                                         ip7 when (ibin=  '1' and ip7 /= 0) else
128
                                                         eindex when ibin='1' else
129
                                                         (others=> '0');
130
 
131
                                                 b <=(others=>'0') when reset= '1' else
132
                                                    ip7 when (ibin = '1' and ip7 /= 0 and ip6 /= 0) else
133
                                                    ip8 when (ibin = '1' and ip8 /= 0 and ip6 /= 0) else
134
                                                    ip9 when (ibin = '1' and ip9 /= 0 and ip6 /= 0) else
135
                                                    ip9 when (ibin = '1' and ip8 /= 0 and ip9 /= 0) else
136
                                                    ip9 when (ibin = '1' and ip7 /= 0 and ip9 /= 0) else
137
                                                         ip8 when (ibin = '1' and ip7 /= 0 and ip8 /= 0) else
138
                                                         ip7 when (ibin = '1' and ip7 /= 0 and ip6 /= 0) else
139
                                                         ip8 when (ibin = '1' and ip8 /= 0) else
140
                                                         ip6 when (ibin = '1' and ip6 /= 0) else
141
                                                         ip9 when (ibin=  '1' and ip9 /= 0) else
142
                                                         ip7 when (ibin=  '1' and ip7 /= 0) else
143
                                                         eindex when ibin='1' else
144
                                                         (others =>'0');
145
                                                 --eindex <= eindex+1 when (ibin = '1' and ip6 = 0 and ip7 = 0 and ip8=0 and ip9=0) ;
146
 
147
 
148
--                                               pdata_o <= refa when (refa < refb) and ibin='1'   else
149
--                              refb when ibin ='1' else
150
--                                                          (others=>'0');
151
                                                    we <=   '1' when (ip6 /= 0 or ip7 /= 0 or ip8/=0 or ip9/=0) else
152
                                                                 '0';
153
 
154
        label8: process(pclk,Reset)
155
        -- This process performs 8-connectivity labeling of the binary input video stream on input port ibin
156
        -- Only the first pass of the labeling process is done. This means that the information stored in the 
157
        -- table of equvivalences must be read in order to identify all pixels belonging 
158
        -- to one single image component. The equvivalences are stored in block-RAMs through the ports of 
159
        -- equtbl : entity work.equivalenceTable. This entity actually contains two tables of equvivalences.
160
        -- One is written to during the labelling process and the other can be used for post processing when
161
        -- image component features are calculated.
162
 
163
        begin
164
             if Reset = '1' then
165
                        eindex <= conv_std_logic_vector(1,CODE_BITS);
166
                        --a <= (others=>'0');
167
                        --b <= (others=>'0');
168
                        hit <= (others=>'0');
169
                        --we  <= '0';
170
                elsif pclk'event and pclk = '1' then
171
 
172
                        --we  <= '0';
173
                        if (ibin = '1' and ip6 = 0 and ip7 = 0 and ip8=0 and ip9=0) then
174
                        eindex <= eindex+1 ;
175
                        end if;
176
                        if refa < refb and ibin='1' then
177
                           pdata_osig <= refa;
178
                                elsif ibin='1' then
179
                                pdata_osig <= refb;
180
                                else
181
                                pdata_osig <= (others => '0');
182
                        end if;
183
                        if fsync_in = '1' then
184
                           indexMax <= eindex;
185
                                eindex <= conv_std_logic_vector(1,CODE_BITS);
186
                                hit <= (others=>'0');
187
 
188
                 end if;
189
                                fsync_out <= fsync_in;
190
                             rsync_out <= rsync_in;
191
                                  pdata_delayed <= pdata_in;
192
                                  end if;--pclk'event
193
        end process label8;
194
 
195
        pdata_o <= pdata_osig;
196
 
197
end struct;

powered by: WebSVN 2.1.0

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