]> AND Private Git Repository - blast.git/blob - lib/implementations/rgb3sx8_to_ycbcr_3DSP_impl.xml
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
finalized analysis with clkconvert + started testbench gen.
[blast.git] / lib / implementations / rgb3sx8_to_ycbcr_3DSP_impl.xml
1 <!DOCTYPE rgb3sx8_to_ycbcr_3DSP>
2 <block_impl ref_name="rgb3sx8_to_ycbcr_3DSP.xml" ref_md5="">
3   <comments>
4     <author lastname="" mail="" firstname=""/>
5     <log creation="2018-05-02">
6     </log>
7     <notes>
8     </notes>    
9   </comments>
10   <libraries>
11     <library name="ieee">
12       <package name="std_logic_1164" use="all"/>
13       <package name="numeric_std" use="all"/>
14     </library>
15   </libraries>
16   <architecture comp_list="mult_accum">
17 component mult_accum
18 port (
19 @{clk} : in std_logic;
20 ce : in std_logic;
21 sclr : in std_logic;
22 bypass : in std_logic;
23 a : in std_logic_vector(17 downto 0);
24 b : in std_logic_vector(17 downto 0);
25 s : out std_logic_vector(47 downto 0)
26 );
27 end component;
28
29 -- Signals
30 signal do_sum_y : std_logic;
31 signal do_sum_y_dly : std_logic;
32 signal do_sum_cr : std_logic;
33 signal do_sum_cr_dly : std_logic;
34 signal do_sum_cb : std_logic;
35 signal do_sum_cb_dly : std_logic;
36 signal do_out_cr : std_logic;
37 signal do_out_cb : std_logic;
38 signal do_out_y : std_logic;
39 signal count_y : unsigned (2 downto 0);
40 signal count_cr : unsigned (2 downto 0);
41 signal count_cb : unsigned (2 downto 0);
42 signal y : signed(8 downto 0);
43 signal y_dly1 : signed(8 downto 0);
44 signal y_dly2 : signed(8 downto 0);
45 signal cb : signed(8 downto 0);
46 signal cb_dly1 : signed(8 downto 0);
47 signal cr : signed(8 downto 0);
48 signal cst_y_r : signed(17 downto 0);
49 signal cst_y_g : signed(17 downto 0);
50 signal cst_y_b : signed(17 downto 0);
51 signal cst_cb_r : signed(17 downto 0);
52 signal cst_cb_g : signed(17 downto 0);
53 signal cst_cb_b : signed(17 downto 0);
54 signal cst_cr_r : signed(17 downto 0);
55 signal cst_cr_g : signed(17 downto 0);
56 signal cst_cr_b : signed(17 downto 0);
57
58 signal bypass_y : std_logic;
59 signal a_y : std_logic_vector(17 downto 0);
60 signal b_y : std_logic_vector(17 downto 0);
61 signal s_y : std_logic_vector(47 downto 0);
62 signal bypass_cr : std_logic;
63 signal a_cr : std_logic_vector(17 downto 0);
64 signal b_cr : std_logic_vector(17 downto 0);
65 signal s_cr : std_logic_vector(47 downto 0);
66 signal bypass_cb : std_logic;
67 signal a_cb : std_logic_vector(17 downto 0);
68 signal b_cb : std_logic_vector(17 downto 0);
69 signal s_cb : std_logic_vector(47 downto 0);
70
71 begin
72
73 y_multiplier : mult_accum
74 port map (
75 @{clk} => @{clk},
76 ce => '1',
77 sclr => '0',
78 bypass => bypass_y,
79 a => a_y,
80 b => b_y,
81 s => s_y
82 );
83 cr_multiplier : mult_accum
84 port map (
85 @{clk} => @{clk},
86 ce => '1',
87 sclr => '0',
88 bypass => bypass_cr,
89 a => a_cr,
90 b => b_cr,
91 s => s_cr
92 );
93 cb_multiplier : mult_accum
94 port map (
95 @{clk} => @{clk},
96 ce => '1',
97 sclr => '0',
98 bypass => bypass_cb,
99 a => a_cb,
100 b => b_cb,
101 s => s_cb
102 );
103
104
105 cst_y_r &lt;= to_signed(33658, 18);
106 cst_y_g &lt;= to_signed(66077, 18);
107 cst_y_b &lt;= to_signed(12833, 18);
108 cst_cb_r &lt;= to_signed(-19428, 18);
109 cst_cb_g &lt;= to_signed(-38141, 18);
110 cst_cb_b &lt;= to_signed(57569, 18);
111 cst_cr_r &lt;= to_signed(57569, 18);
112 cst_cr_g &lt;= to_signed(-48207, 18);
113 cst_cr_b &lt;= to_signed(-9362, 18);
114
115 multy_process : process (@{clk}, @{reset})
116 begin
117 if @{reset} = '1' then
118 a_y &lt;= (others => '0');
119 b_y &lt;= (others => '0');
120
121 count_y &lt;= to_unsigned(0, 3);
122 do_sum_y &lt;= '0';
123
124 elsif rising_edge(@{clk}) then
125
126 do_sum_y &lt;= '0';
127
128 a_y &lt;= (others => '0');
129 b_y &lt;= (others => '0');
130
131 if @{rgb_in_enb} = '1' then
132
133 a_y &lt;= "0000000000" &amp; @{rgb_in};
134
135 if count_y = 0 then
136 b_y &lt;= std_logic_vector(cst_y_b);
137
138 count_y &lt;= to_unsigned(1, 3);
139
140 elsif count_y = 1 then
141 b_y &lt;= std_logic_vector(cst_y_g);
142 count_y &lt;= to_unsigned(2, 3);
143
144 elsif count_y = 2 then
145 b_y &lt;= std_logic_vector(cst_y_r);
146 count_y &lt;= to_unsigned(0, 3);
147 do_sum_y &lt;= '1';
148 end if;
149 end if;
150 end if;
151 end process multy_process;
152
153 sumy_process : process (@{clk}, @{reset})
154 begin
155 if @{reset} = '1' then
156 bypass_y &lt;= '1';
157 do_sum_y_dly &lt;= '0';
158 y &lt;= to_signed(0, 9);
159 y_dly1 &lt;= to_signed(0, 9);
160 y_dly2 &lt;= to_signed(0, 9);
161
162 elsif rising_edge(@{clk}) then
163 bypass_y &lt;= do_sum_y;
164 do_sum_y_dly &lt;= do_sum_y;
165 y_dly1 &lt;= y;
166 y_dly2 &lt;= y_dly1;
167
168 if do_sum_y_dly = '1' then
169 y &lt;= to_signed(16, 9) + signed(s_y(25 downto 17));
170 end if;
171 end if;
172
173 end process sumy_process;
174
175 multcb_process : process (@{clk}, @{reset})
176 begin
177 if @{reset} = '1' then
178 a_cb &lt;= (others => '0');
179 b_cb &lt;= (others => '0');
180
181 count_cb &lt;= to_unsigned(0, 3);
182 do_sum_cb &lt;= '0';
183
184 elsif rising_edge(@{clk}) then
185
186 do_sum_cb &lt;= '0';
187
188 a_cb &lt;= (others => '0');
189 b_cb &lt;= (others => '0');
190
191 if @{rgb_in_enb} = '1' then
192
193 a_cb &lt;= "0000000000" &amp; @{rgb_in};
194
195 if count_cb = 0 then
196 b_cb &lt;= std_logic_vector(cst_cb_b);
197
198 count_cb &lt;= to_unsigned(1, 3);
199
200 elsif count_cb = 1 then
201 b_cb &lt;= std_logic_vector(cst_cb_g);
202 count_cb &lt;= to_unsigned(2, 3);
203
204 elsif count_cb = 2 then
205 b_cb &lt;= std_logic_vector(cst_cb_r);
206 count_cb &lt;= to_unsigned(0, 3);
207 do_sum_cb &lt;= '1';
208 end if;
209 end if;
210 end if;
211 end process multcb_process;
212
213 sumcb_process : process (@{clk}, @{reset})
214 begin
215 if @{reset} = '1' then
216 bypass_cb &lt;= '1';
217 do_sum_cb_dly &lt;= '0';
218 cb &lt;= to_signed(0, 9);
219 cb_dly1 &lt;= to_signed(0, 9);
220 elsif rising_edge(@{clk}) then
221 bypass_cb &lt;= do_sum_cb;
222 do_sum_cb_dly &lt;= do_sum_cb;
223 cb_dly1 &lt;= cb;
224
225 if do_sum_cb_dly = '1' then
226 cb &lt;= to_signed(128, 9) + signed(s_cb(25 downto 17));
227 end if;
228 end if;
229
230 end process sumcb_process;
231
232 multcr_process : process (@{clk}, @{reset})
233 begin
234 if @{reset} = '1' then
235 a_cr &lt;= (others => '0');
236 b_cr &lt;= (others => '0');
237
238 count_cr &lt;= to_unsigned(0, 3);
239 do_sum_cr &lt;= '0';
240
241 elsif rising_edge(@{clk}) then
242
243 do_sum_cr &lt;= '0';
244
245 a_cr &lt;= (others => '0');
246 b_cr &lt;= (others => '0');
247
248 if @{rgb_in_enb} = '1' then
249
250 a_cr &lt;= "0000000000" &amp; @{rgb_in};
251
252 if count_cr = 0 then
253 b_cr &lt;= std_logic_vector(cst_cr_b);
254
255 count_cr &lt;= to_unsigned(1, 3);
256
257 elsif count_cr = 1 then
258 b_cr &lt;= std_logic_vector(cst_cr_g);
259 count_cr &lt;= to_unsigned(2, 3);
260
261 elsif count_cr = 2 then
262 b_cr &lt;= std_logic_vector(cst_cr_r);
263 count_cr &lt;= to_unsigned(0, 3);
264 do_sum_cr &lt;= '1';
265 end if;
266 end if;
267 end if;
268 end process multcr_process;
269
270 sumcr_process : process (@{clk}, @{reset})
271 begin
272 if @{reset} = '1' then
273 bypass_cr &lt;= '1';
274 do_sum_cr_dly &lt;= '0';
275 cr &lt;= to_signed(0, 9);
276 do_out_cr &lt;= '0';
277
278 elsif rising_edge(@{clk}) then
279 bypass_cr &lt;= do_sum_cr;
280 do_sum_cr_dly &lt;= do_sum_cr;
281 do_out_cr &lt;= '0';
282
283 if do_sum_cr_dly = '1' then
284 do_out_cr &lt;= '1';
285 cr &lt;= to_signed(128, 9) + signed(s_cr(25 downto 17));
286 end if;
287 end if;
288 end process sumcr_process;
289
290 out_process : process (@{clk}, @{reset})
291 begin
292 if @{reset} = '1' then
293 do_out_y &lt;= '0';
294 do_out_cb &lt;= '0';
295 elsif rising_edge(@{clk}) then
296 do_out_cb &lt;= do_out_cr;
297 do_out_y &lt;= do_out_cb;
298 end if;
299 end process out_process;
300
301
302 @{ycbcr_out} &lt;= std_logic_vector(y_dly2(7 downto 0)) when do_out_y = '1' else
303 std_logic_vector(cb_dly1(7 downto 0)) when do_out_cb = '1' else
304 std_logic_vector(cr(7 downto 0)) when do_out_cr = '1' else
305 (others => '0');
306 @{ycbcr_out_enb} &lt;= do_out_y or do_out_cb or do_out_cr;
307 </architecture>
308   <patterns>
309     <delta value="3"/>
310     <consumption>
311       <input pattern="111" name="rgb_in_enb"/>
312     </consumption>
313     <production counter="3,3,3">
314       <output pattern="00000111" name="ycbcr_out_enb"/>
315     </production>
316   </patterns>
317 </block_impl>