5 use ieee.std_logic_1164.
all;
6 use ieee.numeric_std.
all;
10 entity ReconRefFrames
is
12 Reset_n
: in std_logic;
14 in_request
: out std_logic;
15 in_valid
: in std_logic;
16 in_data
: in signed
(31 downto 0);
18 out_requested
: in std_logic;
19 out_valid
: out std_logic;
20 out_data
: out signed
(31 downto 0)
22 end entity ReconRefFrames
;
24 architecture a_ReconRefFrames
of ReconRefFrames
is
28 Reset_n
: in std_logic;
29 Enable
: in std_logic;
31 in_request
: out std_logic;
32 in_valid
: in std_logic;
33 in_data
: in signed
(31 downto 0);
35 in_sem_request
: out std_logic;
36 in_sem_valid
: in std_logic;
37 in_sem_addr
: out unsigned
(19 downto 0);
38 in_sem_data
: in signed
(31 downto 0);
40 out_sem_requested
: in std_logic;
41 out_sem_valid
: out std_logic;
42 out_sem_addr
: out unsigned
(19 downto 0);
43 out_sem_data
: out signed
(31 downto 0);
45 out_done
: out std_logic;
46 out_eb_done
: out std_logic);
52 Reset_n
: in std_logic;
53 Enable
: in std_logic;
55 in_request
: out std_logic;
56 in_valid
: in std_logic;
57 in_data
: in signed
(31 downto 0);
59 in_sem_request
: out std_logic;
60 in_sem_valid
: in std_logic;
61 in_sem_addr
: out unsigned
(19 downto 0);
62 in_sem_data
: in signed
(31 downto 0);
64 out_sem_requested
: in std_logic;
65 out_sem_valid
: out std_logic;
66 out_sem_addr
: out unsigned
(19 downto 0);
67 out_sem_data
: out signed
(31 downto 0);
69 out_done
: out std_logic
75 Reset_n
: in std_logic;
76 Enable
: in std_logic;
78 in_request
: out std_logic;
79 in_valid
: in std_logic;
80 in_data
: in signed
(31 downto 0);
82 in_sem_request
: out std_logic;
83 in_sem_valid
: in std_logic;
84 in_sem_addr
: out unsigned
(19 downto 0);
85 in_sem_data
: in signed
(31 downto 0);
87 out_sem_requested
: in std_logic;
88 out_sem_valid
: out std_logic;
89 out_sem_addr
: out unsigned
(19 downto 0);
90 out_sem_data
: out signed
(31 downto 0);
92 out_done
: out std_logic
99 Reset_n
: in std_logic;
100 Enable
: in std_logic;
102 in_request
: out std_logic;
103 in_valid
: in std_logic;
104 in_data
: in signed
(31 downto 0);
106 in_sem_request
: out std_logic;
107 in_sem_valid
: in std_logic;
108 in_sem_addr
: out unsigned
(19 downto 0);
109 in_sem_data
: in signed
(31 downto 0);
111 out_sem_requested
: in std_logic;
112 out_sem_valid
: out std_logic;
113 out_sem_addr
: out unsigned
(19 downto 0);
114 out_sem_data
: out signed
(31 downto 0);
116 out_done
: out std_logic
122 Reset_n
: in std_logic;
124 in_request
: out std_logic;
125 in_valid
: in std_logic;
126 in_addr
: in unsigned
(19 downto 0);
127 in_data
: in signed
(31 downto 0);
130 out_requested
: in std_logic;
131 out_valid
: out std_logic;
132 out_addr
: in unsigned
(19 downto 0);
133 out_data
: out signed
(31 downto 0)
137 constant LG_MAX_SIZE
: natural
:= 10;
138 constant MEM_ADDR_WIDTH
: natural
:= 20;
139 -------------------------------------------------------------------------------
141 -------------------------------------------------------------------------------
142 signal in_DtBuf_request
: std_logic;
143 signal in_DtBuf_valid
: std_logic;
144 signal in_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
145 signal in_DtBuf_data
: signed
(31 downto 0);
147 signal out_DtBuf_request
: std_logic;
148 signal out_DtBuf_valid
: std_logic;
149 signal out_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
150 signal out_DtBuf_data
: signed
(31 downto 0);
152 -------------------------------------------------------------------------------
153 -- ReconFrames' signals
154 -------------------------------------------------------------------------------
155 signal out_rf_request
: std_logic;
156 signal out_rf_valid
: std_logic := '0';
157 signal out_rf_data
: signed
(31 downto 0);
159 signal in_rf_DtBuf_request
: std_logic;
160 signal in_rf_DtBuf_valid
: std_logic;
161 signal in_rf_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
162 signal in_rf_DtBuf_data
: signed
(31 downto 0);
164 signal out_rf_DtBuf_request
: std_logic;
165 signal out_rf_DtBuf_valid
: std_logic;
166 signal out_rf_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
167 signal out_rf_DtBuf_data
: signed
(31 downto 0);
169 signal rf_done
: std_logic;
170 signal rf_eb_done
: std_logic;
171 signal rf_enable
: std_logic;
173 -------------------------------------------------------------------------------
174 -- CopyRecon's signals
175 -------------------------------------------------------------------------------
176 signal out_cr_request
: std_logic;
177 signal out_cr_valid
: std_logic := '0';
178 signal out_cr_data
: signed
(31 downto 0);
180 signal in_cr_DtBuf_request
: std_logic;
181 signal in_cr_DtBuf_valid
: std_logic;
182 signal in_cr_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
183 signal in_cr_DtBuf_data
: signed
(31 downto 0);
185 signal out_cr_DtBuf_request
: std_logic;
186 signal out_cr_DtBuf_valid
: std_logic;
187 signal out_cr_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
188 signal out_cr_DtBuf_data
: signed
(31 downto 0);
190 signal cr_done
: std_logic;
191 signal cr_enable
: std_logic;
193 -------------------------------------------------------------------------------
194 -- LoopFilter's signals
195 -------------------------------------------------------------------------------
196 signal out_lf_request
: std_logic;
197 signal out_lf_valid
: std_logic := '0';
198 signal out_lf_data
: signed
(31 downto 0);
200 signal in_lf_DtBuf_request
: std_logic;
201 signal in_lf_DtBuf_valid
: std_logic;
202 signal in_lf_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
203 signal in_lf_DtBuf_data
: signed
(31 downto 0);
205 signal out_lf_DtBuf_request
: std_logic;
206 signal out_lf_DtBuf_valid
: std_logic;
207 signal out_lf_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
208 signal out_lf_DtBuf_data
: signed
(31 downto 0);
210 signal lf_done
: std_logic;
211 signal lf_enable
: std_logic;
213 -------------------------------------------------------------------------------
214 -- UpdateUMV's signals
215 -------------------------------------------------------------------------------
216 signal out_uu_request
: std_logic;
217 signal out_uu_valid
: std_logic := '0';
218 signal out_uu_data
: signed
(31 downto 0);
220 signal in_uu_DtBuf_request
: std_logic;
221 signal in_uu_DtBuf_valid
: std_logic;
222 signal in_uu_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
223 signal in_uu_DtBuf_data
: signed
(31 downto 0);
225 signal out_uu_DtBuf_request
: std_logic;
226 signal out_uu_DtBuf_valid
: std_logic;
227 signal out_uu_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
228 signal out_uu_DtBuf_data
: signed
(31 downto 0);
230 signal uu_done
: std_logic;
231 signal uu_enable
: std_logic;
233 -------------------------------------------------------------------------------
234 signal in_rr_DtBuf_request
: std_logic;
235 signal in_rr_DtBuf_valid
: std_logic;
236 signal in_rr_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
238 signal out_rr_DtBuf_request
: std_logic;
239 signal out_rr_DtBuf_valid
: std_logic;
240 signal out_rr_DtBuf_addr
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
241 signal out_rr_DtBuf_data
: signed
(31 downto 0);
244 signal FrameSize
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
245 signal GoldenFrameOfs
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
246 signal ThisFrameReconOfs
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
247 signal LastFrameReconOfs
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
249 signal FrameOfsAux
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
250 signal FrameOfsAuxSrc
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
252 signal FrameType
: unsigned
(7 downto 0);
253 signal MaxDPFCount
: unsigned
(LG_MAX_SIZE
*2 downto 0);
255 signal s_in_request
: std_logic;
256 signal s_in_valid
: std_logic;
258 signal CountCopies
: std_logic;
259 signal CountUpdates
: std_logic;
260 signal count
: integer range 0 to 2097151;
262 signal count_lines
: integer range 0 to 1023;
263 signal count_columns
: integer range 0 to 1023;
265 constant KEY_FRAME
: unsigned
(7 downto 0) := "
00000000"
;
267 type state_t
is (stt_CleanBuffer
,
268 stt_Forward
, stt_ReconFrames
,
269 stt_CopyRecon
, stt_LoopFilter
,
270 stt_UpdateUMV
, stt_WriteOut
);
271 signal state
: state_t
;
274 type forward_state_t
is (stt_rec_framesize
,
277 stt_forward_uniq_common
,
278 stt_forward_uniq_cr_lf
,
281 stt_forward_uniqperframe_rf
,
283 stt_forward_golden_ofs_rf
,
284 stt_forward_last_ofs_rf
,
285 stt_forward_this_ofs_rf
,
287 stt_forward_dispfrag
,
288 stt_forward_source_ofs_cr
,
289 stt_forward_dest_ofs_cr
,
291 stt_forward_offset_lf
,
292 stt_forward_offset_uu
,
293 stt_forward_dispfrag_golden
,
295 signal forward_state
: forward_state_t
;
297 type write_state_t
is (stt_write1
, stt_write2
, stt_write3
);
298 signal write_state
: write_state_t
;
300 type plane_write_state_t
is (stt_plane_write_Y
, stt_plane_write_Cb
, stt_plane_write_Cr
);
301 signal plane_write_state
: plane_write_state_t
;
303 -- Fragment Parameters
304 signal YStride
: unsigned
(LG_MAX_SIZE
+1 downto 0);
305 signal UVStride
: unsigned
(LG_MAX_SIZE
downto 0);
306 signal ReconYDataOffset
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
307 signal ReconUDataOffset
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
308 signal ReconVDataOffset
: unsigned
(MEM_ADDR_WIDTH
-1 downto 0);
309 signal video_height
: unsigned
(9 downto 0);
310 signal video_width
: unsigned
(9 downto 0);
312 signal s_out_valid
: std_logic;
313 signal s_out_data
: signed
(31 downto 0);
316 begin -- a_ReconRefFrames
318 reconframes0
: reconframes
319 port map(clk
, Reset_n
, rf_enable
,
320 out_rf_request
, out_rf_valid
, out_rf_data
,
321 out_rf_DtBuf_request
, out_rf_DtBuf_valid
, out_rf_DtBuf_addr
, out_rf_DtBuf_data
,
322 in_rf_DtBuf_request
, in_rf_DtBuf_valid
, in_rf_DtBuf_addr
, in_rf_DtBuf_data
,
323 rf_done
, rf_eb_done
);
325 loopfilter0
: loopfilter
326 port map(clk
, Reset_n
, rf_enable
,
327 out_lf_request
, out_lf_valid
, out_lf_data
,
328 out_lf_DtBuf_request
, out_lf_DtBuf_valid
, out_lf_DtBuf_addr
, out_lf_DtBuf_data
,
329 in_lf_DtBuf_request
, in_lf_DtBuf_valid
, in_lf_DtBuf_addr
, in_lf_DtBuf_data
,
332 copyrecon0
: copyrecon
333 port map(clk
, Reset_n
, cr_enable
,
334 out_cr_request
, out_cr_valid
, out_cr_data
,
335 out_cr_DtBuf_request
, out_cr_DtBuf_valid
, out_cr_DtBuf_addr
, out_cr_DtBuf_data
,
336 in_cr_DtBuf_request
, in_cr_DtBuf_valid
, in_cr_DtBuf_addr
, in_cr_DtBuf_data
,
339 updateumv0
: UpdateUMV
340 port map(clk
, Reset_n
, uu_enable
,
341 out_uu_request
, out_uu_valid
, out_uu_data
,
342 out_uu_DtBuf_request
, out_uu_DtBuf_valid
, out_uu_DtBuf_addr
, out_uu_DtBuf_data
,
343 in_uu_DtBuf_request
, in_uu_DtBuf_valid
, in_uu_DtBuf_addr
, in_uu_DtBuf_data
,
346 databuffer0
: databuffer
347 port map(clk
, Reset_n
,
348 out_DtBuf_request
, out_DtBuf_valid
, out_DtBuf_addr
, out_DtBuf_data
,
349 in_DtBuf_request
, in_DtBuf_valid
, in_DtBuf_addr
, in_DtBuf_data
);
352 out_valid
<= s_out_valid
;
353 -----------------------------------------------------------------------------
354 -- Switch the in_request
355 -----------------------------------------------------------------------------
356 -- If forward_state is a state that doesn't need external data then
357 -- in_request will be turned off
358 with forward_state
select in_request
<=
359 '0' when stt_forward_golden_ofs_rf
,
360 '0' when stt_forward_last_ofs_rf
,
361 '0' when stt_forward_this_ofs_rf
,
362 '0' when stt_forward_source_ofs_cr
,
363 '0' when stt_forward_dest_ofs_cr
,
364 '0' when stt_forward_offset_lf
,
365 '0' when stt_forward_offset_uu
,
366 '0' when stt_forward_dispfrag_golden
,
367 '0' when stt_forward_none
,
368 s_in_request
when others;
370 -----------------------------------------------------------------------------
371 -- Switch the signals of the in_data and in_valid of the modules
372 -----------------------------------------------------------------------------
390 out_rf_data
<= in_data
;
392 out_cr_data
<= in_data
;
394 out_lf_data
<= in_data
;
396 out_uu_data
<= in_data
;
398 s_in_valid
<= in_valid
;
401 -----------------------------------------------------------------------------
403 -----------------------------------------------------------------------------
404 if (forward_state
= stt_rec_framesize
) then
407 elsif (forward_state
= stt_rec_height
) then
410 elsif (forward_state
= stt_rec_width
) then
413 elsif (forward_state
= stt_forward_uniq_common
) then
414 s_in_request
<= out_rf_request
and
418 out_rf_valid
<= in_valid
;
419 out_cr_valid
<= in_valid
;
420 out_lf_valid
<= in_valid
;
421 out_uu_valid
<= in_valid
;
423 elsif (forward_state
= stt_forward_uniq_cr_lf
) then
424 -------------------------------------------------------------------------
425 -- UnitFragment is sent to CopyRecon and LoopFilter and read internaly
426 -------------------------------------------------------------------------
427 s_in_request
<= out_cr_request
and
430 out_cr_valid
<= in_valid
;
431 out_lf_valid
<= in_valid
;
433 elsif (forward_state
= stt_forward_uniq_lf
) then
434 s_in_request
<= out_lf_request
;
435 out_lf_valid
<= in_valid
;
437 elsif (forward_state
= stt_forward_uniq_uu
) then
438 s_in_request
<= out_uu_request
;
439 out_uu_valid
<= in_valid
;
442 -----------------------------------------------------------------------
443 -- ReconFrames Parameters
444 ---------------------------------------------------------------------------
445 elsif (forward_state
= stt_forward_uniqperframe_rf
) then
446 s_in_request
<= out_rf_request
;
447 out_rf_valid
<= in_valid
;
449 elsif (forward_state
= stt_frametype
) then
450 -------------------------------------------------------------------------
451 -- FrameType is sent to ReconFrames and read internaly
452 -------------------------------------------------------------------------
453 s_in_request
<= out_rf_request
;
454 out_rf_valid
<= in_valid
;
456 elsif (forward_state
= stt_forward_golden_ofs_rf
) then
457 s_in_request
<= out_rf_request
;
460 out_rf_data
<= resize
('0' & signed(GoldenFrameOfs), 32);
462 elsif (forward_state = stt_forward_last_ofs_rf) then
463 s_in_request <= out_rf_request;
466 out_rf_data <= resize('0' & signed
(LastFrameReconOfs
), 32);
468 elsif (forward_state
= stt_forward_this_ofs_rf
) then
469 s_in_request
<= out_rf_request
;
472 out_rf_data
<= resize
('0' & signed(ThisFrameReconOfs), 32);
474 elsif (forward_state = stt_forward_rf) then
475 s_in_request <= out_rf_request;
476 out_rf_valid <= in_valid;
478 elsif (forward_state = stt_forward_dispfrag) then
479 s_in_request <= out_cr_request and
483 if ((out_cr_request and out_lf_request)= '1') then
484 out_cr_valid <= in_valid;
485 out_lf_valid <= in_valid;
487 assert false report "Somebody doesn't want read" severity note;
490 elsif (forward_state = stt_forward_source_ofs_cr) then
491 s_in_request <= out_cr_request;
494 out_cr_data <= resize('0' & signed
(FrameOfsAuxSrc
), 32);
496 elsif (forward_state
= stt_forward_dest_ofs_cr
) then
497 s_in_request
<= out_cr_request
;
500 out_cr_data
<= resize
('0' & signed(FrameOfsAux), 32);
502 elsif (forward_state = stt_forward_lf) then
503 s_in_request <= out_lf_request;
504 out_lf_valid <= in_valid;
506 elsif (forward_state = stt_forward_offset_lf) then
507 s_in_request <= out_lf_request;
510 out_lf_data <= resize('0' & signed
(LastFrameReconOfs
), 32);
512 elsif (forward_state
= stt_forward_offset_uu
) then
513 s_in_request
<= out_uu_request
;
516 out_uu_data
<= resize
('0' & signed(FrameOfsAux), 32);
518 elsif (forward_state = stt_forward_dispfrag_golden) then
519 -------------------------------------------------------------------------
520 -- If it is a key frame then all fragments must be displayed.
521 -- In such case all values of display_fragments is one
522 -------------------------------------------------------------------------
523 s_in_request <= out_cr_request;
526 out_cr_data <= x"FFFFFFFF";
530 if (Reset_n = '0') then
539 -----------------------------------------------------------------------------
540 -- Control the module's access to the Data Buffer
541 -- This is just a big multiplexer
542 -----------------------------------------------------------------------------
549 out_rf_DtBuf_request,
555 out_cr_DtBuf_request,
561 out_lf_DtBuf_request,
567 out_uu_DtBuf_request,
573 out_rr_DtBuf_request,
578 begin -- process state
579 out_rr_DtBuf_data <= x"00000000";
580 out_rr_DtBuf_valid <= '0';
582 out_cr_DtBuf_data <= x"00000000";
583 out_cr_DtBuf_valid <= '0';
585 out_lf_DtBuf_data <= x"00000000";
586 out_lf_DtBuf_valid <= '0';
588 out_rf_DtBuf_data <= x"00000000";
589 out_rf_DtBuf_valid <= '0';
591 out_uu_DtBuf_data <= x"00000000";
592 out_uu_DtBuf_valid <= '0';
594 in_uu_DtBuf_request <= '0';
595 in_cr_DtBuf_request <= '0';
596 in_lf_DtBuf_request <= '0';
597 in_rf_DtBuf_request <= '0';
598 in_rr_DtBuf_request <= '0';
600 if (state = stt_ReconFrames) then
601 in_DtBuf_request <= out_rf_DtBuf_request;
602 out_rf_DtBuf_valid <= in_DtBuf_valid;
603 in_DtBuf_addr <= out_rf_DtBuf_addr;
604 out_rf_DtBuf_data <= in_DtBuf_data;
606 in_rf_DtBuf_request <= out_DtBuf_request;
607 out_DtBuf_valid <= in_rf_DtBuf_valid;
608 out_DtBuf_addr <= in_rf_DtBuf_addr;
609 out_DtBuf_data <= in_rf_DtBuf_data;
611 elsif (state = stt_CopyRecon) then
612 in_DtBuf_request <= out_cr_DtBuf_request;
613 out_cr_DtBuf_valid <= in_DtBuf_valid;
614 in_DtBuf_addr <= out_cr_DtBuf_addr;
615 out_cr_DtBuf_data <= in_DtBuf_data;
617 in_cr_DtBuf_request <= out_DtBuf_request;
618 out_DtBuf_valid <= in_cr_DtBuf_valid;
619 out_DtBuf_addr <= in_cr_DtBuf_addr;
620 out_DtBuf_data <= in_cr_DtBuf_data;
622 elsif (state = stt_LoopFilter) then
623 in_DtBuf_request <= out_lf_DtBuf_request;
624 out_lf_DtBuf_valid <= in_DtBuf_valid;
625 in_DtBuf_addr <= out_lf_DtBuf_addr;
626 out_lf_DtBuf_data <= in_DtBuf_data;
628 in_lf_DtBuf_request <= out_DtBuf_request;
629 out_DtBuf_valid <= in_lf_DtBuf_valid;
630 out_DtBuf_addr <= in_lf_DtBuf_addr;
631 out_DtBuf_data <= in_lf_DtBuf_data;
633 elsif (state = stt_UpdateUMV) then
634 in_DtBuf_request <= out_uu_DtBuf_request;
635 out_uu_DtBuf_valid <= in_DtBuf_valid;
636 in_DtBuf_addr <= out_uu_DtBuf_addr;
637 out_uu_DtBuf_data <= in_DtBuf_data;
639 in_uu_DtBuf_request <= out_DtBuf_request;
640 out_DtBuf_valid <= in_uu_DtBuf_valid;
641 out_DtBuf_addr <= in_uu_DtBuf_addr;
642 out_DtBuf_data <= in_uu_DtBuf_data;
644 elsif (state = stt_CleanBuffer) then
646 in_DtBuf_request <= out_rr_DtBuf_request;
647 out_rr_DtBuf_valid <= in_DtBuf_valid;
648 in_DtBuf_addr <= out_rr_DtBuf_addr;
649 out_rr_DtBuf_data <= in_DtBuf_data;
651 in_rr_DtBuf_request <= out_DtBuf_request;
652 out_DtBuf_valid <= in_rr_DtBuf_valid;
653 out_DtBuf_addr <= in_rr_DtBuf_addr;
654 out_DtBuf_data <= x"00000000";
657 in_DtBuf_request <= out_rr_DtBuf_request;
658 out_rr_DtBuf_valid <= in_DtBuf_valid;
659 in_DtBuf_addr <= out_rr_DtBuf_addr;
660 out_rr_DtBuf_data <= in_DtBuf_data;
662 out_DtBuf_valid <= '0';
663 out_DtBuf_addr <= x"00000";
664 out_DtBuf_data <= x"00000000";
668 if (Reset_n = '0') then
669 out_rr_DtBuf_data <= x"00000000";
670 out_rr_DtBuf_valid <= '0';
672 out_cr_DtBuf_data <= x"00000000";
673 out_cr_DtBuf_valid <= '0';
675 out_lf_DtBuf_data <= x"00000000";
676 out_lf_DtBuf_valid <= '0';
678 out_rf_DtBuf_data <= x"00000000";
679 out_rf_DtBuf_valid <= '0';
681 out_uu_DtBuf_data <= x"00000000";
682 out_uu_DtBuf_valid <= '0';
684 in_uu_DtBuf_request <= '0';
685 in_cr_DtBuf_request <= '0';
686 in_lf_DtBuf_request <= '0';
687 in_rf_DtBuf_request <= '0';
694 ---------------------------------------------------------------------------
695 -- Procedure that write zero in all positions of Data Buffer
696 ---------------------------------------------------------------------------
697 procedure CleanBuffer is
699 in_rr_DtBuf_valid <= '1';
701 in_rr_DtBuf_addr <= x"00000";
703 in_rr_DtBuf_addr <= in_rr_DtBuf_addr + 1;
706 if (in_rr_DtBuf_request = '1') then
710 if (count = SHIFT_RIGHT(3*FrameSize,2)) then
711 state <= stt_Forward;
712 forward_state <= stt_forward_uniq_common;
713 in_rr_DtBuf_addr <= x"00000";
715 in_rr_DtBuf_valid <= '0';
721 -------------------------------------------------------------------------------
722 -- Change the states syncronously
723 -------------------------------------------------------------------------------
724 procedure ForwardControl is
726 if (s_in_request = '1' and s_in_valid = '1') then
727 -- assert false report "forward_state = "&forward_state_t'image(forward_state) severity note;
730 if (forward_state = stt_rec_framesize) then
731 -- The first parameter is FrameType
732 FrameSize <= unsigned(in_data(MEM_ADDR_WIDTH-1 downto 0));
734 -- This is a hack. On FPGA when reset the module, I don't know explain
735 -- why, reads the first value as zero.
736 -- Here we are ignoring this zero value. So the first valid value is
737 -- the second one that the module reads. The problem happens on an
738 -- Altera Stratix II.
743 forward_state <= stt_rec_height;
747 elsif (forward_state = stt_rec_height) then
748 video_height <= unsigned(in_data(9 downto 0));
749 forward_state <= stt_rec_width;
751 elsif (forward_state = stt_rec_width) then
752 video_width <= unsigned(in_data(9 downto 0));
754 forward_state <= stt_forward_none;
755 state <= stt_CleanBuffer;
758 elsif (forward_state = stt_forward_uniq_common) then
759 -- Define the offsets
760 GoldenFrameOfs <= x"00000";
761 LastFrameReconOfs <= FrameSize;
762 ThisFrameReconOfs <= SHIFT_LEFT(FrameSize, 1);
765 ---------------------------------------------------------------------
766 -- Forward and read the unique values common for all modules
767 ---------------------------------------------------------------------
768 -- if count = 0 then and forward the pbi->HFragments value
769 ---------------------------------------------------------------------
770 -- if count = 1 then read and forward the pbi->YPlaneFragments value
771 ---------------------------------------------------------------------
772 -- if count = 2 then read and forward the pbi->YStride value
773 ---------------------------------------------------------------------
774 -- if count = 3 then read and forward the pbi->UVPlaneFragments value
775 ---------------------------------------------------------------------
776 -- if count = 4 then read and forward the pbi->UVStride value
777 ---------------------------------------------------------------------
778 -- if count = 5 then read and forward the pbi->VFragments value
779 ---------------------------------------------------------------------
780 -- if count = 6 then read and forward the pbi->ReconYDataOffset value
781 ---------------------------------------------------------------------
782 -- if count = 7 then read and forward the pbi->ReconUDataOffset value
783 ---------------------------------------------------------------------
784 -- if count = 8 then read and forward the pbi->ReconVDataOffset value
785 ---------------------------------------------------------------------
788 YStride <= unsigned(in_data(LG_MAX_SIZE+1 downto 0));
790 elsif (count = 4) then
791 UVStride <= unsigned(in_data(LG_MAX_SIZE downto 0));
793 elsif (count = 6) then
794 ReconYDataOffset <= unsigned(in_data(MEM_ADDR_WIDTH-1 downto 0));
796 elsif (count = 7) then
797 ReconUDataOffset <= unsigned(in_data(MEM_ADDR_WIDTH-1 downto 0));
799 elsif (count = 8) then
800 ReconVDataOffset <= unsigned(in_data(MEM_ADDR_WIDTH-1 downto 0));
801 forward_state <= stt_forward_uniq_cr_lf;
805 elsif (forward_state = stt_forward_uniq_cr_lf) then
806 -- Forward the pbi->UnitFragments value to CopyRecon and LoopFilter
807 forward_state <= stt_forward_uniq_lf;
809 -- Verify if the pbi-UnitFragments value is some multiple of 32
810 -- because the matrix pbi->display_fragments is package
811 MaxDPFCount <= SHIFT_RIGHT(
812 unsigned(in_data(LG_MAX_SIZE*2 downto 0)), 5) + 1;
813 if (in_data(4 downto 0) = "00000") then
814 MaxDPFCount <= SHIFT_RIGHT(
815 unsigned(in_data(LG_MAX_SIZE*2 downto 0)), 5);
819 elsif (forward_state = stt_forward_uniq_lf) then
820 ---------------------------------------------------------------------
821 -- Forward the Matrices pbi->QThreshTable and pbi->LoopFilterLimits
822 -- to LoopFilter module
823 ---------------------------------------------------------------------
824 -- For Count = 0 to Count = 63 forward pbi->QThreshTable
825 ---------------------------------------------------------------------
826 -- For Count = 64 to Count = 79 forward pbi->LoopFilterLimits
827 ---------------------------------------------------------------------
830 forward_state <= stt_forward_uniq_uu;
834 elsif (forward_state = stt_forward_uniq_uu) then
835 -- Forward the pbi->info.height value to UpdateUMV module
836 forward_state <= stt_forward_uniqperframe_rf;
838 elsif (forward_state = stt_forward_uniqperframe_rf) then
839 ---------------------------------------------------------------------
840 -- If Count = 0 forward to ReconFrame the QuantDispFrags that is
841 -- equal to pbi->CodedBlockIndex of the software
842 ---------------------------------------------------------------------
843 -- For Count = 1 to Count = 64 forward the
844 -- pbi->dequant_Y_coeffs matrix to ReconFrames
845 -----------------------------------------------------------
846 -- For Count = 65 to Count = 128 forward the
847 -- pbi->dequant_U_coeffs matrix to ReconFrames
848 -----------------------------------------------------------
849 -- For Count = 129 to Count = 192 forward the
850 -- pbi->dequant_V_coeffs matrix to ReconFrames
851 -----------------------------------------------------------
852 -- For Count = 193 to Count = 256 forward the
853 -- dequant_InterY_coeffs matrix to ReconFrames
854 -----------------------------------------------------------
855 -- For Count = 257 to Count = 320 forward the
856 -- dequant_InterU_coeffs matrix to ReconFrames
857 -----------------------------------------------------------
858 -- For Count = 321 to Count = 384 forward the
859 -- dequant_InterV_coeffs matrix to ReconFrames
862 if (in_data(LG_MAX_SIZE*2-1 downto 0) = 0) then
863 forward_state <= stt_forward_none;
864 state <= stt_ReconFrames;
866 FrameType <= (others => '1');
868 elsif (count = 384) then
869 forward_state <= stt_frametype;
873 elsif (forward_state = stt_frametype) then
874 -- Forward and read the pbi->FrameType
875 forward_state <= stt_forward_golden_ofs_rf;
876 FrameType <= unsigned(in_data(7 downto 0));
878 -----------------------------------------------------------------------
879 -- The three states below is used to forward the three Data Buffer's
880 -- offsets to the modules that need these informations
881 -- The hardware is responsible for the offsets.
882 -----------------------------------------------------------------------
883 elsif (forward_state = stt_forward_golden_ofs_rf) then
884 forward_state <= stt_forward_last_ofs_rf;
886 elsif (forward_state = stt_forward_last_ofs_rf) then
887 forward_state <= stt_forward_this_ofs_rf;
889 elsif (forward_state = stt_forward_this_ofs_rf) then
890 forward_state <= stt_forward_rf;
892 elsif (forward_state = stt_forward_rf) then
893 -----------------------------------------------------------
894 -- Forward to ReconFrames the parameters below that are
895 -- sent for all fragments
896 -----------------------------------------------------------
897 -- For Count = 0 to Count = 63 forward the
898 -- pbi->QFragData(number of the fragment to be expanded)
900 ------------------------------------------------------------
901 -- If Count = 64 forward the
902 -- pbi->FragCodingMethod(number of the fragment to be expanded)
904 -----------------------------------------------------------
905 -- If Count = 65 forward the
906 -- pbi->FragCoefEOB(number of the fragment to be expanded)
908 -----------------------------------------------------------
909 -- If Count = 66 forward the
910 -- (pbi->FragMVect(number of the fragment to be expanded)).x
912 -----------------------------------------------------------
913 -- If Count = 67 forward the
914 -- (pbi->FragMVect(number of the fragment to be expanded)).y
916 -----------------------------------------------------------
917 -- If Count = 68 forward the
918 -- (number of fragment to be expanded)
919 -----------------------------------------------------------
922 forward_state <= stt_forward_none;
923 state <= stt_ReconFrames;
927 elsif (forward_state = stt_forward_dispfrag or
928 forward_state = stt_forward_dispfrag_golden) then
929 -- assert false report "forward_state = "&forward_state_t'image(forward_state) severity note;
930 -- assert false report "Count = "&integer'image(count) severity note;
931 -- assert false report "MaxDPFCount = "&integer'image(to_integer(MaxDPFCount)) severity note;
934 if (count = MaxDPFCount - 1) then
935 forward_state <= stt_forward_source_ofs_cr;
939 elsif (forward_state = stt_forward_source_ofs_cr) then
940 -- assert false report "forward_state = "&forward_state_t'image(forward_state) severity note;
941 forward_state <= stt_forward_dest_ofs_cr;
943 elsif (forward_state = stt_forward_dest_ofs_cr) then
944 -- assert false report "forward_state = "&forward_state_t'image(forward_state) severity note;
945 forward_state <= stt_forward_none;
946 state <= stt_CopyRecon;
948 elsif (forward_state = stt_forward_lf) then
949 forward_state <= stt_forward_offset_lf;
951 elsif (forward_state = stt_forward_offset_lf) then
952 forward_state <= stt_forward_none;
953 state <= stt_LoopFilter;
955 elsif (forward_state = stt_forward_offset_uu) then
956 assert false report "Calling UU" severity note;
957 forward_state <= stt_forward_none;
958 state <= stt_UpdateUMV;
963 end procedure ForwardControl;
965 procedure ReconFrames is
967 -- assert false report "out_rf_request = "&std_logic'image(out_rf_request) severity note;
968 if (rf_done = '1' and rf_eb_done = '1') then
969 assert false report "ReconFrames Concluido" severity note;
970 forward_state <= stt_forward_dispfrag;
971 state <= stt_Forward;
972 FrameOfsAux <= LastFrameReconOfs;
973 FrameOfsAuxSrc <= ThisFrameReconOfs;
974 elsif (rf_eb_done = '1') then
975 forward_state <= stt_forward_rf;
976 state <= stt_Forward;
981 end procedure ReconFrames;
983 procedure CopyRecon is
985 if (cr_done = '1') then
986 assert false report "CopyRecon Concluido" severity note;
988 forward_state <= stt_forward_lf;
989 state <= stt_Forward;
991 if (FrameType = KEY_FRAME and CountCopies = '0') then
993 elsif (FrameType = KEY_FRAME and CountCopies = '1') then
994 forward_state <= stt_forward_offset_uu;
995 state <= stt_Forward;
1000 end procedure CopyRecon;
1002 procedure LoopFilter is
1004 if (lf_done = '1') then
1005 assert false report "LoopFilter Concluido" severity note;
1006 forward_state <= stt_forward_offset_uu;
1007 state <= stt_Forward;
1009 end procedure LoopFilter;
1011 procedure UpdateUMV is
1013 if (uu_done = '1') then
1014 assert false report "UpdateUMV Concluido" severity note;
1017 state <= stt_WriteOut;
1018 plane_write_state <= stt_plane_write_Y;
1019 write_state <= stt_write1;
1020 forward_state <= stt_forward_none;
1021 CountUpdates <= '0';
1022 if (FrameType = KEY_FRAME and CountUpdates = '0') then
1023 FrameOfsAux <= GoldenFrameOfs;
1024 FrameOfsAuxSrc <= LastFrameReconOfs;
1025 forward_state <= stt_forward_dispfrag_golden;
1026 state <= stt_Forward;
1027 CountUpdates <= '1';
1030 end procedure UpdateUMV;
1032 procedure WriteOut is
1035 if (write_state = stt_write1) then
1036 write_state <= stt_write2;
1037 out_rr_DtBuf_request <= '1';
1038 out_rr_DtBuf_addr <= out_rr_DtBuf_addr + 1;
1040 count_columns <= count_columns + 4;
1041 case plane_write_state is
1043 when stt_plane_write_Y =>
1044 if (count_columns = 0) then
1045 out_rr_DtBuf_addr <= resize(SHIFT_RIGHT(LastFrameReconOfs + ReconYDataOffset + YStride * (video_height - 1) - YStride*(count_lines), 2), MEM_ADDR_WIDTH);
1047 elsif (count_columns = video_width - 4) then
1049 count_lines <= count_lines + 1;
1050 if (count_lines = video_height - 1) then
1052 plane_write_state <= stt_plane_write_Cb;
1056 when stt_plane_write_Cb =>
1057 if (count_columns = 0) then
1058 out_rr_DtBuf_addr <= resize(SHIFT_RIGHT(LastFrameReconOfs + ReconUDataOffset + UVStride * ((video_height/2) - 1) - UVStride*(count_lines), 2), MEM_ADDR_WIDTH);
1060 elsif (count_columns = (video_width / 2) - 4) then
1062 count_lines <= count_lines + 1;
1063 if (count_lines = (video_height / 2) - 1) then
1065 plane_write_state <= stt_plane_write_Cr;
1069 when stt_plane_write_Cr =>
1070 if (count_columns = 0) then
1071 out_rr_DtBuf_addr <= resize(SHIFT_RIGHT(LastFrameReconOfs + ReconVDataOffset + UVStride * ((video_height/2) - 1) - UVStride*(count_lines), 2), MEM_ADDR_WIDTH);
1073 elsif (count_columns = (video_width / 2) - 4) then
1075 count_lines <= count_lines + 1;
1076 if (count_lines = (video_height / 2) - 1) then
1077 ---------------------------------------------------------------
1078 -- Because count_columns, by construction, is always dividable by
1079 -- 4, count_columns = 1 is used as a flag that indicate we have
1080 -- wrote all the visible frame
1081 ---------------------------------------------------------------
1086 -------------------------------------------------------------------
1087 -- If we have already wrote all the visible frame we are done
1088 -------------------------------------------------------------------
1089 elsif (count_columns = 1) then
1090 -- count_leo <= count_leo + 1;
1091 -- assert count_leo /= 2 report "Dois frames" severity FAILURE;
1092 assert false report "Teste4" severity note;
1094 forward_state <= stt_forward_uniqperframe_rf;
1095 plane_write_state <= stt_plane_write_Y;
1096 state <= stt_Forward;
1097 write_state <= stt_write1;
1098 out_rr_DtBuf_request <= '0';
1102 elsif (write_state = stt_write2) then
1103 if (out_rr_DtBuf_valid = '1') then
1104 s_out_data <= out_rr_DtBuf_data;
1105 out_rr_DtBuf_request <= '0';
1106 write_state <= stt_write3;
1111 out_data <= s_out_data;
1112 if (out_requested = '1') then
1113 write_state <= stt_write1;
1114 out_rr_DtBuf_request <= '0';
1117 end procedure WriteOut;
1120 if (clk'event and clk = '1') then
1121 if (Reset_n = '0') then
1127 plane_write_state <= stt_plane_write_Y;
1128 write_state <= stt_write1;
1129 forward_state <= stt_rec_framesize;
1130 state <= stt_Forward;
1134 CountUpdates <= '0';
1136 out_data <= x"00000000";
1137 s_out_data <= x"00000000";
1140 out_rr_DtBuf_request <= '0';
1143 when stt_CleanBuffer => CleanBuffer;
1144 when stt_Forward => ForwardControl;
1145 when stt_ReconFrames => ReconFrames;
1146 when stt_CopyRecon => CopyRecon;
1147 when stt_LoopFilter => LoopFilter;
1148 when stt_UpdateUMV => UpdateUMV;
1149 when others => WriteOut;
1156 end a_ReconRefFrames;