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/] [mac_module.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 mac_module is
14
        generic( CODE_BITS : integer := 10;
15
                                ROW : natural := 480;
16
                                ROW_BITS : natural := 9;
17
                                COL : natural := 640;
18
                                COL_BITS : natural := 10);
19
 
20
        port (
21
                code : in std_logic_vector(CODE_BITS-1 downto 0);
22
                pdata_in : in std_logic_vector(7 downto 0);                      -- input greyvalue (0...255)
23
                fsync_in : in std_logic;
24
                rsync_in : in std_logic;
25
                Reset : in std_logic;
26
                pclk : in std_logic;
27
                selectspace     : in std_logic;
28
                tablePreset : in std_logic;
29
      compuCode : in  STD_LOGIC_VECTOR (9 downto 0);
30
                mergeEnable : in  STD_LOGIC;
31
                compute : in  STD_LOGIC;
32
                divready_out : out std_logic;
33
                x_cog : out  std_logic_vector(16 downto 0);
34
                y_cog : out  std_logic_vector (16 downto 0)
35
        );
36
end mac_module;
37
 
38
 
39
architecture behavioral of mac_module is
40
 
41
signal compute_delay, divide_init, done_y, done_x: std_logic;                                   -- control signals for division
42
signal postx_numerator_stored,posty_numerator_stored,x_numerator_stored,y_numerator_stored,Sx_numerator,Tx_numerator,Sy_numerator,Ty_numerator: std_logic_vector(33 downto 0) :=  (others => '0');
43
signal Sdenominator,Tdenominator : std_logic_vector(18 downto 0) :=  (others => '0');     --denominator
44
signal Sx_numerator_stored,Tx_numerator_stored,Sy_numerator_stored,Ty_numerator_stored: std_logic_vector(33 downto 0) :=  (others => '0');
45
signal Sdenominator_stored,Tdenominator_stored,denominator_stored,postdenominator_stored: std_logic_vector(18 downto 0):=  (others => '0');
46
signal merge_denom_input,denominator_input : std_logic_vector(18 downto 0) := (others => '0');
47
signal y_numerator_input,merge_ynum_input : std_logic_vector(33 downto 0) := (others => '0');
48
signal x_numerator_input,merge_xnum_input : std_logic_vector(33 downto 0) := (others => '0');
49
signal runPreset : std_logic;
50
 
51
signal c_count, c_count_delay : std_logic_vector(COL_BITS-1 downto 0) := (others => '0');
52
signal r_count : std_logic_vector(ROW_BITS-1 downto 0) := (others => '0');
53
signal rsync_delayed : std_logic;
54
signal pdata_delayed : std_logic_vector(7 downto 0);
55
signal prod_x : std_logic_vector(17 downto 0);
56
signal prod_y : std_logic_vector(16 downto 0);
57
 
58
 
59
signal SaddrR,SaddrW : std_logic_vector(9 downto 0) := (others => '0');   --adress vectors in RAM S
60
signal TaddrR,TaddrW,macaddrw,mergeaddrw : std_logic_vector(9 downto 0) := (others => '0');       --adress vectors in RAM T
61
signal readaddr,readaddr_delayed, preaddr : std_logic_vector(9 downto 0) := "0000000000";
62
signal Twe,Swe,setwe,mergewe,prewe: std_logic := '0';    --control signals for RAM access
63
signal mergereadaddr, compuCodeDelayed : std_logic_vector(9 downto 0);
64
signal xNumeratorDelayed, yNumeratorDelayed : std_logic_vector(33 downto 0);
65
signal denominatorDelayed : std_logic_vector(18 downto 0);
66
signal mergeEnableDelayed : std_logic;
67
 
68
 
69
--type ppstatetype is (startup1,startup2,startup3,startup4);
70
--signal ppstate : ppstatetype;
71
 
72
 
73
 
74
 
75
begin
76
 
77
 
78
        s_div_y : entity work.serial_div2
79
--      generic map (   M_PP    => 31, N_PP     => 17, R_PP     => 0, S_PP => 0, COUNT_WIDTH_PP => 5,
80
--a                                     HELD_OUTPUT_PP => 1     )
81
        PORT MAP(
82
                clk_i           => pclk,
83
                clk_en_i        => '1',
84
                rst_i           => reset,
85
                divide_i        => divide_init,
86
                dividend_i      => posty_numerator_stored,
87
                divisor_i       => postdenominator_stored,
88
                done_o          => done_y,
89
                quotient_o      => y_cog
90
                );
91
 
92
        s_div_x : entity work.serial_div2
93
--      generic map (   M_PP    => 31, N_PP     => 17, R_PP     => 0, S_PP => 0, COUNT_WIDTH_PP => 5,
94
--a                                     HELD_OUTPUT_PP => 1     )
95
        PORT MAP(
96
                clk_i           => pclk,
97
                clk_en_i        => '1',
98
                rst_i           => reset,
99
                divide_i        => divide_init,
100
                dividend_i      => postx_numerator_stored,
101
                divisor_i       => postdenominator_stored,
102
                done_o          => done_x,
103
                quotient_o      => x_cog
104
                );
105
 
106
 
107
ram_xnumS : entity work.ram_num port map (
108
                          addrW => SaddrW,
109
           din => Sx_numerator,
110
           we => Swe,
111
           addrR => SaddrR,
112
           dout => Sx_numerator_stored,
113
           clk => pclk);
114
 
115
ram_xnumT : entity work.ram_num port map (
116
                          addrW => TaddrW,
117
           din => Tx_numerator,
118
           we => Twe,
119
           addrR => TaddrR,
120
           dout => Tx_numerator_stored,
121
           clk => pclk);
122
 
123
ram_ynumS : entity work.ram_num port map (
124
                          addrW => SaddrW,
125
           din => Sy_numerator,
126
           we => Swe,
127
           addrR => SaddrR,
128
           dout => Sy_numerator_stored,
129
           clk => pclk);
130
 
131
ram_ynumT : entity work.ram_num port map (
132
                          addrW => TaddrW,
133
           din => Ty_numerator,
134
           we => Twe,
135
           addrR => TaddrR,
136
           dout => Ty_numerator_stored,
137
           clk => pclk);
138
 
139
ram_denomS : entity work.ram_denom port map (
140
                          addrW => SaddrW,
141
           din => Sdenominator,
142
           we => Swe,
143
           addrR => SaddrR,
144
           dout => Sdenominator_stored,
145
           clk => pclk);
146
 
147
ram_denomT : entity work.ram_denom port map (
148
                          addrW => TaddrW,
149
           din => Tdenominator,
150
           we => Twe,
151
           addrR => TaddrR,
152
           dout => Tdenominator_stored,
153
           clk => pclk);
154
 
155
 
156
 
157
--=============== Multiplexer statements for selecting memories for interlieving of table accesses =======
158
--=============== selectSpace is the signal that controls interlieveing per frames                 =======
159
 
160
----------  Memory inputs -----------------------------
161
 
162
 
163
 
164
        Swe                                     <= Setwe when selectspace ='0' else
165
                                                                mergewe when runPreset = '0' else
166
                                                                prewe;
167
        Sdenominator            <= denominator_input when selectspace ='0' else
168
                                                                merge_denom_input when runPreset = '0' else
169
                                                                (others => '0');
170
        Sx_numerator            <= x_numerator_input when selectspace='0' else
171
                                                                merge_xnum_input  when runPreset = '0' else
172
                                                                (others => '0');
173
        Sy_numerator            <= y_numerator_input when selectspace='0' else
174
                                                                merge_ynum_input when runPreset = '0' else
175
                                                                (others => '0');
176
        SaddrR                                  <= readaddr when selectspace='0' else
177
                                                                mergereadaddr;
178
        Saddrw                          <= macaddrw when selectspace = '0' else
179
                                                                mergeaddrw when runPreset = '0' else
180
                                                                preaddr;
181
 
182
        Twe                                     <= Setwe when selectspace='1' else
183
                                                                mergewe when runPreset = '0' else
184
                                                                prewe;
185
        Tdenominator            <= denominator_input when selectspace='1' else
186
                                                                merge_denom_input when runPreset = '0' else
187
                                                                (others => '0');
188
        Tx_numerator            <= x_numerator_input when selectspace='1' else
189
                                                                merge_xnum_input when runPreset = '0' else
190
                                                                (others => '0');
191
        Ty_numerator            <= y_numerator_input when selectspace='1' else
192
                                                                merge_ynum_input when runPreset = '0' else
193
                                                                (others => '0');
194
        TaddrR                                  <= readaddr when selectspace='1' else
195
                                                                mergereadaddr;
196
        Taddrw                          <= macaddrw when selectspace = '1' else
197
                                                                mergeaddrw when runPreset = '0' else
198
                                                                preaddr;
199
 
200
 
201
-------------------------------------------------------
202
 
203
----------  Memory outputs ----------------------------
204
 
205
        x_numerator_stored      <=      Sx_numerator_stored when selectSpace = '0' else
206
                                                                        Tx_numerator_stored;
207
        y_numerator_stored      <=      Sy_numerator_stored when selectSpace = '0' else
208
                                                                        Ty_numerator_stored;
209
        denominator_stored      <=      Sdenominator_stored when selectSpace = '0' else
210
                                                                        Tdenominator_stored;
211
        postx_numerator_stored  <=      Sx_numerator_stored when selectSpace = '1' else
212
                                                                        Tx_numerator_stored;
213
        posty_numerator_stored  <=      Sy_numerator_stored when selectSpace = '1' else
214
                                                                        Ty_numerator_stored;
215
        postdenominator_stored  <=      Sdenominator_stored when selectSpace = '1' else
216
                                                                        Tdenominator_stored;
217
 
218
 
219
-------------------------------------------------------
220
-- Signal mappings
221
 
222
        mergereadaddr <= compuCode;
223
        mergeaddrw <= compuCodeDelayed;
224
        mergewe <= mergeEnableDelayed;
225
        merge_denom_input <= postdenominator_stored + denominatorDelayed;
226
        merge_xnum_input <= postx_numerator_stored + xNumeratorDelayed;
227
        merge_ynum_input <= posty_numerator_stored + yNumeratorDelayed;
228
 
229
 
230
        divready_out <= done_x and done_y;
231
        --divide_init <= compute or compute_delay;
232
        divide_init <= compute_delay;
233
 
234
 
235
mac: process(pclk,Reset)
236
 
237
begin
238
        if reset = '1' then
239
                SetWe <= '0';
240
                y_numerator_input <= (others=>'0');
241
                denominator_input <= (others=>'0');
242
                x_numerator_input <= (others=>'0');
243
                c_count <= (others=>'0');
244
                r_count <= (others=>'0');
245
        elsif fsync_in = '1' then
246
                c_count <= (others => '0');
247
                r_count <= (others => '0');
248
        elsif pclk'event and pclk = '1' then
249
 
250
                if rsync_in = '0' and rsync_delayed = '1' then
251
                        c_count <= (others => '0');
252
                        r_count <= r_count + 1;
253
                elsif rsync_in = '1' then
254
                        c_count <= c_count + 1;         --increment coloumn counter
255
                end if;
256
 
257
                if readaddr_delayed = macaddrw then
258
                        denominator_input <= denominator_input + pdata_delayed;
259
                        x_numerator_input <= x_numerator_input + prod_x;
260
                        y_numerator_input <= y_numerator_input + prod_y;
261
 
262
                else
263
                        denominator_input <= denominator_stored + pdata_delayed;
264
                        x_numerator_input <= x_numerator_stored + prod_x;
265
                        y_numerator_input <= y_numerator_stored + prod_y;
266
                end if;
267
 
268
                if readaddr_delayed = 0 then
269
                        denominator_input <= (others=>'0');
270
                        x_numerator_input <= (others=>'0');
271
                        y_numerator_input <= (others=>'0');
272
                        SetWe <= '0';
273
                else
274
                        SetWe <= '1';
275
                end if;
276
 
277
                prod_x <= pdata_in * c_count_delay;
278
                prod_y <= pdata_in * r_count;
279
 
280
                rsync_delayed <= rsync_in;
281
                readaddr_delayed <= readaddr;
282
                macaddrw <= readaddr_delayed;
283
                pdata_delayed <= pdata_in;
284
                c_count_delay <= c_count;
285
 
286
        end if; -- pclk'event and pclk = '1'
287
 
288
end process mac;
289
 
290
readaddr <= code;
291
 
292
 
293
merge: process (pclk, reset)
294
begin
295
        if reset = '1' then
296
 
297
                compuCodeDelayed <= (others=>'0');
298
 
299
        elsif pclk'event and pclk = '1' then
300
                compuCodeDelayed <= compuCode;
301
                xNumeratorDelayed <= postx_numerator_stored;
302
                yNumeratorDelayed <= posty_numerator_stored;
303
                denominatorDelayed <= postdenominator_stored;
304
                mergeEnableDelayed <= mergeEnable;
305
                compute_delay <= compute;
306
        end if;
307
 
308
end process merge;
309
 
310
preset : process (pclk, reset)
311
        begin
312
                if reset = '1' then
313
                        preaddr <= "0000000000";
314
                        runPreset <= '1';
315
 
316
                elsif pclk'event and pclk = '1' then
317
                        prewe <= '0';
318
                        if tablePreset = '1' then
319
                                preaddr <= (others => '0');
320
                                runPreset <= '1';
321
                                prewe <= '1';
322
                        elsif preaddr = "1111111111" then
323
                                preaddr <= "1111111111";
324
                                runPreset <= '0';
325
                        else
326
                                prewe <= '1';
327
                                preaddr <= preaddr +1;
328
                        end if;
329
                end if;
330
        end process preset;
331
 
332
 
333
end behavioral;
334
 

powered by: WebSVN 2.1.0

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