]> 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
moved generate vhdl methods
[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     <date creation="2018-01-10"/>
6     <related_files list=""/>
7     <description>fez</description>
8     <notes>fez</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>
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 : std_logic;
37 signal do_out_cr : std_logic;
38 signal do_out_cb : std_logic;
39 signal do_out_y : std_logic;
40 signal count_y : unsigned (2 downto 0);
41 signal count_cr : unsigned (2 downto 0);
42 signal count_cb : unsigned (2 downto 0);
43 signal y : signed(8 downto 0);
44 signal y_dly1 : signed(8 downto 0);
45 signal y_dly2 : signed(8 downto 0);
46 signal cb : signed(8 downto 0);
47 signal cb_dly1 : signed(8 downto 0);
48 signal cr : signed(8 downto 0);
49 signal cst_y_r : signed(17 downto 0);
50 signal cst_y_g : signed(17 downto 0);
51 signal cst_y_b : signed(17 downto 0);
52 signal cst_cb_r : signed(17 downto 0);
53 signal cst_cb_g : signed(17 downto 0);
54 signal cst_cb_b : signed(17 downto 0);
55 signal cst_cr_r : signed(17 downto 0);
56 signal cst_cr_g : signed(17 downto 0);
57 signal cst_cr_b : signed(17 downto 0);
58
59 signal bypass_y : std_logic;
60 signal a_y : std_logic_vector(17 downto 0);
61 signal b_y : std_logic_vector(17 downto 0);
62 signal s_y : std_logic_vector(47 downto 0);
63 signal bypass_cr : std_logic;
64 signal a_cr : std_logic_vector(17 downto 0);
65 signal b_cr : std_logic_vector(17 downto 0);
66 signal s_cr : std_logic_vector(47 downto 0);
67 signal bypass_cb : std_logic;
68 signal a_cb : std_logic_vector(17 downto 0);
69 signal b_cb : std_logic_vector(17 downto 0);
70 signal s_cb : std_logic_vector(47 downto 0);
71
72 signal compo_out : std_logic_vector(7 downto 0);
73
74 begin
75
76 y_multiplier : mult_accum
77 port map (
78 @{clk} => @{clk},
79 ce => '1',
80 sclr => '0',
81 bypass => bypass_y,
82 a => a_y,
83 b => b_y,
84 s => s_y
85 );
86 cr_multiplier : mult_accum
87 port map (
88 @{clk} => @{clk},
89 ce => '1',
90 sclr => '0',
91 bypass => bypass_cr,
92 a => a_cr,
93 b => b_cr,
94 s => s_cr
95 );
96 cb_multiplier : mult_accum
97 port map (
98 @{clk} => @{clk},
99 ce => '1',
100 sclr => '0',
101 bypass => bypass_cb,
102 a => a_cb,
103 b => b_cb,
104 s => s_cb
105 );
106
107
108 cst_y_r &lt;= to_signed(33658, 18);
109 cst_y_g &lt;= to_signed(66077, 18);
110 cst_y_b &lt;= to_signed(12833, 18);
111 cst_cb_r &lt;= to_signed(-19428, 18);
112 cst_cb_g &lt;= to_signed(-38141, 18);
113 cst_cb_b &lt;= to_signed(57569, 18);
114 cst_cr_r &lt;= to_signed(57569, 18);
115 cst_cr_g &lt;= to_signed(-48207, 18);
116 cst_cr_b &lt;= to_signed(-9362, 18);
117
118 multy_process : process (@{clk}, @{reset})
119 begin
120 if @{reset} = '1' then
121 a_y &lt;= (others => '0');
122 b_y &lt;= (others => '0');
123
124 count_y &lt;= to_unsigned(0, 3);
125 do_sum_y &lt;= '0';
126
127 elsif rising_edge(@{clk}) then
128
129 do_sum_y &lt;= '0';
130
131 a_y &lt;= (others => '0');
132 b_y &lt;= (others => '0');
133
134 if @{rgb_in_enb} = '1' then
135
136 a_y &lt;= "0000000000" &amp; @{rgb_in};
137
138 if count_y = 0 then
139 b_y &lt;= std_logic_vector(cst_y_b);
140
141 count_y &lt;= to_unsigned(1, 3);
142
143 elsif count_y = 1 then
144 b_y &lt;= std_logic_vector(cst_y_g);
145 count_y &lt;= to_unsigned(2, 3);
146
147 elsif count_y = 2 then
148 b_y &lt;= std_logic_vector(cst_y_r);
149 count_y &lt;= to_unsigned(0, 3);
150 do_sum_y &lt;= '1';
151 end if;
152 end if;
153 end if;
154 end process multy_process;
155
156 sumy_process : process (@{clk}, @{reset})
157 begin
158 if @{reset} = '1' then
159 bypass_y &lt;= '0';
160 y &lt;= to_signed(0, 9);
161 y_dly1 &lt;= to_signed(0, 9);
162 y_dly2 &lt;= to_signed(0, 9);
163
164 elsif rising_edge(@{clk}) then
165 bypass_y &lt;= do_sum_y;
166 do_sum_y_dly &lt;= do_sum_y;
167 y_dly1 &lt;= y;
168 y_dly2 &lt;= y_dly1;
169
170 if do_sum_y_dly = '1' then
171 y &lt;= to_signed(16, 9) + signed(s_y(25 downto 17));
172 end if;
173 end if;
174
175 end process sumy_process;
176
177 multcb_process : process (@{clk}, @{reset})
178 begin
179 if @{reset} = '1' then
180 a_cb &lt;= (others => '0');
181 b_cb &lt;= (others => '0');
182
183 count_cb &lt;= to_unsigned(0, 3);
184 do_sum_cb &lt;= '0';
185
186 elsif rising_edge(@{clk}) then
187
188 do_sum_cb &lt;= '0';
189
190 a_cb &lt;= (others => '0');
191 b_cb &lt;= (others => '0');
192
193 if @{rgb_in_enb} = '1' then
194
195 a_cb &lt;= "0000000000" &amp; @{rgb_in};
196
197 if count_cb = 0 then
198 b_cb &lt;= std_logic_vector(cst_cb_b);
199
200 count_cb &lt;= to_unsigned(1, 3);
201
202 elsif count_cb = 1 then
203 b_cb &lt;= std_logic_vector(cst_cb_g);
204 count_cb &lt;= to_unsigned(2, 3);
205
206 elsif count_cb = 2 then
207 b_cb &lt;= std_logic_vector(cst_cb_r);
208 count_cb &lt;= to_unsigned(0, 3);
209 do_sum_cb &lt;= '1';
210 end if;
211 end if;
212 end if;
213 end process multcb_process;
214
215 sumcb_process : process (@{clk}, @{reset})
216 begin
217 if @{reset} = '1' then
218 bypass_cb &lt;= '0';
219 cb &lt;= to_signed(0, 9);
220 cb_dly1 &lt;= to_signed(0, 9);
221 elsif rising_edge(@{clk}) then
222 bypass_cb &lt;= do_sum_cb;
223 do_sum_cb_dly &lt;= do_sum_cb;
224 cb_dly1 &lt;= cb;
225
226 if do_sum_cb_dly = '1' then
227 cb &lt;= to_signed(128, 9) + signed(s_cb(25 downto 17));
228 end if;
229 end if;
230
231 end process sumcb_process;
232
233 multcr_process : process (@{clk}, @{reset})
234 begin
235 if @{reset} = '1' then
236 a_cr &lt;= (others => '0');
237 b_cr &lt;= (others => '0');
238
239 count_cr &lt;= to_unsigned(0, 3);
240 do_sum_cr &lt;= '0';
241
242 elsif rising_edge(@{clk}) then
243
244 do_sum_cr &lt;= '0';
245
246 a_cr &lt;= (others => '0');
247 b_cr &lt;= (others => '0');
248
249 if @{rgb_in_enb} = '1' then
250
251 a_cr &lt;= "0000000000" &amp; @{rgb_in};
252
253 if count_cr = 0 then
254 b_cr &lt;= std_logic_vector(cst_cr_b);
255
256 count_cr &lt;= to_unsigned(1, 3);
257
258 elsif count_cr = 1 then
259 b_cr &lt;= std_logic_vector(cst_cr_g);
260 count_cr &lt;= to_unsigned(2, 3);
261
262 elsif count_cr = 2 then
263 b_cr &lt;= std_logic_vector(cst_cr_r);
264 count_cr &lt;= to_unsigned(0, 3);
265 do_sum_cr &lt;= '1';
266 end if;
267 end if;
268 end if;
269 end process multcr_process;
270
271 sumcr_process : process (@{clk}, @{reset})
272 begin
273 if @{reset} = '1' then
274 bypass_cr &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>