1 |
2 |
kdv |
/*
|
2 |
|
|
* vld.v
|
3 |
|
|
*
|
4 |
|
|
* Copyright (c) 2007 Koen De Vleeschauwer.
|
5 |
|
|
*
|
6 |
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
7 |
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
8 |
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
9 |
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
10 |
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
11 |
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
12 |
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
13 |
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
14 |
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
15 |
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
16 |
|
|
* SUCH DAMAGE.
|
17 |
|
|
*/
|
18 |
|
|
|
19 |
|
|
/*
|
20 |
|
|
* vld - Variable Length Decoder. Scalability not implemented. Maximum vertical size of image in pixels: 2800.
|
21 |
|
|
*/
|
22 |
|
|
|
23 |
|
|
`include "timescale.v"
|
24 |
|
|
|
25 |
|
|
`undef DEBUG
|
26 |
|
|
//`define DEBUG 1
|
27 |
|
|
//`define DEBUG_VLC 1
|
28 |
|
|
|
29 |
|
|
/*
|
30 |
|
|
* video decoding process as specified in 13818-2, par. 7.1 through 7.6
|
31 |
|
|
*/
|
32 |
|
|
|
33 |
|
|
module vld(clk, clk_en, rst,
|
34 |
|
|
getbits, signbit, advance, align, wait_state, // interface with getbits
|
35 |
|
|
quant_wr_data, quant_wr_addr, quant_rst, // interface with quantizer rams via rld_fifo
|
36 |
|
|
wr_intra_quant, wr_non_intra_quant, wr_chroma_intra_quant, wr_chroma_non_intra_quant, // interface with quantizer rams via rld_fifo
|
37 |
|
|
rld_wr_en, rld_cmd, dct_coeff_run, dct_coeff_signed_level, dct_coeff_end, // interface with rld_fifo
|
38 |
|
|
quantiser_scale_code, alternate_scan, q_scale_type, macroblock_intra, intra_dc_precision, // interface with rld_fifo
|
39 |
|
|
picture_coding_type, picture_structure, motion_type, dct_type, // interface with motcomp
|
40 |
|
|
motion_vert_field_select_0_0, motion_vert_field_select_0_1, // interface with motcomp
|
41 |
|
|
motion_vert_field_select_1_0, motion_vert_field_select_1_1, // interface with motcomp
|
42 |
|
|
second_field, update_picture_buffers, last_frame, mb_width, mb_height, chroma_format, // interface with motcomp
|
43 |
|
|
macroblock_address, macroblock_motion_forward, macroblock_motion_backward, // interface with motcomp
|
44 |
|
|
motion_vector_valid, // interface with motcomp - motion vectors
|
45 |
|
|
pmv_0_0_0, pmv_0_0_1, pmv_1_0_0, pmv_1_0_1, pmv_0_1_0, pmv_0_1_1, pmv_1_1_0, pmv_1_1_1, // interface with motcomp - motion vectors
|
46 |
|
|
dmv_0_0, dmv_0_1, dmv_1_0, dmv_1_1, // interface with motcomp - dual prime motion vectors
|
47 |
|
|
horizontal_size, vertical_size, display_horizontal_size, display_vertical_size, // interface with syncgen
|
48 |
|
|
matrix_coefficients, // interface with yuv2rgb
|
49 |
|
|
frame_rate_code, frame_rate_extension_n, frame_rate_extension_d, // interface with regfile
|
50 |
|
|
aspect_ratio_information,
|
51 |
|
|
progressive_sequence, progressive_frame, repeat_first_field, top_field_first, // interface with resample
|
52 |
|
|
vld_err // asserted when vld code parse error
|
53 |
|
|
);
|
54 |
|
|
|
55 |
|
|
input clk; // clock
|
56 |
|
|
input clk_en; // clock enable
|
57 |
|
|
input rst; // synchronous active low reset
|
58 |
|
|
input [23:0]getbits; // bit-aligned slice data. 16 bits long as longest variable length code is 16 bits.
|
59 |
|
|
input signbit; // sign bit of dct coefficient
|
60 |
|
|
|
61 |
|
|
output reg [4:0]advance; // number of bits to advance the bitstream (advance <= 24)
|
62 |
|
|
output reg align; // byte-align getbits and move forward one byte.
|
63 |
|
|
|
64 |
|
|
output reg [7:0]quant_wr_data; // data bus for quantizer matrix rams
|
65 |
|
|
output reg [5:0]quant_wr_addr; // address bus for quantizer matrix rams
|
66 |
|
|
output reg quant_rst; // reset quant matrices to default values
|
67 |
|
|
output reg wr_intra_quant; // write enable for intra quantiser matrix
|
68 |
|
|
output reg wr_non_intra_quant; // write enable for non intra quantiser matrix
|
69 |
|
|
output reg wr_chroma_intra_quant; // write enable for chroma intra quantiser matrix
|
70 |
|
|
output reg wr_chroma_non_intra_quant; // write enable for chroma non intra quantiser matrix
|
71 |
|
|
|
72 |
|
|
output reg vld_err; // vld_err is asserted when a slice parsing error has occurred. self-repairing.
|
73 |
|
|
|
74 |
|
|
parameter [7:0]
|
75 |
|
|
STATE_NEXT_START_CODE = 8'h00,
|
76 |
|
|
STATE_START_CODE = 8'h01,
|
77 |
|
|
|
78 |
|
|
STATE_PICTURE_HEADER = 8'h02,
|
79 |
|
|
STATE_PICTURE_HEADER0 = 8'h03,
|
80 |
|
|
STATE_PICTURE_HEADER1 = 8'h04,
|
81 |
|
|
STATE_PICTURE_HEADER2 = 8'h05,
|
82 |
|
|
|
83 |
|
|
STATE_SEQUENCE_HEADER = 8'h06,
|
84 |
|
|
STATE_SEQUENCE_HEADER0 = 8'h07,
|
85 |
|
|
STATE_SEQUENCE_HEADER1 = 8'h08,
|
86 |
|
|
STATE_SEQUENCE_HEADER2 = 8'h09,
|
87 |
|
|
STATE_SEQUENCE_HEADER3 = 8'h0a,
|
88 |
|
|
|
89 |
|
|
STATE_GROUP_HEADER = 8'h0b,
|
90 |
|
|
STATE_GROUP_HEADER0 = 8'h0c,
|
91 |
|
|
|
92 |
|
|
STATE_EXTENSION_START_CODE = 8'h10,
|
93 |
|
|
STATE_SEQUENCE_EXT = 8'h11,
|
94 |
|
|
STATE_SEQUENCE_EXT0 = 8'h12,
|
95 |
|
|
STATE_SEQUENCE_EXT1 = 8'h13,
|
96 |
|
|
STATE_SEQUENCE_DISPLAY_EXT = 8'h14,
|
97 |
|
|
STATE_SEQUENCE_DISPLAY_EXT0 = 8'h15,
|
98 |
|
|
STATE_SEQUENCE_DISPLAY_EXT1 = 8'h16,
|
99 |
|
|
STATE_SEQUENCE_DISPLAY_EXT2 = 8'h17,
|
100 |
|
|
STATE_QUANT_MATRIX_EXT = 8'h18,
|
101 |
|
|
STATE_PICTURE_CODING_EXT = 8'h19,
|
102 |
|
|
STATE_PICTURE_CODING_EXT0 = 8'h1a,
|
103 |
|
|
STATE_PICTURE_CODING_EXT1 = 8'h1b,
|
104 |
|
|
|
105 |
|
|
STATE_LD_INTRA_QUANT0 = 8'h20,
|
106 |
|
|
STATE_LD_INTRA_QUANT1 = 8'h21,
|
107 |
|
|
STATE_LD_NON_INTRA_QUANT0 = 8'h22,
|
108 |
|
|
STATE_LD_NON_INTRA_QUANT1 = 8'h23,
|
109 |
|
|
STATE_LD_CHROMA_INTRA_QUANT1 = 8'h24,
|
110 |
|
|
STATE_LD_CHROMA_NON_INTRA_QUANT1 = 8'h25,
|
111 |
|
|
|
112 |
|
|
STATE_SLICE = 8'h31,
|
113 |
|
|
STATE_SLICE_EXTENSION = 8'h32,
|
114 |
|
|
STATE_SLICE_EXTRA_INFORMATION = 8'h33,
|
115 |
|
|
STATE_NEXT_MACROBLOCK = 8'h34,
|
116 |
|
|
STATE_MACROBLOCK_SKIP = 8'h35,
|
117 |
|
|
STATE_DELAY_EMPTY_BLOCK = 8'h36,
|
118 |
|
|
STATE_EMIT_EMPTY_BLOCK = 8'h37,
|
119 |
|
|
STATE_MACROBLOCK_TYPE = 8'h38,
|
120 |
|
|
STATE_MOTION_TYPE = 8'h39,
|
121 |
|
|
STATE_DCT_TYPE = 8'h3a,
|
122 |
|
|
STATE_MACROBLOCK_QUANT = 8'h3b,
|
123 |
|
|
|
124 |
|
|
STATE_NEXT_MOTION_VECTOR = 8'h40,
|
125 |
|
|
STATE_MOTION_VERT_FLD_SEL = 8'h41, // motion_vectors: motion_vertical_field_select
|
126 |
|
|
STATE_MOTION_CODE = 8'h42, // motion_vector: motion_code
|
127 |
|
|
STATE_MOTION_RESIDUAL = 8'h43, // motion_vector: motion_residual
|
128 |
|
|
STATE_MOTION_DMVECTOR = 8'h44, // motion_vector: dmvector
|
129 |
|
|
STATE_MOTION_PREDICT = 8'h45, // motion_vector: prediction pipeline begin
|
130 |
|
|
STATE_MOTION_PIPELINE_FLUSH = 8'h46, // motion_vector: prediction pipeline end
|
131 |
|
|
|
132 |
|
|
STATE_MARKER_BIT_0 = 8'h60,
|
133 |
|
|
STATE_CODED_BLOCK_PATTERN = 8'h61,
|
134 |
|
|
STATE_CODED_BLOCK_PATTERN_1 = 8'h62,
|
135 |
|
|
STATE_CODED_BLOCK_PATTERN_2 = 8'h63,
|
136 |
|
|
|
137 |
|
|
STATE_BLOCK = 8'h70,
|
138 |
|
|
STATE_NEXT_BLOCK = 8'h71,
|
139 |
|
|
STATE_DCT_DC_LUMI_SIZE = 8'h72,
|
140 |
|
|
STATE_DCT_DC_CHROMI_SIZE = 8'h73,
|
141 |
|
|
STATE_DCT_DC_DIFF = 8'h74,
|
142 |
|
|
STATE_DCT_DC_DIFF_0 = 8'h75,
|
143 |
|
|
STATE_DCT_SUBS_B15 = 8'h76,
|
144 |
|
|
STATE_DCT_ESCAPE_B15 = 8'h77,
|
145 |
|
|
STATE_DCT_SUBS_B14 = 8'h78,
|
146 |
|
|
STATE_DCT_ESCAPE_B14 = 8'h79,
|
147 |
|
|
STATE_DCT_NON_INTRA_FIRST = 8'h7a,
|
148 |
|
|
STATE_NON_CODED_BLOCK = 8'h7b,
|
149 |
|
|
STATE_DCT_ERROR = 8'h7c,
|
150 |
|
|
|
151 |
|
|
STATE_SEQUENCE_END = 8'h80,
|
152 |
|
|
|
153 |
|
|
STATE_ERROR = 8'hff;
|
154 |
|
|
|
155 |
|
|
/* start codes */
|
156 |
|
|
parameter [7:0]
|
157 |
|
|
CODE_PICTURE_START = 8'h00,
|
158 |
|
|
CODE_USER_DATA_START = 8'hb2,
|
159 |
|
|
CODE_SEQUENCE_HEADER = 8'hb3,
|
160 |
|
|
CODE_SEQUENCE_ERROR = 8'hb4,
|
161 |
|
|
CODE_EXTENSION_START = 8'hb5,
|
162 |
|
|
CODE_SEQUENCE_END = 8'hb7,
|
163 |
|
|
CODE_GROUP_START = 8'hb8;
|
164 |
|
|
|
165 |
|
|
/* extension start codes */
|
166 |
|
|
parameter [3:0]
|
167 |
|
|
EXT_SEQUENCE = 4'b0001,
|
168 |
|
|
EXT_SEQUENCE_DISPLAY = 4'b0010,
|
169 |
|
|
EXT_QUANT_MATRIX = 4'b0011,
|
170 |
|
|
EXT_COPYRIGHT = 4'b0100,
|
171 |
|
|
EXT_SEQUENCE_SCALABLE = 4'b0101,
|
172 |
|
|
EXT_PICTURE_DISPLAY = 4'b0111,
|
173 |
|
|
EXT_PICTURE_CODING = 4'b1000,
|
174 |
|
|
EXT_PICTURE_SPATIAL_SCALABLE = 4'b1001,
|
175 |
|
|
EXT_PICTURE_TEMPORAL_SCALABLE = 4'b1010,
|
176 |
|
|
EXT_CAMERA_PARAMETERS = 4'b1011,
|
177 |
|
|
EXT_ITU_T = 4'b1100;
|
178 |
|
|
|
179 |
|
|
`include "vld_codes.v"
|
180 |
|
|
|
181 |
|
|
parameter
|
182 |
|
|
STRICT_MARKER_BIT = 1'b0; /* set to 1 to check marker bits are 1. May break some streams. */
|
183 |
|
|
|
184 |
|
|
/*
|
185 |
|
|
* Table 7-7 Meaning of indices in PMV[r][s][t], vector[r][s][t] and vector'[r][s][t]
|
186 |
|
|
*
|
187 |
|
|
* 0 1
|
188 |
|
|
* r First motion vector in Macroblock Second motion vector in Macroblock
|
189 |
|
|
* s Forward motion Vector Backwards motion Vector
|
190 |
|
|
* t Horizontal Component Vertical Component
|
191 |
|
|
*
|
192 |
|
|
* NOTE r also takes the values 2 and 3 for derived motion vectors used with dual-prime prediction.
|
193 |
|
|
* Since these motion vectors are derived they do not themselves have motion vector predictors.
|
194 |
|
|
*/
|
195 |
|
|
parameter [2:0] /* motion vector codes */
|
196 |
|
|
MOTION_VECTOR_0_0_0 = 3'd0,
|
197 |
|
|
MOTION_VECTOR_0_0_1 = 3'd1,
|
198 |
|
|
MOTION_VECTOR_1_0_0 = 3'd2,
|
199 |
|
|
MOTION_VECTOR_1_0_1 = 3'd3,
|
200 |
|
|
MOTION_VECTOR_0_1_0 = 3'd4,
|
201 |
|
|
MOTION_VECTOR_0_1_1 = 3'd5,
|
202 |
|
|
MOTION_VECTOR_1_1_0 = 3'd6,
|
203 |
|
|
MOTION_VECTOR_1_1_1 = 3'd7;
|
204 |
|
|
|
205 |
|
|
reg [7:0]state;
|
206 |
|
|
reg [7:0]next;
|
207 |
|
|
|
208 |
|
|
reg [4:0]next_advance;
|
209 |
|
|
|
210 |
|
|
reg [5:0]cnt; // counter used when loading quant matrices
|
211 |
|
|
|
212 |
|
|
/* in start code */
|
213 |
|
|
wire [7:0]start_code;
|
214 |
|
|
|
215 |
|
|
/* position in video stream */
|
216 |
|
|
reg sequence_header_seen; /* set when sequence header encountered, cleared when sequence end encountered */
|
217 |
|
|
reg sequence_extension_seen; /* set when sequence extension encountered, cleared when sequence end encountered */
|
218 |
|
|
reg picture_header_seen; /* set when picture header encountered, cleared when sequence end encountered */
|
219 |
|
|
|
220 |
|
|
/* in sequence header */
|
221 |
|
|
output wire[13:0]horizontal_size;
|
222 |
|
|
output wire[13:0]vertical_size;
|
223 |
|
|
output reg [7:0]mb_width; /* par. 6.3.3. width of the encoded luminance component of pictures in macroblocks */
|
224 |
|
|
output reg [7:0]mb_height; /* par. 6.3.3. height of the encoded luminance component of frame pictures in macroblocks */
|
225 |
|
|
output wire [3:0]aspect_ratio_information;
|
226 |
|
|
output wire [3:0]frame_rate_code;
|
227 |
|
|
wire [29:0]bit_rate;
|
228 |
|
|
wire [17:0]vbv_buffer_size;
|
229 |
|
|
wire constrained_parameters_flag;
|
230 |
|
|
|
231 |
|
|
/* in sequence header extension */
|
232 |
|
|
wire [7:0]profile_and_level_indication;
|
233 |
|
|
output wire progressive_sequence;
|
234 |
|
|
output wire [1:0]chroma_format;
|
235 |
|
|
wire low_delay;
|
236 |
|
|
output wire [1:0]frame_rate_extension_n;
|
237 |
|
|
output wire [4:0]frame_rate_extension_d;
|
238 |
|
|
|
239 |
|
|
/* in sequence display extension */
|
240 |
|
|
wire [2:0]video_format;
|
241 |
|
|
wire [7:0]colour_primaries;
|
242 |
|
|
wire [7:0]transfer_characteristics;
|
243 |
|
|
output wire [7:0]matrix_coefficients;
|
244 |
|
|
output wire[13:0]display_horizontal_size;
|
245 |
|
|
output wire[13:0]display_vertical_size;
|
246 |
|
|
|
247 |
|
|
/* in picture coding extension */
|
248 |
|
|
wire [3:0]f_code_00;
|
249 |
|
|
wire [3:0]f_code_01;
|
250 |
|
|
wire [3:0]f_code_10;
|
251 |
|
|
wire [3:0]f_code_11;
|
252 |
|
|
output wire [1:0]intra_dc_precision;
|
253 |
|
|
output wire [1:0]picture_structure;
|
254 |
|
|
output wire top_field_first;
|
255 |
|
|
wire frame_pred_frame_dct;
|
256 |
|
|
wire concealment_motion_vectors;
|
257 |
|
|
output wire q_scale_type;
|
258 |
|
|
wire intra_vlc_format;
|
259 |
|
|
output wire alternate_scan;
|
260 |
|
|
output wire repeat_first_field;
|
261 |
|
|
wire chroma_420_type;
|
262 |
|
|
output wire progressive_frame;
|
263 |
|
|
wire composite_display_flag;
|
264 |
|
|
wire v_axis;
|
265 |
|
|
wire [2:0]field_sequence;
|
266 |
|
|
wire sub_carrier;
|
267 |
|
|
wire [6:0]burst_amplitude;
|
268 |
|
|
wire [7:0]sub_carrier_phase;
|
269 |
|
|
|
270 |
|
|
/* in group of pictures header */
|
271 |
|
|
wire drop_flag;
|
272 |
|
|
wire [4:0]time_code_hours;
|
273 |
|
|
wire [5:0]time_code_minutes;
|
274 |
|
|
wire [5:0]time_code_seconds;
|
275 |
|
|
wire [5:0]time_code_pictures;
|
276 |
|
|
wire closed_gop;
|
277 |
|
|
wire broken_link;
|
278 |
|
|
|
279 |
|
|
/* in picture header */
|
280 |
|
|
wire [9:0]temporal_reference;
|
281 |
|
|
output wire [2:0]picture_coding_type;
|
282 |
|
|
wire [15:0]vbv_delay;
|
283 |
|
|
wire full_pel_forward_vector;
|
284 |
|
|
wire [2:0]forward_f_code;
|
285 |
|
|
wire full_pel_backward_vector;
|
286 |
|
|
wire [2:0]backward_f_code;
|
287 |
|
|
|
288 |
|
|
/* in slice */
|
289 |
|
|
output reg [4:0]quantiser_scale_code;
|
290 |
|
|
reg slice_extension_flag;
|
291 |
|
|
reg intra_slice;
|
292 |
|
|
reg slice_picture_id_enable;
|
293 |
|
|
reg [5:0]slice_picture_id;
|
294 |
|
|
reg [7:0]slice_vertical_position;
|
295 |
|
|
reg first_macroblock_of_slice;
|
296 |
|
|
|
297 |
|
|
/* macroblock address increment */
|
298 |
|
|
wire [3:0]macroblock_addr_inc_length;
|
299 |
|
|
wire [5:0]macroblock_addr_inc_value;
|
300 |
|
|
wire [6:0]macroblock_addr_inc_value_ext = macroblock_addr_inc_value;
|
301 |
|
|
wire macroblock_addr_inc_escape;
|
302 |
|
|
reg [6:0]macroblock_address_increment;
|
303 |
|
|
/*
|
304 |
|
|
* macroblock address is valid after STATE_MACROBLOCK_TYPE and before STATE_NEXT_BLOCK.
|
305 |
|
|
* In particular: In the first slice of a picture, macroblock_address may be 0xffff after STATE_SLICE up to STATE_MACROBLOCK_TYPE.
|
306 |
|
|
*/
|
307 |
|
|
output reg [12:0]macroblock_address; // High Level: macroblock_address is 13 bits, 0..8159, 8160..8191 unused.
|
308 |
|
|
reg [10:0]empty_blocks;
|
309 |
|
|
|
310 |
|
|
/* macroblock type */
|
311 |
|
|
wire [3:0]macroblock_type_length;
|
312 |
|
|
wire [5:0]macroblock_type_value;
|
313 |
|
|
reg macroblock_quant;
|
314 |
|
|
output reg macroblock_motion_forward;
|
315 |
|
|
output reg macroblock_motion_backward;
|
316 |
|
|
reg macroblock_pattern;
|
317 |
|
|
output reg macroblock_intra;
|
318 |
|
|
reg macroblock_type_intra;
|
319 |
|
|
reg spatial_temporal_weight_code_flag; // ought always to be zero, as we don't do scaleability
|
320 |
|
|
output reg [1:0]motion_type; // one reg for both frame_motion_type and field_motion_type
|
321 |
|
|
output reg dct_type; // dct_type == 1 : field dct coded; dct_type == 0 : frame dct coded
|
322 |
|
|
/* derived variables (par. 6.3.17.1, tables 6.17 and 6.18) */
|
323 |
|
|
wire motion_vector_count_is_one;
|
324 |
|
|
reg [1:0]mv_format;
|
325 |
|
|
reg dmv;
|
326 |
|
|
|
327 |
|
|
/* motion vectors */
|
328 |
|
|
reg [2:0]motion_vector; // current motion vector
|
329 |
|
|
reg [7:0]motion_vector_reg; // bitmask of motion vectors present
|
330 |
|
|
reg [3:0]r_size; // f_code_xx - 4'd1;
|
331 |
|
|
wire vertical_field_select_present;
|
332 |
|
|
reg [4:0]motion_code;
|
333 |
|
|
reg motion_code_neg;
|
334 |
|
|
reg [7:0]motion_code_residual; // motion_code_residual has up to r_size = f_code_xx - 1 bits. (par. 6.3.17.3) with f_code = 1..9 (Table E-8, high level)
|
335 |
|
|
reg signed [1:0]dmvector;
|
336 |
|
|
|
337 |
|
|
/*
|
338 |
|
|
* par. 7.6.3.1, if f_code_xx = 15 the pmv range low..high would need 21 bits.
|
339 |
|
|
* But restricting ourselves to high level@high profile allows us to pack
|
340 |
|
|
* the motion vectors tighter.
|
341 |
|
|
* Table E-8: for High Level f_code_0_0, f_code_1_0: 1..9
|
342 |
|
|
* f_code_0_1, f_code_1_1: 1..5
|
343 |
|
|
*
|
344 |
|
|
* Hence all f_code values are in the range 1..9.
|
345 |
|
|
* This implies the motion vectors are in the range -4096..4095. (par. 7.6.3.1)
|
346 |
|
|
* This means we can represent all motion vectors with 13 bits.
|
347 |
|
|
*
|
348 |
|
|
*/
|
349 |
|
|
output reg signed [12:0]pmv_0_0_0;
|
350 |
|
|
output reg signed [12:0]pmv_0_0_1;
|
351 |
|
|
output reg signed [12:0]pmv_1_0_0;
|
352 |
|
|
output reg signed [12:0]pmv_1_0_1;
|
353 |
|
|
output reg signed [12:0]pmv_0_1_0;
|
354 |
|
|
output reg signed [12:0]pmv_0_1_1;
|
355 |
|
|
output reg signed [12:0]pmv_1_1_0;
|
356 |
|
|
output reg signed [12:0]pmv_1_1_1;
|
357 |
|
|
output reg signed [12:0]dmv_0_0; // dual-prime motion vectors
|
358 |
|
|
output reg signed [12:0]dmv_1_0;
|
359 |
|
|
output reg signed [12:0]dmv_0_1;
|
360 |
|
|
output reg signed [12:0]dmv_1_1;
|
361 |
|
|
|
362 |
|
|
/* motion vector pipeline, stage 1 */
|
363 |
|
|
reg [2:0]motion_vector_0;
|
364 |
|
|
reg motion_vector_valid_0;
|
365 |
|
|
reg motion_code_neg_0;
|
366 |
|
|
reg [3:0]r_size_0;
|
367 |
|
|
reg signed [1:0]dmvector_0;
|
368 |
|
|
reg signed [12:0]pmv_0;
|
369 |
|
|
reg signed [12:0]pmv_delta_0;
|
370 |
|
|
|
371 |
|
|
/* motion vector pipeline, stage 2 */
|
372 |
|
|
reg [2:0]motion_vector_1;
|
373 |
|
|
reg motion_vector_valid_1;
|
374 |
|
|
reg [3:0]r_size_1;
|
375 |
|
|
reg signed [1:0]dmvector_1;
|
376 |
|
|
reg signed [12:0]pmv_1;
|
377 |
|
|
|
378 |
|
|
/* motion vector pipeline, stage 3 */
|
379 |
|
|
reg [2:0]motion_vector_2;
|
380 |
|
|
reg motion_vector_valid_2;
|
381 |
|
|
reg signed [1:0]dmvector_2;
|
382 |
|
|
reg signed [12:0]pmv_2;
|
383 |
|
|
|
384 |
|
|
/* motion vector pipeline, stage 4 */
|
385 |
|
|
reg [2:0]motion_vector_3;
|
386 |
|
|
reg motion_vector_valid_3;
|
387 |
|
|
reg signed [12:0]pmv_3;
|
388 |
|
|
reg signed [1:0]dmvector_3;
|
389 |
|
|
|
390 |
|
|
/* motion vector pipeline, stage 5 */
|
391 |
|
|
reg [2:0]motion_vector_4;
|
392 |
|
|
reg motion_vector_valid_4;
|
393 |
|
|
reg signed [12:0]pmv_4;
|
394 |
|
|
|
395 |
|
|
/* motion vector pipeline, stage 6 */
|
396 |
|
|
reg [2:0]motion_vector_5;
|
397 |
|
|
reg motion_vector_valid_5;
|
398 |
|
|
reg signed [12:0]pmv_5;
|
399 |
|
|
|
400 |
|
|
/* motion vector pipeline, output */
|
401 |
|
|
output reg motion_vector_valid; // motion_vector valid is asserted when pmv_x_x_x dmv_x_x valid
|
402 |
|
|
|
403 |
|
|
/* coded block pattern */
|
404 |
|
|
reg [11:0]coded_block_pattern; // derived from coded_block_pattern_420, coded_block_pattern_1 and coded_block_pattern_2
|
405 |
|
|
|
406 |
|
|
/* dct coefficients */
|
407 |
|
|
reg [3:0]dct_dc_size; // holds dct_dc_size_luminance or dct_dc_size_chrominance, depending.
|
408 |
|
|
reg [10:0]dct_dc_pred; // dct_dc_pred_0, dct_dc_pred_1 or dct_dc_pred_2, depending upon whether it's a Y, Cr or Cb block.
|
409 |
|
|
|
410 |
|
|
reg [10:0]dct_dc_pred_0; // luminance (Y) dct dc predictor, par. 7.2.1
|
411 |
|
|
reg [10:0]dct_dc_pred_1; // first chrominance (Cb) dct dc predictor, par. 7.2.1
|
412 |
|
|
reg [10:0]dct_dc_pred_2; // second chrominance (Cr) dct dc predictor, par. 7.2.1
|
413 |
|
|
|
414 |
|
|
/*
|
415 |
|
|
* Each bit in block_pattern_code, block_lumi_code, ... corresponds to a block.
|
416 |
|
|
* The first block corresponds to the leftmost bit (= bit 11) the second block to bit 10, etc.
|
417 |
|
|
*
|
418 |
|
|
* For instance, this is what things look like before the first block of a 4:2:0 macroblock:
|
419 |
|
|
*
|
420 |
|
|
* testbench.mpeg2_decoder.vld STATE_BLOCK
|
421 |
|
|
* testbench.mpeg2_decoder.vld coded_block_pattern: b111111000000
|
422 |
|
|
* testbench.mpeg2_decoder.vld block_pattern_code: b111111000000
|
423 |
|
|
* testbench.mpeg2_decoder.vld block_lumi_code: b011110
|
424 |
|
|
* testbench.mpeg2_decoder.vld block_chromi1_code: b0000010101010
|
425 |
|
|
* testbench.mpeg2_decoder.vld block_chromi2_code: b0000001010101
|
426 |
|
|
*
|
427 |
|
|
* 6 blocks, first 4 luminance blocks, then a chromi1 (Cb) block, finally a chromi2 (Cr) block.
|
428 |
|
|
* Each block, block_pattern_code, block_lumi_code, block_chromi1_code and block_chromi2_code shift left one bit:
|
429 |
|
|
*
|
430 |
|
|
* testbench.mpeg2_decoder.vld STATE_NEXT_BLOCK
|
431 |
|
|
* testbench.mpeg2_decoder.vld coded_block_pattern: b111110000000
|
432 |
|
|
* testbench.mpeg2_decoder.vld block_pattern_code: b111110000000
|
433 |
|
|
* testbench.mpeg2_decoder.vld block_lumi_code: b111100
|
434 |
|
|
* testbench.mpeg2_decoder.vld block_chromi1_code: b0000101010100
|
435 |
|
|
* testbench.mpeg2_decoder.vld block_chromi2_code: b0000010101010
|
436 |
|
|
* ...
|
437 |
|
|
* testbench.mpeg2_decoder.vld STATE_NEXT_BLOCK
|
438 |
|
|
* testbench.mpeg2_decoder.vld coded_block_pattern: b111100000000
|
439 |
|
|
* testbench.mpeg2_decoder.vld block_pattern_code: b111100000000
|
440 |
|
|
* testbench.mpeg2_decoder.vld block_lumi_code: b111000
|
441 |
|
|
* testbench.mpeg2_decoder.vld block_chromi1_code: b0001010101000
|
442 |
|
|
* testbench.mpeg2_decoder.vld block_chromi2_code: b0000101010100
|
443 |
|
|
* ...
|
444 |
|
|
*
|
445 |
|
|
* The loop ends when all bits have been shifted out of block_pattern_code:
|
446 |
|
|
*
|
447 |
|
|
* testbench.mpeg2_decoder.vld STATE_NEXT_BLOCK
|
448 |
|
|
* testbench.mpeg2_decoder.vld coded_block_pattern: b000000000000
|
449 |
|
|
* testbench.mpeg2_decoder.vld block_pattern_code: b000000000000
|
450 |
|
|
* testbench.mpeg2_decoder.vld block_lumi_code: b000000
|
451 |
|
|
* testbench.mpeg2_decoder.vld block_chromi1_code: b0101010000000
|
452 |
|
|
* testbench.mpeg2_decoder.vld block_chromi2_code: b1010101000000
|
453 |
|
|
*
|
454 |
|
|
* Note there still remain bits in block_chromi1_code and block_chromi2_code:
|
455 |
|
|
* these would have been used in 4:2:2 and 4:4:4 video.
|
456 |
|
|
*
|
457 |
|
|
*/
|
458 |
|
|
|
459 |
|
|
reg [11:0]block_pattern_code; // block_pattern_code[i] is one if the corresponding block exists in the macroblock.
|
460 |
|
|
reg [12:7]block_lumi_code; // block_lumi_code[i] is one if the corresponding block is a luminance block. bits 6:0 are always zero.
|
461 |
|
|
reg [12:0]block_chromi1_code; // block_chromi1_code[i] is one if the corresponding block is a Cb chrominance block.
|
462 |
|
|
reg [12:0]block_chromi2_code; // block_chromi2_code[i] is one if the corresponding block is a Cr chrominance block.
|
463 |
|
|
|
464 |
|
|
wire dct_coefficient_escape;
|
465 |
|
|
output reg [5:0]dct_coeff_run;
|
466 |
|
|
output reg signed [11:0]dct_coeff_signed_level;
|
467 |
|
|
output reg dct_coeff_end; // asserted after last dct_coeff_run/dct_coeff_signed_level
|
468 |
|
|
reg dct_coeff_valid;
|
469 |
|
|
reg dct_error; // set when error occurs in dct decoding
|
470 |
|
|
reg [5:0]dct_coeff_run_0;
|
471 |
|
|
reg signed [11:0]dct_coeff_signed_level_0;
|
472 |
|
|
reg dct_coeff_valid_0;
|
473 |
|
|
reg dct_coeff_end_0;
|
474 |
|
|
reg dct_coeff_apply_signbit_0;
|
475 |
|
|
output reg rld_wr_en; // asserted when dct_coeff_run, dct_coeff_signed_level, and dct_coeff_end valid, or when quantizer rams need update
|
476 |
|
|
output reg [1:0]rld_cmd; // RLD_DCT when dct_coeff_run, dct_coeff_signed_level, and dct_coeff_end valid, RLD_QUANT when quantizer rams need update, RLD_NOOP otherwise
|
477 |
|
|
|
478 |
|
|
/* coded block pattern vlc lookup */
|
479 |
|
|
wire [3:0]coded_block_pattern_length;
|
480 |
|
|
wire [5:0]coded_block_pattern_value;
|
481 |
|
|
|
482 |
|
|
/* motion code vlc lookup */
|
483 |
|
|
wire [3:0]motion_code_length;
|
484 |
|
|
wire [4:0]motion_code_value;
|
485 |
|
|
wire motion_code_sign;
|
486 |
|
|
|
487 |
|
|
/* dmvector vlc lookup */
|
488 |
|
|
wire [1:0]dmvector_length;
|
489 |
|
|
wire dmvector_value;
|
490 |
|
|
wire dmvector_sign;
|
491 |
|
|
|
492 |
|
|
/* dct dc size luminance vlc lookup */
|
493 |
|
|
wire [3:0]dct_dc_size_luminance_length;
|
494 |
|
|
wire [4:0]dct_dc_size_luminance_value;
|
495 |
|
|
|
496 |
|
|
/* dct dc size chrominance vlc lookup */
|
497 |
|
|
wire [3:0]dct_dc_size_chrominance_length;
|
498 |
|
|
wire [4:0]dct_dc_size_chrominance_value;
|
499 |
|
|
|
500 |
|
|
/* dct coefficient 0 vlc lookup */
|
501 |
|
|
reg [15:0]dct_coefficient_0_decoded;
|
502 |
|
|
reg [15:0]dct_non_intra_first_coefficient_0_decoded;
|
503 |
|
|
|
504 |
|
|
/* dct coefficient 1 vlc lookup */
|
505 |
|
|
reg [15:0]dct_coefficient_1_decoded;
|
506 |
|
|
|
507 |
|
|
`include "vlc_tables.v"
|
508 |
|
|
|
509 |
|
|
/* next state logic */
|
510 |
|
|
always @*
|
511 |
|
|
casex (state)
|
512 |
|
|
STATE_NEXT_START_CODE: if (getbits == 24'h000001) next = STATE_START_CODE;
|
513 |
|
|
else next = STATE_NEXT_START_CODE;
|
514 |
|
|
|
515 |
|
|
STATE_START_CODE: casex(getbits[7:0])
|
516 |
|
|
CODE_PICTURE_START: if (sequence_header_seen & sequence_extension_seen) next = STATE_PICTURE_HEADER;
|
517 |
|
|
else next = STATE_NEXT_START_CODE;
|
518 |
|
|
CODE_USER_DATA_START: next = STATE_NEXT_START_CODE;
|
519 |
|
|
CODE_SEQUENCE_HEADER: next = STATE_SEQUENCE_HEADER;
|
520 |
|
|
CODE_SEQUENCE_ERROR: next = STATE_NEXT_START_CODE;
|
521 |
|
|
CODE_EXTENSION_START: next = STATE_EXTENSION_START_CODE;
|
522 |
|
|
CODE_SEQUENCE_END: next = STATE_SEQUENCE_END;
|
523 |
|
|
CODE_GROUP_START: next = STATE_GROUP_HEADER;
|
524 |
|
|
8'h01,
|
525 |
|
|
8'h02,
|
526 |
|
|
8'h03,
|
527 |
|
|
8'h04,
|
528 |
|
|
8'h05,
|
529 |
|
|
8'h06,
|
530 |
|
|
8'h07,
|
531 |
|
|
8'h08,
|
532 |
|
|
8'h09,
|
533 |
|
|
8'h0a,
|
534 |
|
|
8'h0b,
|
535 |
|
|
8'h0c,
|
536 |
|
|
8'h0d,
|
537 |
|
|
8'h0e,
|
538 |
|
|
8'h0f,
|
539 |
|
|
8'h1x,
|
540 |
|
|
8'h2x,
|
541 |
|
|
8'h3x,
|
542 |
|
|
8'h4x,
|
543 |
|
|
8'h5x,
|
544 |
|
|
8'h6x,
|
545 |
|
|
8'h7x,
|
546 |
|
|
8'h8x,
|
547 |
|
|
8'h9x,
|
548 |
|
|
8'hax: if (sequence_header_seen & sequence_extension_seen & picture_header_seen) next = STATE_SLICE;
|
549 |
|
|
else next = STATE_NEXT_START_CODE;
|
550 |
|
|
default next = STATE_NEXT_START_CODE;
|
551 |
|
|
endcase
|
552 |
|
|
|
553 |
|
|
STATE_EXTENSION_START_CODE: casex(getbits[23:20])
|
554 |
|
|
EXT_SEQUENCE: next = STATE_SEQUENCE_EXT;
|
555 |
|
|
EXT_SEQUENCE_DISPLAY: next = STATE_SEQUENCE_DISPLAY_EXT;
|
556 |
|
|
EXT_QUANT_MATRIX: next = STATE_QUANT_MATRIX_EXT;
|
557 |
|
|
EXT_COPYRIGHT: next = STATE_NEXT_START_CODE;
|
558 |
|
|
EXT_SEQUENCE_SCALABLE: next = STATE_NEXT_START_CODE;
|
559 |
|
|
EXT_PICTURE_DISPLAY: next = STATE_NEXT_START_CODE; // Pan & scan
|
560 |
|
|
EXT_PICTURE_CODING: next = STATE_PICTURE_CODING_EXT;
|
561 |
|
|
EXT_PICTURE_SPATIAL_SCALABLE: next = STATE_NEXT_START_CODE;
|
562 |
|
|
EXT_PICTURE_TEMPORAL_SCALABLE: next = STATE_NEXT_START_CODE;
|
563 |
|
|
EXT_CAMERA_PARAMETERS: next = STATE_NEXT_START_CODE;
|
564 |
|
|
EXT_ITU_T: next = STATE_NEXT_START_CODE;
|
565 |
|
|
default next = STATE_NEXT_START_CODE;
|
566 |
|
|
endcase
|
567 |
|
|
|
568 |
|
|
/* par. 6.2.2.1: sequence header */
|
569 |
|
|
STATE_SEQUENCE_HEADER: next = STATE_SEQUENCE_HEADER0;
|
570 |
|
|
|
571 |
|
|
STATE_SEQUENCE_HEADER0: next = STATE_SEQUENCE_HEADER1;
|
572 |
|
|
|
573 |
|
|
STATE_SEQUENCE_HEADER1: next = STATE_SEQUENCE_HEADER2;
|
574 |
|
|
|
575 |
|
|
STATE_SEQUENCE_HEADER2: if (getbits[5] || ~STRICT_MARKER_BIT) next = STATE_SEQUENCE_HEADER3; // check marker bit
|
576 |
|
|
else next = STATE_SEQUENCE_HEADER3;
|
577 |
|
|
|
578 |
|
|
STATE_SEQUENCE_HEADER3: if (getbits[12]) next = STATE_LD_INTRA_QUANT0;
|
579 |
|
|
else if (getbits[11]) next = STATE_LD_NON_INTRA_QUANT0;
|
580 |
|
|
else next = STATE_NEXT_START_CODE;
|
581 |
|
|
|
582 |
|
|
STATE_LD_INTRA_QUANT0: if (cnt != 6'b111111) next = STATE_LD_INTRA_QUANT0;
|
583 |
|
|
else if (getbits[15]) next = STATE_LD_NON_INTRA_QUANT0;
|
584 |
|
|
else next = STATE_NEXT_START_CODE;
|
585 |
|
|
|
586 |
|
|
STATE_LD_NON_INTRA_QUANT0: if (cnt != 6'b111111) next = STATE_LD_NON_INTRA_QUANT0;
|
587 |
|
|
else next = STATE_NEXT_START_CODE;
|
588 |
|
|
|
589 |
|
|
/* par. 6.2.2.3: Sequence extension */
|
590 |
|
|
STATE_SEQUENCE_EXT: next = STATE_SEQUENCE_EXT0;
|
591 |
|
|
|
592 |
|
|
STATE_SEQUENCE_EXT0: if (getbits[11] || ~STRICT_MARKER_BIT) next = STATE_SEQUENCE_EXT1; // check marker bit
|
593 |
|
|
else next = STATE_ERROR;
|
594 |
|
|
|
595 |
|
|
STATE_SEQUENCE_EXT1: next = STATE_NEXT_START_CODE;
|
596 |
|
|
|
597 |
|
|
/* par. 6.2.2.4: Sequence display extension */
|
598 |
|
|
STATE_SEQUENCE_DISPLAY_EXT: if (getbits[20]) next = STATE_SEQUENCE_DISPLAY_EXT0;
|
599 |
|
|
else next = STATE_SEQUENCE_DISPLAY_EXT1;
|
600 |
|
|
|
601 |
|
|
STATE_SEQUENCE_DISPLAY_EXT0: next = STATE_SEQUENCE_DISPLAY_EXT1;
|
602 |
|
|
|
603 |
|
|
STATE_SEQUENCE_DISPLAY_EXT1: if (getbits[9]) next = STATE_SEQUENCE_DISPLAY_EXT2;
|
604 |
|
|
else next = STATE_NEXT_START_CODE;
|
605 |
|
|
|
606 |
|
|
STATE_SEQUENCE_DISPLAY_EXT2: next = STATE_NEXT_START_CODE;
|
607 |
|
|
|
608 |
|
|
/* par. 6.2.3.2: Quant matrix extension */
|
609 |
|
|
STATE_QUANT_MATRIX_EXT: if (getbits[23]) next = STATE_LD_INTRA_QUANT1;
|
610 |
|
|
else if (getbits[22]) next = STATE_LD_NON_INTRA_QUANT1;
|
611 |
|
|
else if (getbits[21]) next = STATE_LD_CHROMA_INTRA_QUANT1;
|
612 |
|
|
else if (getbits[20]) next = STATE_LD_CHROMA_NON_INTRA_QUANT1;
|
613 |
|
|
else next = STATE_NEXT_START_CODE;
|
614 |
|
|
|
615 |
|
|
STATE_LD_INTRA_QUANT1: if (cnt != 6'b111111) next = STATE_LD_INTRA_QUANT1;
|
616 |
|
|
else if (getbits[14]) next = STATE_LD_NON_INTRA_QUANT1;
|
617 |
|
|
else if (getbits[13]) next = STATE_LD_CHROMA_INTRA_QUANT1;
|
618 |
|
|
else if (getbits[12]) next = STATE_LD_CHROMA_NON_INTRA_QUANT1;
|
619 |
|
|
else next = STATE_NEXT_START_CODE;
|
620 |
|
|
|
621 |
|
|
STATE_LD_NON_INTRA_QUANT1: if (cnt != 6'b111111) next = STATE_LD_NON_INTRA_QUANT1;
|
622 |
|
|
else if (getbits[13]) next = STATE_LD_CHROMA_INTRA_QUANT1;
|
623 |
|
|
else if (getbits[12]) next = STATE_LD_CHROMA_NON_INTRA_QUANT1;
|
624 |
|
|
else next = STATE_NEXT_START_CODE;
|
625 |
|
|
|
626 |
|
|
STATE_LD_CHROMA_INTRA_QUANT1: if (cnt != 6'b111111) next = STATE_LD_CHROMA_INTRA_QUANT1;
|
627 |
|
|
else if (getbits[12]) next = STATE_LD_CHROMA_NON_INTRA_QUANT1;
|
628 |
|
|
else next = STATE_NEXT_START_CODE;
|
629 |
|
|
|
630 |
|
|
STATE_LD_CHROMA_NON_INTRA_QUANT1: if (cnt != 6'b111111) next = STATE_LD_CHROMA_NON_INTRA_QUANT1;
|
631 |
|
|
else next = STATE_NEXT_START_CODE;
|
632 |
|
|
|
633 |
|
|
/* par. 6.2.3.1: Picture coding extension */
|
634 |
|
|
STATE_PICTURE_CODING_EXT: next = STATE_PICTURE_CODING_EXT0;
|
635 |
|
|
|
636 |
|
|
STATE_PICTURE_CODING_EXT0: if (getbits[10]) next = STATE_PICTURE_CODING_EXT1;
|
637 |
|
|
else next = STATE_NEXT_START_CODE;
|
638 |
|
|
|
639 |
|
|
STATE_PICTURE_CODING_EXT1: next = STATE_NEXT_START_CODE;
|
640 |
|
|
|
641 |
|
|
/* par. 6.2.2.6: group of pictures header */
|
642 |
|
|
STATE_GROUP_HEADER: next = STATE_GROUP_HEADER0;
|
643 |
|
|
|
644 |
|
|
STATE_GROUP_HEADER0: next = STATE_NEXT_START_CODE;
|
645 |
|
|
|
646 |
|
|
/* par. 6.2.3: picture header */
|
647 |
|
|
STATE_PICTURE_HEADER: next = STATE_PICTURE_HEADER0;
|
648 |
|
|
|
649 |
|
|
STATE_PICTURE_HEADER0: if ((picture_coding_type == 3'h2) || (picture_coding_type == 3'h3)) next = STATE_PICTURE_HEADER1;
|
650 |
|
|
else next = STATE_NEXT_START_CODE;
|
651 |
|
|
|
652 |
|
|
STATE_PICTURE_HEADER1: if (picture_coding_type == 3'h3) next = STATE_PICTURE_HEADER2;
|
653 |
|
|
else next = STATE_NEXT_START_CODE;
|
654 |
|
|
|
655 |
|
|
STATE_PICTURE_HEADER2: next = STATE_NEXT_START_CODE;
|
656 |
|
|
|
657 |
|
|
/* par. 6.2.4: slice */
|
658 |
|
|
STATE_SLICE: if (getbits[18]) next = STATE_SLICE_EXTENSION; // getbits[18] is slice_extension_flag
|
659 |
|
|
else next = STATE_NEXT_MACROBLOCK;
|
660 |
|
|
|
661 |
|
|
STATE_SLICE_EXTENSION: if (getbits[15]) next = STATE_SLICE_EXTRA_INFORMATION; // getbits[15] is extra_bit_slice
|
662 |
|
|
else next = STATE_NEXT_MACROBLOCK;
|
663 |
|
|
|
664 |
|
|
STATE_SLICE_EXTRA_INFORMATION: if (getbits[15]) next = STATE_SLICE_EXTRA_INFORMATION; // getbits[15] indicates another extra_information_slice byte follows
|
665 |
|
|
else next = STATE_NEXT_MACROBLOCK;
|
666 |
|
|
|
667 |
|
|
STATE_NEXT_MACROBLOCK: if (macroblock_addr_inc_escape) next = STATE_NEXT_MACROBLOCK; // macroblock address escape
|
668 |
|
|
else if (macroblock_addr_inc_value == 6'd0) next = STATE_ERROR;
|
669 |
|
|
else if (first_macroblock_of_slice) next = STATE_MACROBLOCK_TYPE; // par. 6.3.16.1: syntax does not allow the first and last macroblock of a slice to be skipped
|
670 |
|
|
else if ((macroblock_address_increment + macroblock_addr_inc_value_ext) != 7'd1) next = STATE_MACROBLOCK_SKIP; // macroblocks skipped. macroblock_address_increment + macroblock_addr_inc_value_ext is next value of macroblock_address_increment.
|
671 |
|
|
else next = STATE_MACROBLOCK_TYPE;
|
672 |
|
|
|
673 |
|
|
STATE_MACROBLOCK_SKIP: if (macroblock_address_increment == 7'd1) next = STATE_MACROBLOCK_TYPE;
|
674 |
|
|
else next = STATE_DELAY_EMPTY_BLOCK;
|
675 |
|
|
|
676 |
|
|
STATE_DELAY_EMPTY_BLOCK: next = STATE_EMIT_EMPTY_BLOCK; // to avoid motion vector and dct_coeff valid at same moment
|
677 |
|
|
|
678 |
|
|
STATE_EMIT_EMPTY_BLOCK: if ((empty_blocks[10] == 1'b0) && (macroblock_address_increment == 7'd1)) next = STATE_MACROBLOCK_TYPE;
|
679 |
|
|
else if (empty_blocks[10] == 1'b0) next = STATE_MACROBLOCK_SKIP; // STATE_EMIT_EMPTY_BLOCK emits a block of 8x8 zeroes. par. 7.7.2.
|
680 |
|
|
else next = STATE_EMIT_EMPTY_BLOCK;
|
681 |
|
|
|
682 |
|
|
STATE_MACROBLOCK_TYPE: /* This is what the following lines should look like, only the variables haven't been clocked in yet,
|
683 |
|
|
* so we address macroblock_type_value directly.
|
684 |
|
|
* if ((macroblock_type_length == 4'b0) || (spatial_temporal_weight_code_flag)) next = STATE_ERROR; // we don't do scaleability
|
685 |
|
|
* else next = STATE_MOTION_TYPE; // frame or field motion_type
|
686 |
|
|
*/
|
687 |
|
|
|
688 |
|
|
// macroblock_type_length == 0 if macroblock_type code lookup fails.
|
689 |
|
|
// macroblock_type_value[0] indicates scaleability; we don't do scaleability.
|
690 |
|
|
if ((macroblock_type_length == 4'b0) || macroblock_type_value[0]) next = STATE_ERROR; // we don't do scaleability
|
691 |
|
|
else next = STATE_MOTION_TYPE; // frame or field motion_type
|
692 |
|
|
|
693 |
|
|
STATE_MOTION_TYPE: if ((picture_structure == FRAME_PICTURE) && (frame_pred_frame_dct == 1'b0) && (macroblock_intra || macroblock_pattern)) next = STATE_DCT_TYPE;
|
694 |
|
|
else next = STATE_MACROBLOCK_QUANT;
|
695 |
|
|
|
696 |
|
|
STATE_DCT_TYPE: next = STATE_MACROBLOCK_QUANT;
|
697 |
|
|
|
698 |
|
|
STATE_MACROBLOCK_QUANT: next = STATE_NEXT_MOTION_VECTOR;
|
699 |
|
|
|
700 |
|
|
/* motion_vectors */
|
701 |
|
|
STATE_NEXT_MOTION_VECTOR: if (motion_vector_reg == 8'b0) next = STATE_MOTION_PIPELINE_FLUSH;
|
702 |
|
|
// motion_vector_reg[7] indicates whether the current motion_vector is present
|
703 |
|
|
else if (motion_vector_reg[7] && vertical_field_select_present) next = STATE_MOTION_VERT_FLD_SEL;
|
704 |
|
|
else if (motion_vector_reg[7]) next = STATE_MOTION_CODE;
|
705 |
|
|
else next = STATE_NEXT_MOTION_VECTOR; // increment motion_vector; shift motion_vector_reg one bit to the left
|
706 |
|
|
|
707 |
|
|
STATE_MOTION_PIPELINE_FLUSH: if (motion_vector_valid_0 || motion_vector_valid_1 || motion_vector_valid_2 || motion_vector_valid_3 || motion_vector_valid_4 || motion_vector_valid_5) next = STATE_MOTION_PIPELINE_FLUSH; // wait for motion vector pipeline to flush.
|
708 |
|
|
else // no more motion vectors present, motion vector pipeline empty.
|
709 |
|
|
begin
|
710 |
|
|
if (macroblock_intra && concealment_motion_vectors) next = STATE_MARKER_BIT_0;
|
711 |
|
|
else if (macroblock_pattern) next = STATE_CODED_BLOCK_PATTERN;
|
712 |
|
|
else next = STATE_BLOCK;
|
713 |
|
|
end
|
714 |
|
|
|
715 |
|
|
STATE_MOTION_VERT_FLD_SEL: next = STATE_MOTION_CODE; // motion_vectors(0), motion_vertical_field_select(0,0)
|
716 |
|
|
|
717 |
|
|
STATE_MOTION_CODE: // motion_vectors(0), motion_vector(0,0), motion_code(0,0,0)
|
718 |
|
|
if (motion_code_length == 4'b0) next = STATE_ERROR;
|
719 |
|
|
else if ((r_size != 4'd0) && (getbits[23] != 1'b1)) next = STATE_MOTION_RESIDUAL; // (r_size != 4'd0) is equivalent to (f_code_xx != 4'd1)
|
720 |
|
|
else if (dmv) next = STATE_MOTION_DMVECTOR;
|
721 |
|
|
else next = STATE_MOTION_PREDICT;
|
722 |
|
|
|
723 |
|
|
STATE_MOTION_RESIDUAL: // motion_vectors(0), motion_vector(0,0), motion_residual(0,0,0)
|
724 |
|
|
if (dmv) next = STATE_MOTION_DMVECTOR;
|
725 |
|
|
else next = STATE_MOTION_PREDICT;
|
726 |
|
|
|
727 |
|
|
STATE_MOTION_DMVECTOR: // motion_vectors(0), motion_vector(0,0), dmvector(0)
|
728 |
|
|
if (dmvector_length == 2'b0) next = STATE_ERROR;
|
729 |
|
|
else next = STATE_MOTION_PREDICT;
|
730 |
|
|
|
731 |
|
|
STATE_MOTION_PREDICT: next = STATE_NEXT_MOTION_VECTOR; // increment motion_vector; shift motion_vector_reg one bit to the left
|
732 |
|
|
|
733 |
|
|
/* coded block pattern */
|
734 |
|
|
STATE_MARKER_BIT_0: // skip marker bit
|
735 |
|
|
if (~getbits[23] && STRICT_MARKER_BIT) next = STATE_ERROR;
|
736 |
|
|
else if (macroblock_pattern) next = STATE_CODED_BLOCK_PATTERN;
|
737 |
|
|
else next = STATE_BLOCK;
|
738 |
|
|
|
739 |
|
|
STATE_CODED_BLOCK_PATTERN: if (coded_block_pattern_length == 4'b0) next = STATE_ERROR; // Invalid coded_block_pattern code
|
740 |
|
|
else if (chroma_format == CHROMA422) next = STATE_CODED_BLOCK_PATTERN_1;
|
741 |
|
|
else if (chroma_format == CHROMA444) next = STATE_CODED_BLOCK_PATTERN_2;
|
742 |
|
|
else next = STATE_BLOCK;
|
743 |
|
|
|
744 |
|
|
STATE_CODED_BLOCK_PATTERN_1: next = STATE_BLOCK;
|
745 |
|
|
|
746 |
|
|
STATE_CODED_BLOCK_PATTERN_2: next = STATE_BLOCK;
|
747 |
|
|
|
748 |
|
|
/* DCT coefficients */
|
749 |
|
|
STATE_BLOCK: next = STATE_NEXT_BLOCK; // initialize coded_block_pattern, block_pattern_code, block_lumi_code, block_chromi1_code, block_chromi2_code
|
750 |
|
|
|
751 |
|
|
STATE_NEXT_BLOCK: if (coded_block_pattern[11] && macroblock_intra && block_lumi_code[11]) next = STATE_DCT_DC_LUMI_SIZE; // luminance block
|
752 |
|
|
else if (coded_block_pattern[11] && macroblock_intra) next = STATE_DCT_DC_CHROMI_SIZE; // chrominance block
|
753 |
|
|
else if (coded_block_pattern[11]) next = STATE_DCT_NON_INTRA_FIRST;
|
754 |
|
|
else if (block_pattern_code[11]) next = STATE_NON_CODED_BLOCK;
|
755 |
|
|
else if (block_pattern_code != 12'b0) next = STATE_NEXT_BLOCK; // shift block_pattern_code and block_lumi_code one bit, find next block
|
756 |
|
|
else if ((getbits[23:1] == 23'b0) || dct_error) next = STATE_NEXT_START_CODE; // end of slice, go to next start code (par. 6.2.4). In case of error, synchronize at next start code.
|
757 |
|
|
else next = STATE_NEXT_MACROBLOCK; // end of macroblock, but not end of slice: go to next macroblock.
|
758 |
|
|
|
759 |
|
|
STATE_DCT_DC_LUMI_SIZE: if (dct_dc_size_luminance_length == 4'b0) next = STATE_DCT_ERROR;
|
760 |
|
|
else next = STATE_DCT_DC_DIFF; // table B-12 lookup of first luminance dct coefficient
|
761 |
|
|
|
762 |
|
|
STATE_DCT_DC_CHROMI_SIZE: if (dct_dc_size_chrominance_length == 4'b0) next = STATE_DCT_ERROR;
|
763 |
|
|
else next = STATE_DCT_DC_DIFF; // table B-13 lookup of first chrominance dct coefficient
|
764 |
|
|
|
765 |
|
|
STATE_DCT_DC_DIFF: next = STATE_DCT_DC_DIFF_0;
|
766 |
|
|
|
767 |
|
|
STATE_DCT_DC_DIFF_0: if (intra_vlc_format) next = STATE_DCT_SUBS_B15; // see table 7-3. look up subsequent dct coefficient of intra block in table B-15
|
768 |
|
|
else next = STATE_DCT_SUBS_B14; // see table 7-3. look up subsequent dct coefficient of intra block in table B-14
|
769 |
|
|
|
770 |
|
|
STATE_DCT_SUBS_B15: // subsequent dct coefficients of intra block, as in table B-15
|
771 |
|
|
if (getbits[23:20] == 4'b0110) next = STATE_NEXT_BLOCK; // end of this block, go to next block
|
772 |
|
|
else if (dct_coefficient_escape) next = STATE_DCT_ESCAPE_B15; // Escape
|
773 |
|
|
else if (dct_coefficient_1_decoded[15:11] == 5'b0) next = STATE_DCT_ERROR; // unknown code
|
774 |
|
|
else next = STATE_DCT_SUBS_B15;
|
775 |
|
|
|
776 |
|
|
STATE_DCT_ESCAPE_B15: // table B-16 escapes to table B-15
|
777 |
|
|
next = STATE_DCT_SUBS_B15;
|
778 |
|
|
|
779 |
|
|
STATE_DCT_NON_INTRA_FIRST: // first dct coefficient of non-intra block, as in table B-14, note 2 and 3
|
780 |
|
|
if (dct_coefficient_escape) next = STATE_DCT_ESCAPE_B14; // table B-14 escape
|
781 |
|
|
else if (dct_non_intra_first_coefficient_0_decoded[15:11] == 5'b0) next = STATE_DCT_ERROR; // unknown code
|
782 |
|
|
else next = STATE_DCT_SUBS_B14;
|
783 |
|
|
|
784 |
|
|
STATE_DCT_SUBS_B14: // table B-14 (with B-16 escapes) lookup of subsequent dct coefficients.
|
785 |
|
|
if (getbits[23:22] == 2'b10) next = STATE_NEXT_BLOCK; // end of this block, go to next block
|
786 |
|
|
else if (dct_coefficient_escape) next = STATE_DCT_ESCAPE_B14; // Escape
|
787 |
|
|
else if (dct_coefficient_0_decoded[15:11] == 5'b0) next = STATE_DCT_ERROR; // unknown code
|
788 |
|
|
else next = STATE_DCT_SUBS_B14;
|
789 |
|
|
|
790 |
|
|
STATE_DCT_ESCAPE_B14: // table B-16 escapes to table B-15
|
791 |
|
|
next = STATE_DCT_SUBS_B14;
|
792 |
|
|
|
793 |
|
|
STATE_NON_CODED_BLOCK: next = STATE_NEXT_BLOCK; // Output end-of-block for all-zeroes non-coded block
|
794 |
|
|
|
795 |
|
|
STATE_DCT_ERROR: next = STATE_NON_CODED_BLOCK; // Output all remaining blocks as non-coded blocks. clears coded_block_pattern and sets dct_error and vld_err flags.
|
796 |
|
|
|
797 |
|
|
STATE_SEQUENCE_END: next = STATE_NEXT_START_CODE; // Output last frame
|
798 |
|
|
|
799 |
|
|
STATE_ERROR: next = STATE_NEXT_START_CODE;
|
800 |
|
|
|
801 |
|
|
default next = STATE_ERROR;
|
802 |
|
|
|
803 |
|
|
endcase
|
804 |
|
|
|
805 |
|
|
/* advance and align logic. advance is number of bits to advance the bitstream. */
|
806 |
|
|
always @*
|
807 |
|
|
if (~rst) next_advance = 5'b0;
|
808 |
|
|
else
|
809 |
|
|
case (state)
|
810 |
|
|
STATE_NEXT_START_CODE: next_advance = 5'd0; // next_advance is zero in STATE_INIT; but align = 1: we move one byte at a time.
|
811 |
|
|
STATE_START_CODE: next_advance = 5'd24; // skip over the 24'h0001sc, where sc = start_code
|
812 |
|
|
STATE_EXTENSION_START_CODE: next_advance = 5'd4; // skip over the extension start code
|
813 |
|
|
/* par. 6.2.2.1: sequence header */
|
814 |
|
|
STATE_SEQUENCE_HEADER: next_advance = 5'd12; // size of horizontal_size_value
|
815 |
|
|
STATE_SEQUENCE_HEADER0: next_advance = 5'd12; // size of vertical_size_value
|
816 |
|
|
STATE_SEQUENCE_HEADER1: next_advance = 5'd8; // size of aspect_ratio_information and frame_rate_code
|
817 |
|
|
STATE_SEQUENCE_HEADER2: next_advance = 5'd19; // size of bit_rate_value and marker bit
|
818 |
|
|
STATE_SEQUENCE_HEADER3: next_advance = 5'd12; // size of vbv_buffer_size[9:0], constrained_parameters_flag and load_intra_quantiser_matrix
|
819 |
|
|
STATE_LD_INTRA_QUANT0: next_advance = 5'd8; // size of one item of quantization table
|
820 |
|
|
STATE_LD_NON_INTRA_QUANT0: next_advance = 5'd8; // size of one item of quantization table
|
821 |
|
|
/* par. 6.2.2.3: Sequence extension */
|
822 |
|
|
STATE_SEQUENCE_EXT: next_advance = 5'd15; // size of profile_and_level_indication, progressive_sequence, chroma_format, horizontal_size ext, vertical_size ext.
|
823 |
|
|
STATE_SEQUENCE_EXT0: next_advance = 5'd13; // size of bit_rate ext, marker bit.
|
824 |
|
|
STATE_SEQUENCE_EXT1: next_advance = 5'd16; // size of vbv_buffer_size ext, low_delay, frame_rate_extension_n, frame_rate_extension_d
|
825 |
|
|
/* par. 6.2.2.4: Sequence display extension */
|
826 |
|
|
STATE_SEQUENCE_DISPLAY_EXT: next_advance = 5'd4; // size of video_format, colour_description
|
827 |
|
|
STATE_SEQUENCE_DISPLAY_EXT0: next_advance = 5'd24; // size of colour_primaries, transfer_characteristics, matrix_coefficients
|
828 |
|
|
STATE_SEQUENCE_DISPLAY_EXT1: next_advance = 5'd15; // size of display_horizontal_size, marker bit
|
829 |
|
|
STATE_SEQUENCE_DISPLAY_EXT2: next_advance = 5'd14; // size of display_vertical_size
|
830 |
|
|
/* par. 6.2.3.2: Quant matrix extension */
|
831 |
|
|
STATE_QUANT_MATRIX_EXT: next_advance = 5'd0; // no move
|
832 |
|
|
STATE_LD_INTRA_QUANT1: next_advance = 5'd8; // size of one item of quantization table
|
833 |
|
|
STATE_LD_NON_INTRA_QUANT1: next_advance = 5'd8; // size of one item of quantization table
|
834 |
|
|
STATE_LD_CHROMA_INTRA_QUANT1: next_advance = 5'd8; // size of one item of quantization table
|
835 |
|
|
STATE_LD_CHROMA_NON_INTRA_QUANT1: next_advance = 5'd8; // size of one item of quantization table
|
836 |
|
|
/* par. 6.2.3.1: Picture coding extension */
|
837 |
|
|
STATE_PICTURE_CODING_EXT: next_advance = 5'd16; // size of f_code_00, f_code_01, f_code_10, f_code_11
|
838 |
|
|
STATE_PICTURE_CODING_EXT0: next_advance = 5'd14; // size of intra_dc_precision .. composite_display_flag
|
839 |
|
|
STATE_PICTURE_CODING_EXT1: next_advance = 5'd20; // size of v_axis, field_sequence, sub_carrier, burst_amplitude, sub_carrier_phase
|
840 |
|
|
/* par. 6.2.2.6: group of pictures header */
|
841 |
|
|
STATE_GROUP_HEADER: next_advance = 5'd19;
|
842 |
|
|
STATE_GROUP_HEADER0: next_advance = 5'd8;
|
843 |
|
|
/* par. 6.2.3: picture header */
|
844 |
|
|
STATE_PICTURE_HEADER: next_advance = 5'd13; // size of temporal_reference, picture_coding_type
|
845 |
|
|
STATE_PICTURE_HEADER0: next_advance = 5'd16; // size of vbv_delay
|
846 |
|
|
STATE_PICTURE_HEADER1: next_advance = 5'd4; // size of full_pel_forward_vector, forward_f_code
|
847 |
|
|
STATE_PICTURE_HEADER2: next_advance = 5'd4; // size of full_pel_backward_vector, backward_f_code
|
848 |
|
|
|
849 |
|
|
/* par. 6.2.4: slice */
|
850 |
|
|
STATE_SLICE: next_advance = 5'd6;
|
851 |
|
|
STATE_SLICE_EXTENSION: next_advance = 5'd9;
|
852 |
|
|
STATE_SLICE_EXTRA_INFORMATION: next_advance = 5'd9;
|
853 |
|
|
STATE_NEXT_MACROBLOCK: next_advance = macroblock_addr_inc_length;
|
854 |
|
|
STATE_MACROBLOCK_SKIP: next_advance = 5'd0;
|
855 |
|
|
STATE_MACROBLOCK_TYPE: next_advance = macroblock_type_length;
|
856 |
|
|
STATE_MOTION_TYPE: next_advance = (macroblock_motion_forward || macroblock_motion_backward) ?
|
857 |
|
|
(((picture_structure == FRAME_PICTURE) && (frame_pred_frame_dct == 1'b1)) ? 5'd0 : 5'd2)
|
858 |
|
|
: 5'd0;
|
859 |
|
|
STATE_DCT_TYPE: next_advance = 5'd1;
|
860 |
|
|
STATE_MACROBLOCK_QUANT: next_advance = macroblock_quant ? 5'd5 : 5'd0;
|
861 |
|
|
|
862 |
|
|
STATE_NEXT_MOTION_VECTOR: next_advance = 5'd0;
|
863 |
|
|
STATE_MOTION_VERT_FLD_SEL: next_advance = 5'd1; // motion_vertical_field_select
|
864 |
|
|
STATE_MOTION_CODE: next_advance = motion_code_length; // motion_code
|
865 |
|
|
STATE_MOTION_RESIDUAL: next_advance = r_size; // motion_residual
|
866 |
|
|
STATE_MOTION_DMVECTOR: next_advance = dmvector_length; // dmvector
|
867 |
|
|
STATE_MOTION_PREDICT: next_advance = 5'd0;
|
868 |
|
|
STATE_MOTION_PIPELINE_FLUSH: next_advance = 5'd0;
|
869 |
|
|
|
870 |
|
|
STATE_MARKER_BIT_0: next_advance = 5'd1;
|
871 |
|
|
STATE_CODED_BLOCK_PATTERN: next_advance = coded_block_pattern_length;
|
872 |
|
|
STATE_CODED_BLOCK_PATTERN_1: next_advance = 5'd2;
|
873 |
|
|
STATE_CODED_BLOCK_PATTERN_2: next_advance = 5'd6;
|
874 |
|
|
STATE_BLOCK: next_advance = 5'd0;
|
875 |
|
|
STATE_NEXT_BLOCK: next_advance = 5'd0;
|
876 |
|
|
STATE_DCT_DC_LUMI_SIZE: next_advance = dct_dc_size_luminance_length;
|
877 |
|
|
STATE_DCT_DC_CHROMI_SIZE: next_advance = dct_dc_size_chrominance_length;
|
878 |
|
|
STATE_DCT_DC_DIFF: next_advance = dct_dc_size;
|
879 |
|
|
|
880 |
|
|
STATE_DCT_SUBS_B15: next_advance = dct_coefficient_escape ? 5'd12 : dct_coefficient_1_decoded[15:11]; // escape + fixed-length run encoding as in table B-16 or variable length encoding as in table B-15
|
881 |
|
|
STATE_DCT_ESCAPE_B15: next_advance = 5'd12; // 12-bit fixed-length signed_level (table B-16)
|
882 |
|
|
STATE_DCT_SUBS_B14: next_advance = dct_coefficient_escape ? 5'd12 : dct_coefficient_0_decoded[15:11]; // escape + fixed-length run encoding as in table B-16 or variable length encoding as in table B-14
|
883 |
|
|
STATE_DCT_ESCAPE_B14 : next_advance = 5'd12; // 12-bit fixed-length signed_level (table B-16)
|
884 |
|
|
STATE_DCT_NON_INTRA_FIRST: next_advance = dct_coefficient_escape ? 5'd12 : dct_non_intra_first_coefficient_0_decoded[15:11]; // escape + fixed-length run encoding as in table B-16 or variable length encoding as in table B-14, modified as in table b-14 note 2, 3
|
885 |
|
|
STATE_NON_CODED_BLOCK: next_advance = 5'd0;
|
886 |
|
|
STATE_DCT_ERROR: next_advance = 5'd0;
|
887 |
|
|
|
888 |
|
|
STATE_SEQUENCE_END: next_advance = 5'd0;
|
889 |
|
|
STATE_ERROR: next_advance = 5'd0;
|
890 |
|
|
|
891 |
|
|
/* default value */
|
892 |
|
|
default next_advance = 5'd0;
|
893 |
|
|
endcase
|
894 |
|
|
|
895 |
|
|
|
896 |
|
|
/*
|
897 |
|
|
* Note: align and advance are zero when clk_en is false;
|
898 |
|
|
* this avoids the fifo moving forward while the vld is not enabled.
|
899 |
|
|
*/
|
900 |
|
|
|
901 |
|
|
wire next_align = (state == STATE_NEXT_START_CODE);
|
902 |
|
|
|
903 |
|
|
always @(posedge clk)
|
904 |
|
|
if (~rst) align <= 1'b0;
|
905 |
|
|
else if (clk_en) align <= next_align;
|
906 |
|
|
else align <= 1'b0;
|
907 |
|
|
|
908 |
|
|
always @(posedge clk)
|
909 |
|
|
if (~rst) advance <= 1'b0;
|
910 |
|
|
else if (clk_en) advance <= next_advance;
|
911 |
|
|
else advance <= 1'b0;
|
912 |
|
|
|
913 |
|
|
/*
|
914 |
|
|
* wait_state is asserted if align or advance will be non-zero during the next clock cycle,
|
915 |
|
|
* and getbits will need to do some work.
|
916 |
|
|
* Unregistered output; the registering happens in getbits.
|
917 |
|
|
*/
|
918 |
|
|
output wait_state;
|
919 |
|
|
assign wait_state = ((next_align != 1'b0) || (next_advance != 4'b0));
|
920 |
|
|
|
921 |
|
|
/* state */
|
922 |
|
|
|
923 |
|
|
always @(posedge clk)
|
924 |
|
|
if(~rst) state <= STATE_NEXT_START_CODE;
|
925 |
|
|
else if (clk_en) state <= next;
|
926 |
|
|
else state <= state;
|
927 |
|
|
|
928 |
|
|
always @(posedge clk)
|
929 |
|
|
if (~rst) dct_error <= 1'b0;
|
930 |
|
|
else if (clk_en && (state == STATE_NEXT_START_CODE)) dct_error <= 1'b0;
|
931 |
|
|
else if (clk_en && (state == STATE_DCT_ERROR)) dct_error <= 1'b1;
|
932 |
|
|
else dct_error <= dct_error;
|
933 |
|
|
|
934 |
|
|
always @(posedge clk)
|
935 |
|
|
if (~rst) vld_err <= 1'b0;
|
936 |
|
|
else if (clk_en && (state == STATE_NEXT_START_CODE)) vld_err <= 1'b0;
|
937 |
|
|
else if (clk_en && ((state == STATE_ERROR) || (state == STATE_DCT_ERROR))) vld_err <= 1'b1;
|
938 |
|
|
else vld_err <= vld_err;
|
939 |
|
|
|
940 |
|
|
/* position in video stream */
|
941 |
|
|
|
942 |
|
|
always @(posedge clk)
|
943 |
|
|
if (~rst) sequence_header_seen <= 1'b0;
|
944 |
|
|
else if (clk_en && (state == STATE_SEQUENCE_HEADER)) sequence_header_seen <= 1'b1;
|
945 |
|
|
else if (clk_en && (state == STATE_SEQUENCE_END)) sequence_header_seen <= 1'b0;
|
946 |
|
|
else sequence_header_seen <= sequence_header_seen;
|
947 |
|
|
|
948 |
|
|
always @(posedge clk)
|
949 |
|
|
if (~rst) sequence_extension_seen <= 1'b0;
|
950 |
|
|
else if (clk_en && (state == STATE_SEQUENCE_EXT)) sequence_extension_seen <= 1'b1;
|
951 |
|
|
else if (clk_en && (state == STATE_SEQUENCE_END)) sequence_extension_seen <= 1'b0;
|
952 |
|
|
else sequence_extension_seen <= sequence_extension_seen;
|
953 |
|
|
|
954 |
|
|
always @(posedge clk)
|
955 |
|
|
if (~rst) picture_header_seen <= 1'b0;
|
956 |
|
|
else if (clk_en && (state == STATE_PICTURE_HEADER)) picture_header_seen <= 1'b1;
|
957 |
|
|
else if (clk_en && (state == STATE_SEQUENCE_END)) picture_header_seen <= 1'b0;
|
958 |
|
|
else picture_header_seen <= picture_header_seen;
|
959 |
|
|
|
960 |
|
|
/* par. 6.2.2.1: Sequence header */
|
961 |
|
|
loadreg #( .offset(16), .width(8), .fsm_state(STATE_START_CODE)) loadreg_start_code (.fsm_reg(start_code), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
962 |
|
|
loadreg #( .offset(0), .width(12), .fsm_state(STATE_SEQUENCE_HEADER)) loadreg_horizontal_size_lsb (.fsm_reg(horizontal_size[11:0]), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
963 |
|
|
loadreg #( .offset(0), .width(12), .fsm_state(STATE_SEQUENCE_HEADER0)) loadreg_vertical_size_lsb (.fsm_reg(vertical_size[11:0]), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
964 |
|
|
loadreg #( .offset(0), .width(4), .fsm_state(STATE_SEQUENCE_HEADER1)) loadreg_aspect_ratio_information(.fsm_reg(aspect_ratio_information), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
965 |
|
|
loadreg #( .offset(4), .width(4), .fsm_state(STATE_SEQUENCE_HEADER1)) loadreg_frame_rate_code(.fsm_reg(frame_rate_code), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
966 |
|
|
loadreg #( .offset(0), .width(18), .fsm_state(STATE_SEQUENCE_HEADER2)) loadreg_bit_rate_lsb(.fsm_reg(bit_rate[17:0]), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
967 |
|
|
loadreg #( .offset(0), .width(10), .fsm_state(STATE_SEQUENCE_HEADER3)) loadreg_vbv_buffer_size_lsb(.fsm_reg(vbv_buffer_size[9:0]), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
968 |
|
|
loadreg #( .offset(10), .width(1), .fsm_state(STATE_SEQUENCE_HEADER3)) loadreg_constrained_parameters_flag(.fsm_reg(constrained_parameters_flag), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
969 |
|
|
|
970 |
|
|
/* calculation of picture width in macroblocks , par. 6.3.3 */
|
971 |
|
|
always @(posedge clk)
|
972 |
|
|
if (~rst) mb_width <= 8'b0;
|
973 |
|
|
else if (clk_en) mb_width <= (horizontal_size + 11'd15) >> 4;
|
974 |
|
|
else mb_width <= mb_width;
|
975 |
|
|
|
976 |
|
|
/* calculation of picture height in macroblocks , par. 6.3.3 */
|
977 |
|
|
always @(posedge clk)
|
978 |
|
|
if (~rst) mb_height <= 8'b0;
|
979 |
|
|
else if (clk_en) mb_height <= progressive_sequence ? ((vertical_size + 11'd15) >> 4) :
|
980 |
|
|
((vertical_size + 11'd31) >> 5) << 1;
|
981 |
|
|
// ( (picture_structure==FRAME_PICTURE) ? (((vertical_size + 11'd31) >> 5) << 1) : ((vertical_size + 11'd31) >> 5) );
|
982 |
|
|
else mb_height <= mb_height;
|
983 |
|
|
|
984 |
|
|
/* Reset quantisation matrices to default values when sequence header code is decoded (par. 6.3.11) */
|
985 |
|
|
always @(posedge clk)
|
986 |
|
|
if(~rst) quant_rst <= 1'b1;
|
987 |
|
|
else if (clk_en) quant_rst <= (state == STATE_SEQUENCE_HEADER);
|
988 |
|
|
else quant_rst <= quant_rst;
|
989 |
|
|
|
990 |
|
|
always @(posedge clk)
|
991 |
|
|
if (~rst) cnt <= 6'b0;
|
992 |
|
|
else if (clk_en && ((state == STATE_SEQUENCE_HEADER3) || (state == STATE_QUANT_MATRIX_EXT))) cnt <= 6'h0;
|
993 |
|
|
else if (clk_en && ((state == STATE_LD_INTRA_QUANT0)
|
994 |
|
|
|| (state == STATE_LD_NON_INTRA_QUANT0)
|
995 |
|
|
|| (state == STATE_LD_INTRA_QUANT1)
|
996 |
|
|
|| (state == STATE_LD_NON_INTRA_QUANT1)
|
997 |
|
|
|| (state == STATE_LD_CHROMA_INTRA_QUANT1)
|
998 |
|
|
|| (state == STATE_LD_CHROMA_NON_INTRA_QUANT1))) cnt <= cnt + 1;
|
999 |
|
|
else cnt <= cnt;
|
1000 |
|
|
|
1001 |
|
|
always @(posedge clk)
|
1002 |
|
|
if (~rst) quant_wr_data <= 8'b0;
|
1003 |
|
|
else if (clk_en && (state == STATE_LD_INTRA_QUANT0)) quant_wr_data <= getbits[23:16];
|
1004 |
|
|
else if (clk_en && (state == STATE_LD_NON_INTRA_QUANT0)) quant_wr_data <= getbits[22:15];
|
1005 |
|
|
else if (clk_en && (state == STATE_LD_INTRA_QUANT1)) quant_wr_data <= getbits[22:15];
|
1006 |
|
|
else if (clk_en && (state == STATE_LD_NON_INTRA_QUANT1)) quant_wr_data <= getbits[21:14];
|
1007 |
|
|
else if (clk_en && (state == STATE_LD_CHROMA_INTRA_QUANT1)) quant_wr_data <= getbits[20:13];
|
1008 |
|
|
else if (clk_en && (state == STATE_LD_CHROMA_NON_INTRA_QUANT1)) quant_wr_data <= getbits[19:12];
|
1009 |
|
|
else quant_wr_data <= quant_wr_data;
|
1010 |
|
|
|
1011 |
|
|
always @(posedge clk)
|
1012 |
|
|
if (~rst) quant_wr_addr <= 6'b0;
|
1013 |
|
|
else if (clk_en) quant_wr_addr <= cnt;
|
1014 |
|
|
else quant_wr_addr <= quant_wr_addr;
|
1015 |
|
|
|
1016 |
|
|
always @(posedge clk)
|
1017 |
|
|
if (~rst) wr_intra_quant <= 1'b0;
|
1018 |
|
|
else if (clk_en) wr_intra_quant <= ((state == STATE_LD_INTRA_QUANT0) || (state == STATE_LD_INTRA_QUANT1));
|
1019 |
|
|
else wr_intra_quant <= wr_intra_quant;
|
1020 |
|
|
|
1021 |
|
|
always @(posedge clk)
|
1022 |
|
|
if (~rst) wr_non_intra_quant <= 1'b0;
|
1023 |
|
|
else if (clk_en) wr_non_intra_quant <= ((state == STATE_LD_NON_INTRA_QUANT0) || (state == STATE_LD_NON_INTRA_QUANT1));
|
1024 |
|
|
else wr_non_intra_quant <= wr_non_intra_quant;
|
1025 |
|
|
|
1026 |
|
|
always @(posedge clk)
|
1027 |
|
|
if (~rst) wr_chroma_intra_quant <= 1'b0;
|
1028 |
|
|
else if (clk_en) wr_chroma_intra_quant <= ((state == STATE_LD_INTRA_QUANT0) || (state == STATE_LD_INTRA_QUANT1) || (state == STATE_LD_CHROMA_INTRA_QUANT1));
|
1029 |
|
|
else wr_chroma_intra_quant <= wr_chroma_intra_quant;
|
1030 |
|
|
|
1031 |
|
|
always @(posedge clk)
|
1032 |
|
|
if (~rst) wr_chroma_non_intra_quant <= 1'b0;
|
1033 |
|
|
else if (clk_en) wr_chroma_non_intra_quant <= ((state == STATE_LD_NON_INTRA_QUANT0) || (state == STATE_LD_NON_INTRA_QUANT1) || (state == STATE_LD_CHROMA_NON_INTRA_QUANT1));
|
1034 |
|
|
else wr_chroma_non_intra_quant <= wr_chroma_non_intra_quant;
|
1035 |
|
|
|
1036 |
|
|
/* rld fifo interface */
|
1037 |
|
|
always @(posedge clk)
|
1038 |
|
|
if (~rst) rld_wr_en <= 1'b0;
|
1039 |
|
|
else if (clk_en) rld_wr_en <= dct_coeff_valid_0 ||
|
1040 |
|
|
((state == STATE_SEQUENCE_HEADER) || // quant_rst
|
1041 |
|
|
(state == STATE_LD_INTRA_QUANT0) || // wr_intra_quant, wr_chroma_intra_quant
|
1042 |
|
|
(state == STATE_LD_INTRA_QUANT1) || // wr_intra_quant, wr_chroma_intra_quant
|
1043 |
|
|
(state == STATE_LD_NON_INTRA_QUANT0) || // wr_non_intra_quant, wr_chroma_non_intra_quant
|
1044 |
|
|
(state == STATE_LD_NON_INTRA_QUANT1) || // wr_non_intra_quant, wr_chroma_non_intra_quant
|
1045 |
|
|
(state == STATE_LD_CHROMA_INTRA_QUANT1) || // wr_chroma_intra_quant
|
1046 |
|
|
(state == STATE_LD_CHROMA_NON_INTRA_QUANT1)); // wr_chroma_non_intra_quant
|
1047 |
|
|
else rld_wr_en <= 1'b0;
|
1048 |
|
|
|
1049 |
|
|
always @(posedge clk)
|
1050 |
|
|
if (~rst) rld_cmd <= 1'b0;
|
1051 |
|
|
else if (clk_en) rld_cmd <= ( dct_coeff_valid_0 ? RLD_DCT :
|
1052 |
|
|
((state == STATE_SEQUENCE_HEADER) || // quant_rst
|
1053 |
|
|
(state == STATE_LD_INTRA_QUANT0) || // wr_intra_quant, wr_chroma_intra_quant
|
1054 |
|
|
(state == STATE_LD_INTRA_QUANT1) || // wr_intra_quant, wr_chroma_intra_quant
|
1055 |
|
|
(state == STATE_LD_NON_INTRA_QUANT0) || // wr_non_intra_quant, wr_chroma_non_intra_quant
|
1056 |
|
|
(state == STATE_LD_NON_INTRA_QUANT1) || // wr_non_intra_quant, wr_chroma_non_intra_quant
|
1057 |
|
|
(state == STATE_LD_CHROMA_INTRA_QUANT1) || // wr_chroma_intra_quant
|
1058 |
|
|
(state == STATE_LD_CHROMA_NON_INTRA_QUANT1)) // wr_chroma_non_intra_quant
|
1059 |
|
|
? RLD_QUANT : RLD_NOOP);
|
1060 |
|
|
else rld_cmd <= rld_cmd;
|
1061 |
|
|
|
1062 |
|
|
/* par. 6.2.2.3: Sequence extension */
|
1063 |
|
|
loadreg #( .offset(0), .width(8), .fsm_state(STATE_SEQUENCE_EXT)) loadreg_profile_and_level_indication(.fsm_reg(profile_and_level_indication), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1064 |
|
|
loadreg #( .offset(8), .width(1), .fsm_state(STATE_SEQUENCE_EXT)) loadreg_progressive_sequence(.fsm_reg(progressive_sequence), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1065 |
|
|
loadreg #( .offset(9), .width(2), .fsm_state(STATE_SEQUENCE_EXT)) loadreg_chroma_format(.fsm_reg(chroma_format), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1066 |
|
|
loadreg #( .offset(11), .width(2), .fsm_state(STATE_SEQUENCE_EXT)) loadreg_horizontal_size_msb(.fsm_reg(horizontal_size[13:12]), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1067 |
|
|
loadreg #( .offset(13), .width(2), .fsm_state(STATE_SEQUENCE_EXT)) loadreg_vertical_size_msb(.fsm_reg(vertical_size[13:12]), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1068 |
|
|
loadreg #( .offset(0), .width(12), .fsm_state(STATE_SEQUENCE_EXT0)) loadreg_bit_rate_msb(.fsm_reg(bit_rate[29:18]), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1069 |
|
|
loadreg #( .offset(0), .width(8), .fsm_state(STATE_SEQUENCE_EXT1)) loadreg_vbv_buffer_size_msb(.fsm_reg(vbv_buffer_size[17:10]), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1070 |
|
|
loadreg #( .offset(8), .width(1), .fsm_state(STATE_SEQUENCE_EXT1)) loadreg_low_delay(.fsm_reg(low_delay), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1071 |
|
|
loadreg #( .offset(9), .width(2), .fsm_state(STATE_SEQUENCE_EXT1)) loadreg_frame_rate_extension_n(.fsm_reg(frame_rate_extension_n), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1072 |
|
|
loadreg #( .offset(11), .width(5), .fsm_state(STATE_SEQUENCE_EXT1)) loadreg_frame_rate_extension_d(.fsm_reg(frame_rate_extension_d), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1073 |
|
|
|
1074 |
|
|
/* par. 6.2.2.4: Sequence display extension */
|
1075 |
|
|
loadreg #( .offset(0), .width(3), .fsm_state(STATE_SEQUENCE_DISPLAY_EXT)) loadreg_video_format(.fsm_reg(video_format), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1076 |
|
|
loadreg #( .offset(0), .width(8), .fsm_state(STATE_SEQUENCE_DISPLAY_EXT0)) loadreg_colour_primaries(.fsm_reg(colour_primaries), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1077 |
|
|
loadreg #( .offset(8), .width(8), .fsm_state(STATE_SEQUENCE_DISPLAY_EXT0)) loadreg_transfer_characteristics(.fsm_reg(transfer_characteristics), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1078 |
|
|
loadreg #( .offset(16), .width(8), .fsm_state(STATE_SEQUENCE_DISPLAY_EXT0)) loadreg_matrix_coefficients(.fsm_reg(matrix_coefficients), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1079 |
|
|
loadreg #( .offset(0), .width(14), .fsm_state(STATE_SEQUENCE_DISPLAY_EXT1)) loadreg_display_horizontal_size(.fsm_reg(display_horizontal_size), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1080 |
|
|
loadreg #( .offset(0), .width(14), .fsm_state(STATE_SEQUENCE_DISPLAY_EXT2)) loadreg_display_vertical_size(.fsm_reg(display_vertical_size), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1081 |
|
|
|
1082 |
|
|
/* par. 6.2.3.1: Picture coding extension */
|
1083 |
|
|
loadreg #( .offset(0), .width(4), .fsm_state(STATE_PICTURE_CODING_EXT)) loadreg_f_code_00(.fsm_reg(f_code_00), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1084 |
|
|
loadreg #( .offset(4), .width(4), .fsm_state(STATE_PICTURE_CODING_EXT)) loadreg_f_code_01(.fsm_reg(f_code_01), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1085 |
|
|
loadreg #( .offset(8), .width(4), .fsm_state(STATE_PICTURE_CODING_EXT)) loadreg_f_code_10(.fsm_reg(f_code_10), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1086 |
|
|
loadreg #( .offset(12), .width(4), .fsm_state(STATE_PICTURE_CODING_EXT)) loadreg_f_code_11(.fsm_reg(f_code_11), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1087 |
|
|
loadreg #( .offset(0), .width(2), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_intra_dc_precision(.fsm_reg(intra_dc_precision), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1088 |
|
|
loadreg #( .offset(2), .width(2), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_picture_structure(.fsm_reg(picture_structure), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1089 |
|
|
loadreg #( .offset(4), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_top_field_first(.fsm_reg(top_field_first), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1090 |
|
|
loadreg #( .offset(5), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_frame_pred_frame_dct(.fsm_reg(frame_pred_frame_dct), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1091 |
|
|
loadreg #( .offset(6), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_concealment_motion_vectors(.fsm_reg(concealment_motion_vectors), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1092 |
|
|
loadreg #( .offset(7), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_q_scale_type(.fsm_reg(q_scale_type), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1093 |
|
|
loadreg #( .offset(8), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_intra_vlc_format(.fsm_reg(intra_vlc_format), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1094 |
|
|
loadreg #( .offset(9), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_alternate_scan(.fsm_reg(alternate_scan), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1095 |
|
|
loadreg #( .offset(10), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_repeat_first_field(.fsm_reg(repeat_first_field), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1096 |
|
|
loadreg #( .offset(11), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_chroma_420_type(.fsm_reg(chroma_420_type), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1097 |
|
|
loadreg #( .offset(12), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_progressive_frame(.fsm_reg(progressive_frame), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1098 |
|
|
loadreg #( .offset(13), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT0)) loadreg_composite_display_flag(.fsm_reg(composite_display_flag), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1099 |
|
|
loadreg #( .offset(0), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT1)) loadreg_v_axis(.fsm_reg(v_axis), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1100 |
|
|
loadreg #( .offset(1), .width(3), .fsm_state(STATE_PICTURE_CODING_EXT1)) loadreg_field_sequence(.fsm_reg(field_sequence), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1101 |
|
|
loadreg #( .offset(4), .width(1), .fsm_state(STATE_PICTURE_CODING_EXT1)) loadreg_sub_carrier(.fsm_reg(sub_carrier), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1102 |
|
|
loadreg #( .offset(5), .width(7), .fsm_state(STATE_PICTURE_CODING_EXT1)) loadreg_burst_amplitude(.fsm_reg(burst_amplitude), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1103 |
|
|
loadreg #( .offset(12), .width(8), .fsm_state(STATE_PICTURE_CODING_EXT1)) loadreg_sub_carrier_phase(.fsm_reg(sub_carrier_phase), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1104 |
|
|
|
1105 |
|
|
/* par. 6.2.2.6: group of pictures header */
|
1106 |
|
|
loadreg #( .offset(0), .width(1), .fsm_state(STATE_GROUP_HEADER)) loadreg_drop_flag(.fsm_reg(drop_flag), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1107 |
|
|
loadreg #( .offset(1), .width(5), .fsm_state(STATE_GROUP_HEADER)) loadreg_time_code_hours(.fsm_reg(time_code_hours), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1108 |
|
|
loadreg #( .offset(6), .width(6), .fsm_state(STATE_GROUP_HEADER)) loadreg_time_code_minutes(.fsm_reg(time_code_minutes), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1109 |
|
|
loadreg #( .offset(13), .width(6), .fsm_state(STATE_GROUP_HEADER)) loadreg_time_code_seconds(.fsm_reg(time_code_seconds), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1110 |
|
|
loadreg #( .offset(0), .width(6), .fsm_state(STATE_GROUP_HEADER0)) loadreg_time_code_pictures(.fsm_reg(time_code_pictures), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1111 |
|
|
loadreg #( .offset(6), .width(1), .fsm_state(STATE_GROUP_HEADER0)) loadreg_closed_gop(.fsm_reg(closed_gop), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1112 |
|
|
loadreg #( .offset(7), .width(1), .fsm_state(STATE_GROUP_HEADER0)) loadreg_broken_link(.fsm_reg(broken_link), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1113 |
|
|
|
1114 |
|
|
/* par. 6.2.3: picture header */
|
1115 |
|
|
loadreg #( .offset(0), .width(10), .fsm_state(STATE_PICTURE_HEADER)) loadreg_temporal_reference(.fsm_reg(temporal_reference), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1116 |
|
|
loadreg #( .offset(10), .width(3), .fsm_state(STATE_PICTURE_HEADER)) loadreg_picture_coding_type(.fsm_reg(picture_coding_type), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1117 |
|
|
loadreg #( .offset(0), .width(16), .fsm_state(STATE_PICTURE_HEADER0)) loadreg_vbv_delay(.fsm_reg(vbv_delay), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1118 |
|
|
loadreg #( .offset(0), .width(1), .fsm_state(STATE_PICTURE_HEADER1)) loadreg_full_pel_forward_vector(.fsm_reg(full_pel_forward_vector), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1119 |
|
|
loadreg #( .offset(1), .width(3), .fsm_state(STATE_PICTURE_HEADER1)) loadreg_forward_f_code(.fsm_reg(forward_f_code), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1120 |
|
|
loadreg #( .offset(0), .width(1), .fsm_state(STATE_PICTURE_HEADER2)) loadreg_full_pel_backward_vector(.fsm_reg(full_pel_backward_vector), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1121 |
|
|
loadreg #( .offset(1), .width(3), .fsm_state(STATE_PICTURE_HEADER2)) loadreg_backward_f_code(.fsm_reg(backward_f_code), .clk(clk), .clk_en(clk_en), .rst(rst), .state(state), .getbits(getbits));
|
1122 |
|
|
|
1123 |
|
|
/* par. 6.2.4: slice */
|
1124 |
|
|
/* macroblock address increment vlc lookup */
|
1125 |
|
|
assign {macroblock_addr_inc_length, macroblock_addr_inc_value, macroblock_addr_inc_escape} = macroblock_address_increment_dec(getbits[23:13]);
|
1126 |
|
|
|
1127 |
|
|
/* macroblock type vlc lookup */
|
1128 |
|
|
assign {macroblock_type_length, macroblock_type_value} = macroblock_type_dec(getbits[23:18], picture_coding_type);
|
1129 |
|
|
|
1130 |
|
|
/* coded block pattern vlc lookup */
|
1131 |
|
|
assign {coded_block_pattern_length, coded_block_pattern_value} = coded_block_pattern_dec(getbits[23:15]);
|
1132 |
|
|
|
1133 |
|
|
/* motion code vlc lookup */
|
1134 |
|
|
assign {motion_code_length, motion_code_value, motion_code_sign} = motion_code_dec(getbits[23:13]);
|
1135 |
|
|
|
1136 |
|
|
/* dmvector vlc lookup */
|
1137 |
|
|
assign {dmvector_length, dmvector_value, dmvector_sign} = dmvector_dec(getbits[23:22]);
|
1138 |
|
|
|
1139 |
|
|
/* dct dc size luminance vlc lookup */
|
1140 |
|
|
assign {dct_dc_size_luminance_length, dct_dc_size_luminance_value} = dct_dc_size_luminance_dec(getbits[23:15]);
|
1141 |
|
|
|
1142 |
|
|
/* dct dc size chrominance vlc lookup */
|
1143 |
|
|
assign {dct_dc_size_chrominance_length, dct_dc_size_chrominance_value} = dct_dc_size_chrominance_dec(getbits[23:14]);
|
1144 |
|
|
|
1145 |
|
|
/* dct coefficient 0 vlc lookup */
|
1146 |
|
|
always @(getbits)
|
1147 |
|
|
dct_coefficient_0_decoded = dct_coefficient_0_dec(getbits[23:8]);
|
1148 |
|
|
|
1149 |
|
|
/* dct first coefficient 0 vlc lookup */
|
1150 |
|
|
/* see note 2 and 3 of table B-14: first coefficient handled differently. */
|
1151 |
|
|
/* Code 2'b10 = 1, Code 2'b11 = -1 */
|
1152 |
|
|
always @(getbits, dct_coefficient_0_decoded)
|
1153 |
|
|
dct_non_intra_first_coefficient_0_decoded = getbits[23] ? {5'd2, 5'd0, 6'd1} : dct_coefficient_0_decoded;
|
1154 |
|
|
|
1155 |
|
|
/* dct coefficient 1 vlc lookup */
|
1156 |
|
|
always @(getbits)
|
1157 |
|
|
dct_coefficient_1_decoded = dct_coefficient_1_dec(getbits[23:8]);
|
1158 |
|
|
|
1159 |
|
|
/* internal registers */
|
1160 |
|
|
/* slice start code */
|
1161 |
|
|
/* this does not take into account slice_vertial_position_extension (par. 6.3.16). This limits vertical resolution to 2800 lines. */
|
1162 |
|
|
always @(posedge clk)
|
1163 |
|
|
if (~rst) slice_vertical_position <= 8'b0;
|
1164 |
|
|
else if (clk_en && (state == STATE_SLICE)) slice_vertical_position <= start_code;
|
1165 |
|
|
else slice_vertical_position <= slice_vertical_position;
|
1166 |
|
|
|
1167 |
|
|
/* slice quantiser scale */
|
1168 |
|
|
always @(posedge clk)
|
1169 |
|
|
if (~rst) quantiser_scale_code <= 5'b0;
|
1170 |
|
|
else if (clk_en && ((state == STATE_SLICE) || ((state == STATE_MACROBLOCK_QUANT) && macroblock_quant))) quantiser_scale_code <= getbits[23:19];
|
1171 |
|
|
else quantiser_scale_code <= quantiser_scale_code;
|
1172 |
|
|
|
1173 |
|
|
always @(posedge clk)
|
1174 |
|
|
if (~rst) slice_extension_flag <= 1'b0;
|
1175 |
|
|
else if (clk_en && (state == STATE_SLICE)) slice_extension_flag <= getbits[18];
|
1176 |
|
|
else slice_extension_flag <= slice_extension_flag;
|
1177 |
|
|
|
1178 |
|
|
/* slice extension */
|
1179 |
|
|
always @(posedge clk)
|
1180 |
|
|
if (~rst) intra_slice <= 1'b0;
|
1181 |
|
|
else if (clk_en && (state == STATE_SLICE_EXTENSION)) intra_slice <= getbits[23];
|
1182 |
|
|
else intra_slice <= intra_slice;
|
1183 |
|
|
|
1184 |
|
|
always @(posedge clk)
|
1185 |
|
|
if (~rst) slice_picture_id_enable <= 1'b0;
|
1186 |
|
|
else if (clk_en && (state == STATE_SLICE_EXTENSION)) slice_picture_id_enable <= getbits[22];
|
1187 |
|
|
else slice_picture_id_enable <= slice_picture_id_enable;
|
1188 |
|
|
|
1189 |
|
|
always @(posedge clk)
|
1190 |
|
|
if (~rst) slice_picture_id <= 6'b0;
|
1191 |
|
|
else if (clk_en && (state == STATE_SLICE_EXTENSION)) slice_picture_id <= getbits[21:16];
|
1192 |
|
|
else slice_picture_id <= slice_picture_id;
|
1193 |
|
|
|
1194 |
|
|
/* macroblock address */
|
1195 |
|
|
/*
|
1196 |
|
|
* Note macroblock address calculation is for the restricted slice structure (par. 6.1.2.2) where slices seamlessly cover the whole picture.
|
1197 |
|
|
* Support for the general slice structure (par. 6.1.2.1) with gaps between slices could be added if needed.
|
1198 |
|
|
*/
|
1199 |
|
|
|
1200 |
|
|
always @(posedge clk)
|
1201 |
|
|
if (~rst) first_macroblock_of_slice <= 1'b0;
|
1202 |
|
|
else if (clk_en && (state == STATE_SLICE)) first_macroblock_of_slice <= 1'b1;
|
1203 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_TYPE)) first_macroblock_of_slice <= 1'b0;
|
1204 |
|
|
else first_macroblock_of_slice <= first_macroblock_of_slice;
|
1205 |
|
|
|
1206 |
|
|
reg [15:0]mb_row_by_mb_width;
|
1207 |
|
|
wire [7:0]mb_row = start_code - 8'd1;
|
1208 |
|
|
|
1209 |
|
|
always @(posedge clk)
|
1210 |
|
|
if (~rst) mb_row_by_mb_width <= 13'b0;
|
1211 |
|
|
else if (clk_en && (state == STATE_SLICE)) mb_row_by_mb_width <= mb_row * mb_width;
|
1212 |
|
|
else mb_row_by_mb_width <= mb_row_by_mb_width;
|
1213 |
|
|
|
1214 |
|
|
/*
|
1215 |
|
|
* no skipped macroblocks allowed at slice start. At slice start:
|
1216 |
|
|
* macroblock_address <= ( start_code - 1 ) * mb_width + macroblock_address_increment - 1;
|
1217 |
|
|
* macroblock_address_increment <= 1;
|
1218 |
|
|
*/
|
1219 |
|
|
|
1220 |
|
|
wire [15:0]macroblock_address_increment_ext = macroblock_address_increment;
|
1221 |
|
|
wire [15:0]next_macroblock_address = mb_row_by_mb_width + macroblock_address_increment_ext - 16'd1;
|
1222 |
|
|
|
1223 |
|
|
always @(posedge clk)
|
1224 |
|
|
if (~rst) macroblock_address <= 13'b0;
|
1225 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_TYPE) && first_macroblock_of_slice) macroblock_address <= next_macroblock_address[12:0]; // macroblock in 1920x1080 are numbered 0..8159, hence 13 bits.
|
1226 |
|
|
else if (clk_en && ((state == STATE_MACROBLOCK_TYPE) || (state == STATE_MACROBLOCK_SKIP))) macroblock_address <= macroblock_address + 13'b1;
|
1227 |
|
|
else macroblock_address <= macroblock_address;
|
1228 |
|
|
|
1229 |
|
|
always @(posedge clk)
|
1230 |
|
|
if (~rst) macroblock_address_increment <= 7'b0;
|
1231 |
|
|
else if (clk_en && ((state == STATE_SLICE) || (state == STATE_NEXT_BLOCK))) macroblock_address_increment <= 7'd0;
|
1232 |
|
|
else if (clk_en && (state == STATE_NEXT_MACROBLOCK) && macroblock_addr_inc_escape) macroblock_address_increment <= macroblock_address_increment + 7'd33; // par. 6.3.17, macroblock_escape
|
1233 |
|
|
else if (clk_en && (state == STATE_NEXT_MACROBLOCK)) macroblock_address_increment <= macroblock_address_increment + macroblock_addr_inc_value_ext;
|
1234 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_SKIP)) macroblock_address_increment <= macroblock_address_increment - 7'd1; // counting down number of macroblocks to skip
|
1235 |
|
|
else macroblock_address_increment <= macroblock_address_increment;
|
1236 |
|
|
|
1237 |
|
|
always @(posedge clk)
|
1238 |
|
|
if (~rst) empty_blocks <= 11'b0;
|
1239 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_SKIP))
|
1240 |
|
|
begin
|
1241 |
|
|
case (chroma_format)
|
1242 |
|
|
CHROMA420: empty_blocks <= {11'b11111000000}; // emit 6 empty (all-zeroes) blocks for 4:2:0
|
1243 |
|
|
CHROMA422: empty_blocks <= {11'b11111110000}; // emit 8 empty (all-zeroes) blocks for 4:2:2
|
1244 |
|
|
CHROMA444: empty_blocks <= {11'b11111111111}; // emit 12 empty (all-zeroes) blocks for 4:4:4
|
1245 |
|
|
default empty_blocks <= {11'b00000000000}; // error
|
1246 |
|
|
endcase
|
1247 |
|
|
end
|
1248 |
|
|
else if (clk_en && (state == STATE_EMIT_EMPTY_BLOCK)) empty_blocks <= empty_blocks << 1;
|
1249 |
|
|
else empty_blocks <= empty_blocks;
|
1250 |
|
|
|
1251 |
|
|
/* macroblock type */
|
1252 |
|
|
always @(posedge clk)
|
1253 |
|
|
if (~rst) macroblock_quant <= 1'b0;
|
1254 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_TYPE)) macroblock_quant <= macroblock_type_value[5];
|
1255 |
|
|
else macroblock_quant <= macroblock_quant;
|
1256 |
|
|
|
1257 |
|
|
always @(posedge clk)
|
1258 |
|
|
if (~rst) macroblock_motion_forward <= 1'b0;
|
1259 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_TYPE)) macroblock_motion_forward <= macroblock_type_value[4];
|
1260 |
|
|
else macroblock_motion_forward <= macroblock_motion_forward;
|
1261 |
|
|
|
1262 |
|
|
always @(posedge clk)
|
1263 |
|
|
if (~rst) macroblock_motion_backward <= 1'b0;
|
1264 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_TYPE)) macroblock_motion_backward <= macroblock_type_value[3];
|
1265 |
|
|
else macroblock_motion_backward <= macroblock_motion_backward;
|
1266 |
|
|
|
1267 |
|
|
always @(posedge clk)
|
1268 |
|
|
if (~rst) macroblock_pattern <= 1'b0;
|
1269 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_TYPE)) macroblock_pattern <= macroblock_type_value[2];
|
1270 |
|
|
else macroblock_pattern <= macroblock_pattern;
|
1271 |
|
|
|
1272 |
|
|
/*
|
1273 |
|
|
* macroblock_type_intra is asserted when macroblock_type indicates this macroblock is an intra macroblock.
|
1274 |
|
|
* Intra macroblocks are fully coded. Skipped macroblocks are fully predicted.
|
1275 |
|
|
* However, skipped macroblocks are never intra macroblocks.
|
1276 |
|
|
* Hence macroblock_intra is low when we're emitting a skipped macroblock,
|
1277 |
|
|
* even if the macroblock being decoded is an intra macroblock.
|
1278 |
|
|
* If we're not emitting a skipped macroblock, macroblock_intra has the same
|
1279 |
|
|
* value as macroblock_type_intra.
|
1280 |
|
|
*/
|
1281 |
|
|
|
1282 |
|
|
always @(posedge clk)
|
1283 |
|
|
if (~rst) macroblock_type_intra <= 1'b0;
|
1284 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_TYPE)) macroblock_type_intra <= macroblock_type_value[1];
|
1285 |
|
|
else macroblock_type_intra <= macroblock_type_intra;
|
1286 |
|
|
|
1287 |
|
|
always @(posedge clk)
|
1288 |
|
|
if (~rst) macroblock_intra <= 1'b0;
|
1289 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_TYPE)) macroblock_intra <= macroblock_type_value[1];
|
1290 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_SKIP)) macroblock_intra <= 1'b0;
|
1291 |
|
|
else if (clk_en) macroblock_intra <= macroblock_type_intra;
|
1292 |
|
|
else macroblock_intra <= macroblock_intra;
|
1293 |
|
|
|
1294 |
|
|
always @(posedge clk)
|
1295 |
|
|
if (~rst) spatial_temporal_weight_code_flag <= 1'b0;
|
1296 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_TYPE)) spatial_temporal_weight_code_flag <= macroblock_type_value[0];
|
1297 |
|
|
else spatial_temporal_weight_code_flag <= spatial_temporal_weight_code_flag;
|
1298 |
|
|
|
1299 |
|
|
/* motion type */
|
1300 |
|
|
always @(posedge clk)
|
1301 |
|
|
// par. 6.3.17.1: In this case motion vector decoding and prediction formation shall be performed as if frame_motion_type had indicated "Frame-based prediction".
|
1302 |
|
|
// 2 == Frame-based prediction.
|
1303 |
|
|
// par. 6.3.17.1: In the case of intra macroblocks (in a field picture) when concealment_motion_vectors is equal to 1 field_motion_type is not present in the bitstream.
|
1304 |
|
|
// In this case, motion vector decoding and update of the motion vector predictors shall be performed as if field_motion_type had indicated "Field-based"
|
1305 |
|
|
// 2'b1 == Field-based prediction.
|
1306 |
|
|
if (~rst) motion_type <= 2'd0;
|
1307 |
|
|
else if (clk_en && (state == STATE_MOTION_TYPE) && (macroblock_motion_forward || macroblock_motion_backward) && (picture_structure == FRAME_PICTURE)) motion_type <= frame_pred_frame_dct ? MC_FRAME : getbits[23:22]; /* frame_motion_type */
|
1308 |
|
|
else if (clk_en && (state == STATE_MOTION_TYPE) && (macroblock_motion_forward || macroblock_motion_backward)) motion_type <= getbits[23:22]; /* field_motion_type */
|
1309 |
|
|
else if (clk_en && (state == STATE_MOTION_TYPE) && (macroblock_intra && concealment_motion_vectors)) motion_type <= (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD; /* concealment motion vectors */
|
1310 |
|
|
else if (clk_en && (state == STATE_MOTION_TYPE)) motion_type <= MC_NONE;
|
1311 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_SKIP)) motion_type <= (picture_structure == FRAME_PICTURE) ? MC_FRAME : MC_FIELD; // par. 7.6.6 the prediction shall be made as if (field|frame)_motion_type is "Field-based"|"Frame-based"
|
1312 |
|
|
else motion_type <= motion_type;
|
1313 |
|
|
|
1314 |
|
|
/* dct type */
|
1315 |
|
|
/*
|
1316 |
|
|
dct_type is a flag indicating whether the macroblock is frame DCT coded or field DCT coded. If this is set to '1', the macroblock is field DCT coded.
|
1317 |
|
|
In the case that dct_type is not present in the bitstream, then the value of dct_type (used in the remainder of the decoding process) shall be derived as shown in Table 6-19.
|
1318 |
|
|
(par. 6.3.17.1, Macroblock modes)
|
1319 |
|
|
*/
|
1320 |
|
|
|
1321 |
|
|
always @(posedge clk)
|
1322 |
|
|
if (~rst) dct_type <= 1'b0;
|
1323 |
|
|
else if (clk_en && (state == STATE_MOTION_TYPE)) dct_type <= 1'b0;
|
1324 |
|
|
else if (clk_en && (state == STATE_DCT_TYPE)) dct_type <= getbits[23];
|
1325 |
|
|
else dct_type <= dct_type;
|
1326 |
|
|
|
1327 |
|
|
// derived variables (par. 6.3.17.1, tables 6.17 and 6.18)
|
1328 |
|
|
// note spatial_temporal_weight is always zero, we don't do scaleability.
|
1329 |
|
|
assign motion_vector_count_is_one = (picture_structure==FRAME_PICTURE) ? (motion_type != MC_FIELD) : (motion_type != MC_16X8);
|
1330 |
|
|
|
1331 |
|
|
always @(posedge clk)
|
1332 |
|
|
if (~rst) mv_format <= 2'b0;
|
1333 |
|
|
else if (clk_en) mv_format <= (picture_structure==FRAME_PICTURE) ? ((motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD) : MV_FIELD;
|
1334 |
|
|
else mv_format <= mv_format;
|
1335 |
|
|
|
1336 |
|
|
always @(posedge clk)
|
1337 |
|
|
if (~rst) dmv <= 1'b0;
|
1338 |
|
|
else if (clk_en) dmv <= (motion_type==MC_DMV);
|
1339 |
|
|
else dmv <= dmv;
|
1340 |
|
|
|
1341 |
|
|
/* motion vectors */
|
1342 |
|
|
|
1343 |
|
|
/* motion_vectors(0), motion_vertical_field_select(0,0) */
|
1344 |
|
|
/* par. 6.3.17.3: The number of bits in the bitstream for motion_residual[r][s][t], r_size, is derived from f_code[s][t] as follows:
|
1345 |
|
|
* r_size = f_code[s][t] - 1;
|
1346 |
|
|
*/
|
1347 |
|
|
always @(posedge clk)
|
1348 |
|
|
if (~rst) r_size <= 4'd0;
|
1349 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR) && ((motion_vector == MOTION_VECTOR_0_0_0) || (motion_vector == MOTION_VECTOR_1_0_0))) r_size <= f_code_00 - 4'd1;
|
1350 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR) && ((motion_vector == MOTION_VECTOR_0_0_1) || (motion_vector == MOTION_VECTOR_1_0_1))) r_size <= f_code_01 - 4'd1;
|
1351 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR) && ((motion_vector == MOTION_VECTOR_0_1_0) || (motion_vector == MOTION_VECTOR_1_1_0))) r_size <= f_code_10 - 4'd1;
|
1352 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR) && ((motion_vector == MOTION_VECTOR_0_1_1) || (motion_vector == MOTION_VECTOR_1_1_1))) r_size <= f_code_11 - 4'd1;
|
1353 |
|
|
else r_size <= r_size;
|
1354 |
|
|
|
1355 |
|
|
// vertical_field_select_present - one if motion_vector(s) begins with a 'motion_vertical_field_select'.
|
1356 |
|
|
assign vertical_field_select_present = (motion_vector_count_is_one ? ( (mv_format == MV_FIELD) && (dmv != 1'b1) ) : 1'd1 )
|
1357 |
|
|
&& ((motion_vector == MOTION_VECTOR_0_0_0) || (motion_vector == MOTION_VECTOR_1_0_0) ||
|
1358 |
|
|
(motion_vector == MOTION_VECTOR_0_1_0) || (motion_vector == MOTION_VECTOR_1_1_0)); // par. 6.2.5.1
|
1359 |
|
|
|
1360 |
|
|
/* motion code variables, par. 6.2.5, 6.2.5.2, 6.2.5.2.1 */
|
1361 |
|
|
/*
|
1362 |
|
|
* motion_vector cycles through the different motion vectors MOTION_VECTOR_0_0_0 ... MOTION_VECTOR_1_1_1
|
1363 |
|
|
* The msb of motion_vector_reg is one if the motion vector actually occurs in the bitstream.
|
1364 |
|
|
*/
|
1365 |
|
|
always @(posedge clk)
|
1366 |
|
|
if (~rst) motion_vector <= 3'b0;
|
1367 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_QUANT)) motion_vector <= MOTION_VECTOR_0_0_0;
|
1368 |
|
|
else if (clk_en && (state == STATE_MOTION_PREDICT)) motion_vector <= motion_vector + 1;
|
1369 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR) && (motion_vector_reg[7] == 1'b0)) motion_vector <= motion_vector + 1;
|
1370 |
|
|
else motion_vector <= motion_vector;
|
1371 |
|
|
|
1372 |
|
|
always @(posedge clk)
|
1373 |
|
|
if (~rst) motion_vector_reg <= 8'b0;
|
1374 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_QUANT)) /* set up motion_vector_reg */
|
1375 |
|
|
case ({macroblock_motion_forward || (macroblock_intra && concealment_motion_vectors), macroblock_motion_backward, motion_vector_count_is_one})
|
1376 |
|
|
3'b000: motion_vector_reg <= 8'b00000000; // no motion vectors
|
1377 |
|
|
3'b001: motion_vector_reg <= 8'b00000000; // no motion vectors
|
1378 |
|
|
3'b100: motion_vector_reg <= 8'b11110000; // motion_code_000, 001, 100, 101
|
1379 |
|
|
3'b101: motion_vector_reg <= 8'b11000000; // motion_code_000, 001
|
1380 |
|
|
3'b010: motion_vector_reg <= 8'b00001111; // motion_code_ 010, 011, 110, 111
|
1381 |
|
|
3'b011: motion_vector_reg <= 8'b00001100; // motion_code_ 010, 011
|
1382 |
|
|
3'b110: motion_vector_reg <= 8'b11111111; // motion_code_000, 001, 100, 101, 010, 011, 110, 111
|
1383 |
|
|
3'b111: motion_vector_reg <= 8'b11001100; // motion_code_000, 001, 010, 011
|
1384 |
|
|
endcase
|
1385 |
|
|
else if (clk_en && (state == STATE_MOTION_PREDICT)) motion_vector_reg <= motion_vector_reg << 1;
|
1386 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR) && (motion_vector_reg[7] == 1'b0)) motion_vector_reg <= motion_vector_reg << 1;
|
1387 |
|
|
else motion_vector_reg <= motion_vector_reg;
|
1388 |
|
|
|
1389 |
|
|
always @(posedge clk)
|
1390 |
|
|
if (~rst) motion_code <= 5'b0;
|
1391 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR)) motion_code <= 5'b0;
|
1392 |
|
|
else if (clk_en && (state == STATE_MOTION_CODE)) motion_code <= motion_code_value;
|
1393 |
|
|
else motion_code <= motion_code;
|
1394 |
|
|
|
1395 |
|
|
always @(posedge clk)
|
1396 |
|
|
if (~rst) motion_code_neg <= 1'b0;
|
1397 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR)) motion_code_neg <= 1'b0;
|
1398 |
|
|
else if (clk_en && (state == STATE_MOTION_CODE)) motion_code_neg <= motion_code_sign;
|
1399 |
|
|
else motion_code_neg <= motion_code_neg;
|
1400 |
|
|
|
1401 |
|
|
always @(posedge clk)
|
1402 |
|
|
if (~rst) motion_code_residual <= 8'b0;
|
1403 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR)) motion_code_residual <= 8'b0;
|
1404 |
|
|
else if (clk_en && (state == STATE_MOTION_RESIDUAL))
|
1405 |
|
|
begin
|
1406 |
|
|
case (r_size)
|
1407 |
|
|
14'd00: motion_code_residual <= {8'b0}; // Error, f_code != 1 hence r_size != 0.
|
1408 |
|
|
14'd01: motion_code_residual <= {7'b0, getbits[23]};
|
1409 |
|
|
14'd02: motion_code_residual <= {6'b0, getbits[23:22]};
|
1410 |
|
|
14'd03: motion_code_residual <= {5'b0, getbits[23:21]};
|
1411 |
|
|
14'd04: motion_code_residual <= {4'b0, getbits[23:20]};
|
1412 |
|
|
14'd05: motion_code_residual <= {3'b0, getbits[23:19]};
|
1413 |
|
|
14'd06: motion_code_residual <= {2'b0, getbits[23:18]};
|
1414 |
|
|
14'd07: motion_code_residual <= {1'b0, getbits[23:17]};
|
1415 |
|
|
14'd08: motion_code_residual <= getbits[23:16];
|
1416 |
|
|
default motion_code_residual <= getbits[23:16]; // Should never happen, as r_size is 1..8 (f_code = 1..9 in Table E-8 at high level)
|
1417 |
|
|
endcase
|
1418 |
|
|
end
|
1419 |
|
|
else motion_code_residual <= motion_code_residual;
|
1420 |
|
|
|
1421 |
|
|
always @(posedge clk)
|
1422 |
|
|
if (~rst) dmvector <= 2'b0;
|
1423 |
|
|
else if (clk_en && (state == STATE_NEXT_MOTION_VECTOR)) dmvector <= 2'b0;
|
1424 |
|
|
else if (clk_en && (state == STATE_MOTION_DMVECTOR))
|
1425 |
|
|
begin
|
1426 |
|
|
case ({dmvector_sign, dmvector_value})
|
1427 |
|
|
{1'b0, 1'b0}: dmvector <= 2'b0;
|
1428 |
|
|
{1'b0, 1'b1}: dmvector <= 2'b1;
|
1429 |
|
|
{1'b1, 1'b0}: dmvector <= 2'b0;
|
1430 |
|
|
{1'b1, 1'b1}: dmvector <= -2'b1;
|
1431 |
|
|
endcase
|
1432 |
|
|
end
|
1433 |
|
|
else dmvector <= dmvector;
|
1434 |
|
|
|
1435 |
|
|
/*
|
1436 |
|
|
* Resetting motion vector predictors, par. 7.6.3.4.
|
1437 |
|
|
* Also includes updating motion vector predictors to zero, par. 7.6.3.3.
|
1438 |
|
|
*
|
1439 |
|
|
* The difference between resetting and updating is that updating occurs
|
1440 |
|
|
* after the motion vectors have been processed, in STATE_BLOCK
|
1441 |
|
|
*/
|
1442 |
|
|
|
1443 |
|
|
wire pmv_reset = (state == STATE_SLICE) || /* par. 7.6.3.4, At the start of each slice. */
|
1444 |
|
|
((state == STATE_MACROBLOCK_QUANT) && macroblock_intra && ~concealment_motion_vectors) || /* par. 7.6.3.4, Whenever an intra macroblock is decoded which has no concealment motion vectors. */
|
1445 |
|
|
((state == STATE_MACROBLOCK_QUANT) && (picture_coding_type == P_TYPE) && ~macroblock_intra && ~macroblock_motion_forward) || /* par. 7.6.3.4, In a P-picture when a non-intra macroblock is decoded in which macroblock_motion_forward is zero. */
|
1446 |
|
|
((state == STATE_MACROBLOCK_SKIP) && (picture_coding_type == P_TYPE)); /* par. 7.6.3.4, In a P-picture when a macroblock is skipped. Also 7.6.6.1, 7.6.6.2 */
|
1447 |
|
|
|
1448 |
|
|
|
1449 |
|
|
/*
|
1450 |
|
|
* Updating motion vector predictors. Table 7-9 and 7-10.
|
1451 |
|
|
* When to PMV[1][0][1:0] = PMV[0][0][1:0]
|
1452 |
|
|
*/
|
1453 |
|
|
|
1454 |
|
|
wire pmv_update0 = ((picture_structure == FRAME_PICTURE) && (motion_type == MC_FRAME) && macroblock_intra) ||
|
1455 |
|
|
((picture_structure == FRAME_PICTURE) && (motion_type == MC_FRAME) && macroblock_motion_forward) ||
|
1456 |
|
|
((picture_structure == FRAME_PICTURE) && (motion_type == MC_DMV) && macroblock_motion_forward && ~macroblock_motion_backward && ~macroblock_intra) ||
|
1457 |
|
|
(((picture_structure == TOP_FIELD) || (picture_structure == BOTTOM_FIELD)) && (motion_type == MC_FIELD) && macroblock_intra) ||
|
1458 |
|
|
(((picture_structure == TOP_FIELD) || (picture_structure == BOTTOM_FIELD)) && (motion_type == MC_FIELD) && macroblock_motion_forward) ||
|
1459 |
|
|
(((picture_structure == TOP_FIELD) || (picture_structure == BOTTOM_FIELD)) && (motion_type == MC_DMV) && macroblock_motion_forward && ~macroblock_motion_backward && ~macroblock_intra) ;
|
1460 |
|
|
|
1461 |
|
|
/*
|
1462 |
|
|
* Updating motion vector predictors. Table 7-9 and 7-10.
|
1463 |
|
|
* When to PMV[1][1][1:0] = PMV[0][1][1:0]
|
1464 |
|
|
*/
|
1465 |
|
|
|
1466 |
|
|
wire pmv_update1 = ((picture_structure == FRAME_PICTURE) && (motion_type == MC_FRAME) && ~macroblock_intra && macroblock_motion_backward) ||
|
1467 |
|
|
(((picture_structure == TOP_FIELD) || (picture_structure == BOTTOM_FIELD)) && (motion_type == MC_FIELD) && ~macroblock_intra && macroblock_motion_backward) ;
|
1468 |
|
|
|
1469 |
|
|
/* motion vector pipeline */
|
1470 |
|
|
always @(posedge clk)
|
1471 |
|
|
if (~rst)
|
1472 |
|
|
begin
|
1473 |
|
|
motion_vector_0 <= 2'b0;
|
1474 |
|
|
motion_vector_1 <= 2'b0;
|
1475 |
|
|
motion_vector_2 <= 2'b0;
|
1476 |
|
|
motion_vector_3 <= 2'b0;
|
1477 |
|
|
motion_vector_4 <= 2'b0;
|
1478 |
|
|
motion_vector_5 <= 2'b0;
|
1479 |
|
|
end
|
1480 |
|
|
else if (clk_en)
|
1481 |
|
|
begin
|
1482 |
|
|
motion_vector_0 <= motion_vector;
|
1483 |
|
|
motion_vector_1 <= motion_vector_0;
|
1484 |
|
|
motion_vector_2 <= motion_vector_1;
|
1485 |
|
|
motion_vector_3 <= motion_vector_2;
|
1486 |
|
|
motion_vector_4 <= motion_vector_3;
|
1487 |
|
|
motion_vector_5 <= motion_vector_4;
|
1488 |
|
|
end
|
1489 |
|
|
else
|
1490 |
|
|
begin
|
1491 |
|
|
motion_vector_0 <= motion_vector_0;
|
1492 |
|
|
motion_vector_1 <= motion_vector_1;
|
1493 |
|
|
motion_vector_2 <= motion_vector_2;
|
1494 |
|
|
motion_vector_3 <= motion_vector_3;
|
1495 |
|
|
motion_vector_4 <= motion_vector_4;
|
1496 |
|
|
motion_vector_5 <= motion_vector_5;
|
1497 |
|
|
end
|
1498 |
|
|
|
1499 |
|
|
always @(posedge clk)
|
1500 |
|
|
if (~rst)
|
1501 |
|
|
begin
|
1502 |
|
|
motion_vector_valid_0 <= 1'b0;
|
1503 |
|
|
motion_vector_valid_1 <= 1'b0;
|
1504 |
|
|
motion_vector_valid_2 <= 1'b0;
|
1505 |
|
|
motion_vector_valid_3 <= 1'b0;
|
1506 |
|
|
motion_vector_valid_4 <= 1'b0;
|
1507 |
|
|
motion_vector_valid_5 <= 1'b0;
|
1508 |
|
|
end
|
1509 |
|
|
else if (clk_en)
|
1510 |
|
|
begin
|
1511 |
|
|
motion_vector_valid_0 <= (state == STATE_MOTION_PREDICT);
|
1512 |
|
|
motion_vector_valid_1 <= motion_vector_valid_0;
|
1513 |
|
|
motion_vector_valid_2 <= motion_vector_valid_1;
|
1514 |
|
|
motion_vector_valid_3 <= motion_vector_valid_2;
|
1515 |
|
|
motion_vector_valid_4 <= motion_vector_valid_3;
|
1516 |
|
|
motion_vector_valid_5 <= motion_vector_valid_4;
|
1517 |
|
|
end
|
1518 |
|
|
else
|
1519 |
|
|
begin
|
1520 |
|
|
motion_vector_valid_0 <= motion_vector_valid_0;
|
1521 |
|
|
motion_vector_valid_1 <= motion_vector_valid_1;
|
1522 |
|
|
motion_vector_valid_2 <= motion_vector_valid_2;
|
1523 |
|
|
motion_vector_valid_3 <= motion_vector_valid_3;
|
1524 |
|
|
motion_vector_valid_4 <= motion_vector_valid_4;
|
1525 |
|
|
motion_vector_valid_5 <= motion_vector_valid_5;
|
1526 |
|
|
end
|
1527 |
|
|
|
1528 |
|
|
always @(posedge clk)
|
1529 |
|
|
if (~rst)
|
1530 |
|
|
begin
|
1531 |
|
|
r_size_0 <= 4'b0;
|
1532 |
|
|
r_size_1 <= 4'b0;
|
1533 |
|
|
end
|
1534 |
|
|
else if (clk_en)
|
1535 |
|
|
begin
|
1536 |
|
|
r_size_0 <= r_size;
|
1537 |
|
|
r_size_1 <= r_size_0;
|
1538 |
|
|
end
|
1539 |
|
|
else
|
1540 |
|
|
begin
|
1541 |
|
|
r_size_0 <= r_size_0;
|
1542 |
|
|
r_size_1 <= r_size_1;
|
1543 |
|
|
end
|
1544 |
|
|
|
1545 |
|
|
always @(posedge clk)
|
1546 |
|
|
if (~rst) motion_code_neg_0 <= 1'b0;
|
1547 |
|
|
else if (clk_en) motion_code_neg_0 <= motion_code_neg;
|
1548 |
|
|
else motion_code_neg_0 <= motion_code_neg_0;
|
1549 |
|
|
|
1550 |
|
|
wire signed [12:0]motion_code_signed = {8'b0, motion_code};
|
1551 |
|
|
wire signed [12:0]motion_code_residual_signed = {5'b0, motion_code_residual};
|
1552 |
|
|
|
1553 |
|
|
always @(posedge clk)
|
1554 |
|
|
if (~rst) pmv_delta_0 <= 13'b0;
|
1555 |
|
|
else if (clk_en) pmv_delta_0 <= ((r_size == 4'b0) || (motion_code == 5'b0)) ? motion_code_signed : ((motion_code_signed - 13'sd1) <<< r_size) + motion_code_residual_signed + 13'sd1;
|
1556 |
|
|
else pmv_delta_0 <= pmv_delta_0;
|
1557 |
|
|
|
1558 |
|
|
wire shift_pmv = (mv_format == MV_FIELD) && (picture_structure == FRAME_PICTURE);
|
1559 |
|
|
|
1560 |
|
|
always @(posedge clk)
|
1561 |
|
|
if (~rst)
|
1562 |
|
|
begin
|
1563 |
|
|
pmv_0 <= 13'b0;
|
1564 |
|
|
pmv_1 <= 13'b0;
|
1565 |
|
|
pmv_2 <= 13'b0;
|
1566 |
|
|
pmv_3 <= 13'b0;
|
1567 |
|
|
pmv_4 <= 13'b0;
|
1568 |
|
|
pmv_5 <= 13'b0;
|
1569 |
|
|
end
|
1570 |
|
|
else if (clk_en)
|
1571 |
|
|
begin
|
1572 |
|
|
/* stage 1 */
|
1573 |
|
|
case (motion_vector)
|
1574 |
|
|
MOTION_VECTOR_0_0_0: pmv_0 <= pmv_0_0_0;
|
1575 |
|
|
MOTION_VECTOR_0_0_1: pmv_0 <= shift_pmv ? pmv_0_0_1 >>> 1 : pmv_0_0_1;
|
1576 |
|
|
MOTION_VECTOR_1_0_0: pmv_0 <= pmv_1_0_0;
|
1577 |
|
|
MOTION_VECTOR_1_0_1: pmv_0 <= shift_pmv ? pmv_1_0_1 >>> 1 : pmv_1_0_1;
|
1578 |
|
|
MOTION_VECTOR_0_1_0: pmv_0 <= pmv_0_1_0;
|
1579 |
|
|
MOTION_VECTOR_0_1_1: pmv_0 <= shift_pmv ? pmv_0_1_1 >>> 1 : pmv_0_1_1;
|
1580 |
|
|
MOTION_VECTOR_1_1_0: pmv_0 <= pmv_1_1_0;
|
1581 |
|
|
MOTION_VECTOR_1_1_1: pmv_0 <= shift_pmv ? pmv_1_1_1 >>> 1 : pmv_1_1_1;
|
1582 |
|
|
default pmv_0 <= 13'b0;
|
1583 |
|
|
endcase
|
1584 |
|
|
/* stage 2 */
|
1585 |
|
|
pmv_1 <= motion_code_neg_0 ? pmv_0 - pmv_delta_0 : pmv_0 + pmv_delta_0;
|
1586 |
|
|
/*
|
1587 |
|
|
* stage 3
|
1588 |
|
|
* next case statement ought to be equivalent to:
|
1589 |
|
|
* pmv <= (pmv < low) ? (pmv + range) : ((pmv > high) ? (pmv - range) : pmv);
|
1590 |
|
|
*
|
1591 |
|
|
* As f_code_ is restricted to the range 1..9, (Table E-8, High Level)
|
1592 |
|
|
* r_size is restricted to the range 0..8.
|
1593 |
|
|
*/
|
1594 |
|
|
case (r_size_1)
|
1595 |
|
|
4'd0: pmv_2 <= { {9{pmv_1[4]}}, pmv_1[3:0] };
|
1596 |
|
|
4'd1: pmv_2 <= { {8{pmv_1[5]}}, pmv_1[4:0] };
|
1597 |
|
|
4'd2: pmv_2 <= { {7{pmv_1[6]}}, pmv_1[5:0] };
|
1598 |
|
|
4'd3: pmv_2 <= { {6{pmv_1[7]}}, pmv_1[6:0] };
|
1599 |
|
|
4'd4: pmv_2 <= { {5{pmv_1[8]}}, pmv_1[7:0] };
|
1600 |
|
|
4'd5: pmv_2 <= { {4{pmv_1[9]}}, pmv_1[8:0] };
|
1601 |
|
|
4'd6: pmv_2 <= { {3{pmv_1[10]}}, pmv_1[9:0] };
|
1602 |
|
|
4'd7: pmv_2 <= { {2{pmv_1[11]}}, pmv_1[10:0] };
|
1603 |
|
|
4'd8: pmv_2 <= { {1{pmv_1[12]}}, pmv_1[11:0] };
|
1604 |
|
|
default pmv_2 <= pmv_1[12:0] ; // never occurs
|
1605 |
|
|
endcase
|
1606 |
|
|
/*
|
1607 |
|
|
* stage 4..5: dmv calculations only
|
1608 |
|
|
*/
|
1609 |
|
|
pmv_3 <= pmv_2;
|
1610 |
|
|
pmv_4 <= pmv_3;
|
1611 |
|
|
pmv_5 <= pmv_4;
|
1612 |
|
|
end
|
1613 |
|
|
else
|
1614 |
|
|
begin
|
1615 |
|
|
pmv_0 <= pmv_0;
|
1616 |
|
|
pmv_1 <= pmv_1;
|
1617 |
|
|
pmv_2 <= pmv_2;
|
1618 |
|
|
pmv_3 <= pmv_3;
|
1619 |
|
|
pmv_4 <= pmv_4;
|
1620 |
|
|
pmv_5 <= pmv_5;
|
1621 |
|
|
end
|
1622 |
|
|
|
1623 |
|
|
/*
|
1624 |
|
|
* predicted motion vectors.
|
1625 |
|
|
* pmv_reset is asserted when the motion vectors are reset to zero;
|
1626 |
|
|
* pmv_update0 is asserted when pmv_1_0_x <= pmv_0_0_x
|
1627 |
|
|
* pmv_update1 is asserted when pmv_1_1_x <= pmv_0_1_x
|
1628 |
|
|
*/
|
1629 |
|
|
always @(posedge clk)
|
1630 |
|
|
if (~rst) pmv_0_0_0 <= 13'b0;
|
1631 |
|
|
else if (clk_en && pmv_reset) pmv_0_0_0 <= 13'b0;
|
1632 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_0_0)) pmv_0_0_0 <= pmv_5;
|
1633 |
|
|
else pmv_0_0_0 <= pmv_0_0_0;
|
1634 |
|
|
|
1635 |
|
|
always @(posedge clk)
|
1636 |
|
|
if (~rst) pmv_0_0_1 <= 13'b0;
|
1637 |
|
|
else if (clk_en && pmv_reset) pmv_0_0_1 <= 13'b0;
|
1638 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_0_1)) pmv_0_0_1 <= shift_pmv ? pmv_5 <<< 1 : pmv_5;
|
1639 |
|
|
else pmv_0_0_1 <= pmv_0_0_1;
|
1640 |
|
|
|
1641 |
|
|
always @(posedge clk)
|
1642 |
|
|
if (~rst) pmv_1_0_0 <= 13'b0;
|
1643 |
|
|
else if (clk_en && pmv_reset) pmv_1_0_0 <= 13'b0;
|
1644 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_1_0_0)) pmv_1_0_0 <= pmv_5;
|
1645 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_0_0) && pmv_update0) pmv_1_0_0 <= pmv_5;
|
1646 |
|
|
else pmv_1_0_0 <= pmv_1_0_0;
|
1647 |
|
|
|
1648 |
|
|
always @(posedge clk)
|
1649 |
|
|
if (~rst) pmv_1_0_1 <= 13'b0;
|
1650 |
|
|
else if (clk_en && pmv_reset) pmv_1_0_1 <= 13'b0;
|
1651 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_1_0_1)) pmv_1_0_1 <= shift_pmv ? pmv_5 <<< 1 : pmv_5;
|
1652 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_0_1) && pmv_update0) pmv_1_0_1 <= shift_pmv ? pmv_5 <<< 1 : pmv_5;
|
1653 |
|
|
else pmv_1_0_1 <= pmv_1_0_1;
|
1654 |
|
|
|
1655 |
|
|
always @(posedge clk)
|
1656 |
|
|
if (~rst) pmv_0_1_0 <= 13'b0;
|
1657 |
|
|
else if (clk_en && pmv_reset) pmv_0_1_0 <= 13'b0;
|
1658 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_1_0)) pmv_0_1_0 <= pmv_5;
|
1659 |
|
|
else pmv_0_1_0 <= pmv_0_1_0;
|
1660 |
|
|
|
1661 |
|
|
always @(posedge clk)
|
1662 |
|
|
if (~rst) pmv_0_1_1 <= 13'b0;
|
1663 |
|
|
else if (clk_en && pmv_reset) pmv_0_1_1 <= 13'b0;
|
1664 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_1_1)) pmv_0_1_1 <= shift_pmv ? pmv_5 <<< 1 : pmv_5;
|
1665 |
|
|
else pmv_0_1_1 <= pmv_0_1_1;
|
1666 |
|
|
|
1667 |
|
|
always @(posedge clk)
|
1668 |
|
|
if (~rst) pmv_1_1_0 <= 13'b0;
|
1669 |
|
|
else if (clk_en && pmv_reset) pmv_1_1_0 <= 13'b0;
|
1670 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_1_1_0)) pmv_1_1_0 <= pmv_5;
|
1671 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_1_0) && pmv_update1) pmv_1_1_0 <= pmv_5;
|
1672 |
|
|
else pmv_1_1_0 <= pmv_1_1_0;
|
1673 |
|
|
|
1674 |
|
|
always @(posedge clk)
|
1675 |
|
|
if (~rst) pmv_1_1_1 <= 13'b0;
|
1676 |
|
|
else if (clk_en && pmv_reset) pmv_1_1_1 <= 13'b0;
|
1677 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_1_1_1)) pmv_1_1_1 <= shift_pmv ? pmv_5 <<< 1 : pmv_5;
|
1678 |
|
|
else if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_1_1) && pmv_update1) pmv_1_1_1 <= shift_pmv ? pmv_5 <<< 1 : pmv_5;
|
1679 |
|
|
else pmv_1_1_1 <= pmv_1_1_1;
|
1680 |
|
|
|
1681 |
|
|
/* motion vector field select */
|
1682 |
|
|
output reg motion_vert_field_select_0_0; // motion_vertical_field_select. Indicates which reference field shall be used to form the prediction.
|
1683 |
|
|
// If motion_vertical_field_select[r][s] is zero, then the top reference field shall be used,
|
1684 |
|
|
// if it is one then the bottom reference field shall be used.
|
1685 |
|
|
output reg motion_vert_field_select_0_1;
|
1686 |
|
|
output reg motion_vert_field_select_1_0;
|
1687 |
|
|
output reg motion_vert_field_select_1_1;
|
1688 |
|
|
|
1689 |
|
|
always @(posedge clk)
|
1690 |
|
|
if (~rst) motion_vert_field_select_0_0 <= 1'b0;
|
1691 |
|
|
else if (clk_en && (state == STATE_PICTURE_HEADER)) motion_vert_field_select_0_0 <= 1'b0; // I take the liberty of resetting at the start of a picture
|
1692 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_SKIP) && (picture_structure != FRAME_PICTURE)) motion_vert_field_select_0_0 <= (picture_structure==BOTTOM_FIELD); // par. 7.6.6.1 and 7.6.6.3, skipped macroblocks. predict from field of same parity.
|
1693 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_QUANT) && (picture_coding_type == P_TYPE) && ~macroblock_intra && ~macroblock_motion_forward && (picture_structure != FRAME_PICTURE)) motion_vert_field_select_0_0 <= (picture_structure==BOTTOM_FIELD); // par. 7.6.3.5 Prediction in P pictures. non-intra mb without forward mv in a P picture.
|
1694 |
|
|
else if (clk_en && (state == STATE_MOTION_VERT_FLD_SEL) && (motion_vector == MOTION_VECTOR_0_0_0)) motion_vert_field_select_0_0 <= getbits[23];
|
1695 |
|
|
else motion_vert_field_select_0_0 <= motion_vert_field_select_0_0;
|
1696 |
|
|
|
1697 |
|
|
always @(posedge clk)
|
1698 |
|
|
if (~rst) motion_vert_field_select_0_1 <= 1'b0;
|
1699 |
|
|
else if (clk_en && (state == STATE_PICTURE_HEADER)) motion_vert_field_select_0_1 <= 1'b0;
|
1700 |
|
|
else if (clk_en && (state == STATE_MACROBLOCK_SKIP) && (picture_structure != FRAME_PICTURE)) motion_vert_field_select_0_1 <= (picture_structure==BOTTOM_FIELD); // par. 7.6.6.1 and 7.6.6.3, skipped macroblocks. predict from field of same parity.
|
1701 |
|
|
else if (clk_en && (state == STATE_MOTION_VERT_FLD_SEL) && (motion_vector == MOTION_VECTOR_0_1_0)) motion_vert_field_select_0_1 <= getbits[23];
|
1702 |
|
|
else motion_vert_field_select_0_1 <= motion_vert_field_select_0_1;
|
1703 |
|
|
|
1704 |
|
|
always @(posedge clk)
|
1705 |
|
|
if (~rst) motion_vert_field_select_1_0 <= 1'b0;
|
1706 |
|
|
else if (clk_en && (state == STATE_PICTURE_HEADER)) motion_vert_field_select_1_0 <= 1'b0;
|
1707 |
|
|
else if (clk_en && (state == STATE_MOTION_VERT_FLD_SEL) && (motion_vector == MOTION_VECTOR_1_0_0)) motion_vert_field_select_1_0 <= getbits[23];
|
1708 |
|
|
else if (clk_en && (state == STATE_MOTION_VERT_FLD_SEL) && motion_vector_count_is_one && (mv_format == MV_FIELD) && ~dmv && (motion_vector == MOTION_VECTOR_0_0_0)) motion_vert_field_select_1_0 <= getbits[23]; // case of only one motion vector
|
1709 |
|
|
else motion_vert_field_select_1_0 <= motion_vert_field_select_1_0;
|
1710 |
|
|
|
1711 |
|
|
always @(posedge clk)
|
1712 |
|
|
if (~rst) motion_vert_field_select_1_1 <= 1'b0;
|
1713 |
|
|
else if (clk_en && (state == STATE_PICTURE_HEADER)) motion_vert_field_select_1_1 <= 1'b0;
|
1714 |
|
|
else if (clk_en && (state == STATE_MOTION_VERT_FLD_SEL) && (motion_vector == MOTION_VECTOR_1_1_0)) motion_vert_field_select_1_1 <= getbits[23];
|
1715 |
|
|
else if (clk_en && (state == STATE_MOTION_VERT_FLD_SEL) && motion_vector_count_is_one && (mv_format == MV_FIELD) && ~dmv && (motion_vector == MOTION_VECTOR_0_1_0)) motion_vert_field_select_1_1 <= getbits[23]; // case of only one motion vector
|
1716 |
|
|
else motion_vert_field_select_1_1 <= motion_vert_field_select_1_1;
|
1717 |
|
|
|
1718 |
|
|
/* additional dual-prime arithmetic, par. 7.6.3.6 */
|
1719 |
|
|
always @(posedge clk)
|
1720 |
|
|
if (~rst)
|
1721 |
|
|
begin
|
1722 |
|
|
dmvector_0 <= 2'b0;
|
1723 |
|
|
dmvector_1 <= 2'b0;
|
1724 |
|
|
dmvector_2 <= 2'b0;
|
1725 |
|
|
dmvector_3 <= 2'b0;
|
1726 |
|
|
end
|
1727 |
|
|
else if (clk_en)
|
1728 |
|
|
begin
|
1729 |
|
|
dmvector_0 <= dmvector;
|
1730 |
|
|
dmvector_1 <= dmvector_0;
|
1731 |
|
|
dmvector_2 <= dmvector_1;
|
1732 |
|
|
dmvector_3 <= dmvector_2;
|
1733 |
|
|
end
|
1734 |
|
|
else
|
1735 |
|
|
begin
|
1736 |
|
|
dmvector_0 <= dmvector_0;
|
1737 |
|
|
dmvector_1 <= dmvector_1;
|
1738 |
|
|
dmvector_2 <= dmvector_2;
|
1739 |
|
|
dmvector_3 <= dmvector_3;
|
1740 |
|
|
end
|
1741 |
|
|
|
1742 |
|
|
wire pmv_2_pos = (~pmv_2[12] && (pmv_2 != 13'b0)); // asserted if pmv_2 > 0
|
1743 |
|
|
wire top_field_at_bottom = (picture_structure==FRAME_PICTURE) && (~top_field_first);
|
1744 |
|
|
|
1745 |
|
|
reg signed [1:0] e_parity_ref_parity_pred_4;
|
1746 |
|
|
reg signed [12:0]dmvector_aux_a_3;
|
1747 |
|
|
reg signed [12:0]dmvector_aux_b_3;
|
1748 |
|
|
reg signed [12:0]dmvector_aux_a_4;
|
1749 |
|
|
reg signed [12:0]dmvector_aux_b_4;
|
1750 |
|
|
reg signed [12:0]dmvector_aux_a_5;
|
1751 |
|
|
reg signed [12:0]dmvector_aux_b_5;
|
1752 |
|
|
|
1753 |
|
|
always @(posedge clk)
|
1754 |
|
|
if (~rst) e_parity_ref_parity_pred_4 <= 2'd0;
|
1755 |
|
|
else if (clk_en && (motion_vector_3 == MOTION_VECTOR_0_0_0)) e_parity_ref_parity_pred_4 <= 2'd0;
|
1756 |
|
|
else if (clk_en && (motion_vector_3 == MOTION_VECTOR_0_0_1)) e_parity_ref_parity_pred_4 <= ((picture_structure==FRAME_PICTURE) || (picture_structure==TOP_FIELD)) ? -2'd1 : 2'd1;
|
1757 |
|
|
else e_parity_ref_parity_pred_4 <= e_parity_ref_parity_pred_4;
|
1758 |
|
|
|
1759 |
|
|
always @(posedge clk)
|
1760 |
|
|
if (~rst)
|
1761 |
|
|
begin
|
1762 |
|
|
dmvector_aux_a_3 <= 13'd0;
|
1763 |
|
|
dmvector_aux_a_4 <= 13'd0;
|
1764 |
|
|
dmvector_aux_a_5 <= 13'd0;
|
1765 |
|
|
end
|
1766 |
|
|
else if (clk_en)
|
1767 |
|
|
begin
|
1768 |
|
|
dmvector_aux_a_3 <= pmv_2 + pmv_2_pos;
|
1769 |
|
|
dmvector_aux_a_4 <= {dmvector_aux_a_3[12], dmvector_aux_a_3[12:1]} + { {12{dmvector_3[1]}}, dmvector_3[0] }; // sign-extend dmvector before adding
|
1770 |
|
|
dmvector_aux_a_5 <= (top_field_at_bottom ? dmvector_aux_b_4 : dmvector_aux_a_4) + { {12{e_parity_ref_parity_pred_4[1]}}, e_parity_ref_parity_pred_4[0] }; // sign-extend e_parity_ref_parity_pred before adding
|
1771 |
|
|
end
|
1772 |
|
|
else
|
1773 |
|
|
begin
|
1774 |
|
|
dmvector_aux_a_3 <= dmvector_aux_a_3;
|
1775 |
|
|
dmvector_aux_a_4 <= dmvector_aux_a_4;
|
1776 |
|
|
dmvector_aux_a_5 <= dmvector_aux_a_5;
|
1777 |
|
|
end
|
1778 |
|
|
|
1779 |
|
|
always @(posedge clk)
|
1780 |
|
|
if (~rst)
|
1781 |
|
|
begin
|
1782 |
|
|
dmvector_aux_b_3 <= 13'd0;
|
1783 |
|
|
dmvector_aux_b_4 <= 13'd0;
|
1784 |
|
|
dmvector_aux_b_5 <= 13'd0;
|
1785 |
|
|
end
|
1786 |
|
|
else if (clk_en)
|
1787 |
|
|
begin
|
1788 |
|
|
dmvector_aux_b_3 <= (pmv_2 <<< 1) + pmv_2 + pmv_2_pos;
|
1789 |
|
|
dmvector_aux_b_4 <= {dmvector_aux_b_3[12], dmvector_aux_b_3[12:1]} + { {12{dmvector_3[1]}}, dmvector_3[0] }; // sign-extend dmvector before adding
|
1790 |
|
|
dmvector_aux_b_5 <= (top_field_at_bottom ? dmvector_aux_a_4 : dmvector_aux_b_4) - { {12{e_parity_ref_parity_pred_4[1]}}, e_parity_ref_parity_pred_4[0] }; // sign-extend e_parity_ref_parity_pred before adding
|
1791 |
|
|
end
|
1792 |
|
|
else
|
1793 |
|
|
begin
|
1794 |
|
|
dmvector_aux_b_3 <= dmvector_aux_b_3;
|
1795 |
|
|
dmvector_aux_b_4 <= dmvector_aux_b_4;
|
1796 |
|
|
dmvector_aux_b_5 <= dmvector_aux_b_5;
|
1797 |
|
|
end
|
1798 |
|
|
|
1799 |
|
|
always @(posedge clk)
|
1800 |
|
|
if (~rst) dmv_0_0 <= 13'd0;
|
1801 |
|
|
else if (clk_en && (motion_vector_valid_5) && dmv && (motion_vector_5 == MOTION_VECTOR_0_0_0)) dmv_0_0 <= dmvector_aux_a_5;
|
1802 |
|
|
else dmv_0_0 <= dmv_0_0;
|
1803 |
|
|
|
1804 |
|
|
always @(posedge clk)
|
1805 |
|
|
if (~rst) dmv_1_0 <= 13'd0;
|
1806 |
|
|
else if (clk_en && (motion_vector_valid_5) && dmv && (motion_vector_5 == MOTION_VECTOR_0_0_0)) dmv_1_0 <= dmvector_aux_b_5;
|
1807 |
|
|
else dmv_1_0 <= dmv_1_0;
|
1808 |
|
|
|
1809 |
|
|
always @(posedge clk)
|
1810 |
|
|
if (~rst) dmv_0_1 <= 13'd0;
|
1811 |
|
|
else if (clk_en && (motion_vector_valid_5) && dmv && (motion_vector_5 == MOTION_VECTOR_0_0_1)) dmv_0_1 <= dmvector_aux_a_5;
|
1812 |
|
|
else dmv_0_1 <= dmv_0_1;
|
1813 |
|
|
|
1814 |
|
|
always @(posedge clk)
|
1815 |
|
|
if (~rst) dmv_1_1 <= 13'd0;
|
1816 |
|
|
else if (clk_en && (motion_vector_valid_5) && dmv && (motion_vector_5 == MOTION_VECTOR_0_0_1)) dmv_1_1 <= dmvector_aux_b_5;
|
1817 |
|
|
else dmv_1_1 <= dmv_1_1;
|
1818 |
|
|
|
1819 |
|
|
/* motion vector output */
|
1820 |
|
|
always @(posedge clk)
|
1821 |
|
|
if (~rst) motion_vector_valid <= 1'b0;
|
1822 |
|
|
/*
|
1823 |
|
|
* par. 7.6.6: Skipped macroblocks.
|
1824 |
|
|
* In a P picture the motion vector shall be zero;
|
1825 |
|
|
* in a B picture the motion vectors are taken from the appropriate motion vector predictors.
|
1826 |
|
|
*
|
1827 |
|
|
* Here:
|
1828 |
|
|
* - motion vectors of skipped macroblocks are reset (for P pictures) during STATE_MACROBLOCK_SKIP and valid the state after STATE_MACROBLOCK_SKIP
|
1829 |
|
|
* - motion vectors of non-skipped macroblocks are computed during STATE_NEXT_MOTION_VECTOR .. STATE_MOTION_PIPELINE_FLUSH. The
|
1830 |
|
|
* motion vectors are valid after STATE_MOTION_PIPELINE_FLUSH, and, by extension, at STATE_BLOCK.
|
1831 |
|
|
*/
|
1832 |
|
|
else if (clk_en) motion_vector_valid <= (state == STATE_MACROBLOCK_SKIP) || (state == STATE_BLOCK);
|
1833 |
|
|
else motion_vector_valid <= 1'b0;
|
1834 |
|
|
|
1835 |
|
|
/* second field */
|
1836 |
|
|
output reg second_field;
|
1837 |
|
|
|
1838 |
|
|
always @(posedge clk)
|
1839 |
|
|
if (~rst) second_field <= 1'b0;
|
1840 |
|
|
else if (clk_en && ((state == STATE_SEQUENCE_HEADER) || (state == STATE_GROUP_HEADER))) second_field <= 1'b1;
|
1841 |
|
|
else if (clk_en && (state == STATE_PICTURE_HEADER) && (picture_structure == FRAME_PICTURE)) second_field <= 1'b0; /* recover from illegal number of field pictures, if necessary */
|
1842 |
|
|
else if (clk_en && (state == STATE_PICTURE_HEADER)) second_field <= ~second_field; /* field picture */
|
1843 |
|
|
else second_field <= second_field;
|
1844 |
|
|
|
1845 |
|
|
/*
|
1846 |
|
|
tell motion compensation to switch picture buffers.
|
1847 |
|
|
If frame picture, switch picture buffers every picture header.
|
1848 |
|
|
If field picture, switch picture buffers every other picture header.
|
1849 |
|
|
(Field pictures use two picture headers, one for each field)
|
1850 |
|
|
*/
|
1851 |
|
|
output reg update_picture_buffers;
|
1852 |
|
|
output reg last_frame;
|
1853 |
|
|
|
1854 |
|
|
always @(posedge clk)
|
1855 |
|
|
if (~rst) update_picture_buffers <= 1'b0;
|
1856 |
|
|
else if (clk_en) update_picture_buffers <= ((state == STATE_PICTURE_HEADER) && ((picture_structure == FRAME_PICTURE) || second_field)) // emit frame at picture header
|
1857 |
|
|
|| ((state == STATE_SEQUENCE_END) && ~last_frame); // emit last frame
|
1858 |
|
|
else update_picture_buffers <= 1'b0;
|
1859 |
|
|
|
1860 |
|
|
/*
|
1861 |
|
|
We're at video end, tell motion compensation to emit the last frame.
|
1862 |
|
|
*/
|
1863 |
|
|
|
1864 |
|
|
always @(posedge clk)
|
1865 |
|
|
if (~rst) last_frame <= 1'b0;
|
1866 |
|
|
else if (clk_en && (state == STATE_SEQUENCE_END)) last_frame <= 1'b1; // end of this video bitstream
|
1867 |
|
|
else if (clk_en && ((state == STATE_SEQUENCE_HEADER) || (state == STATE_PICTURE_HEADER))) last_frame <= 1'b0; // start of new video bitstream
|
1868 |
|
|
else last_frame <= last_frame;
|
1869 |
|
|
|
1870 |
|
|
/* dct_dc_size_luminance, dct_dc_size_chrominance and dct_dc_differential (par. 7.2.1) */
|
1871 |
|
|
|
1872 |
|
|
always @(posedge clk)
|
1873 |
|
|
if (~rst) dct_dc_size <= 4'b0;
|
1874 |
|
|
else if (clk_en && (state == STATE_DCT_DC_LUMI_SIZE)) dct_dc_size <= dct_dc_size_luminance_value; // table B-12 lookup
|
1875 |
|
|
else if (clk_en && (state == STATE_DCT_DC_CHROMI_SIZE)) dct_dc_size <= dct_dc_size_chrominance_value; // table B-13 lookup
|
1876 |
|
|
else dct_dc_size <= dct_dc_size;
|
1877 |
|
|
|
1878 |
|
|
reg [10:0]dct_dc_pred_add;
|
1879 |
|
|
always @*
|
1880 |
|
|
case (dct_dc_size)
|
1881 |
|
|
4'd1: dct_dc_pred_add = getbits[23];
|
1882 |
|
|
4'd2: dct_dc_pred_add = getbits[23:22];
|
1883 |
|
|
4'd3: dct_dc_pred_add = getbits[23:21];
|
1884 |
|
|
4'd4: dct_dc_pred_add = getbits[23:20];
|
1885 |
|
|
4'd5: dct_dc_pred_add = getbits[23:19];
|
1886 |
|
|
4'd6: dct_dc_pred_add = getbits[23:18];
|
1887 |
|
|
4'd7: dct_dc_pred_add = getbits[23:17];
|
1888 |
|
|
4'd8: dct_dc_pred_add = getbits[23:16];
|
1889 |
|
|
4'd9: dct_dc_pred_add = getbits[23:15];
|
1890 |
|
|
4'd10: dct_dc_pred_add = getbits[23:14];
|
1891 |
|
|
4'd11: dct_dc_pred_add = getbits[23:13];
|
1892 |
|
|
default dct_dc_pred_add = 11'd0; // error: maximum in table B-12 and B-13 is 11
|
1893 |
|
|
endcase
|
1894 |
|
|
|
1895 |
|
|
reg [10:0]dct_dc_pred_sub;
|
1896 |
|
|
always @*
|
1897 |
|
|
case (dct_dc_size)
|
1898 |
|
|
4'd1: dct_dc_pred_sub = 11'b1;
|
1899 |
|
|
4'd2: dct_dc_pred_sub = 11'b11;
|
1900 |
|
|
4'd3: dct_dc_pred_sub = 11'b111;
|
1901 |
|
|
4'd4: dct_dc_pred_sub = 11'b1111;
|
1902 |
|
|
4'd5: dct_dc_pred_sub = 11'b11111;
|
1903 |
|
|
4'd6: dct_dc_pred_sub = 11'b111111;
|
1904 |
|
|
4'd7: dct_dc_pred_sub = 11'b1111111;
|
1905 |
|
|
4'd8: dct_dc_pred_sub = 11'b11111111;
|
1906 |
|
|
4'd9: dct_dc_pred_sub = 11'b111111111;
|
1907 |
|
|
4'd10: dct_dc_pred_sub = 11'b1111111111;
|
1908 |
|
|
4'd11: dct_dc_pred_sub = 11'b11111111111;
|
1909 |
|
|
default dct_dc_pred_sub = 11'd0; // error: maximum in table B-12 and B-13 is 11
|
1910 |
|
|
endcase
|
1911 |
|
|
|
1912 |
|
|
always @(posedge clk)
|
1913 |
|
|
if (~rst) dct_dc_pred <= 11'b0;
|
1914 |
|
|
else if (clk_en && (state == STATE_DCT_DC_LUMI_SIZE)) dct_dc_pred <= dct_dc_pred_0; // Y block
|
1915 |
|
|
else if (clk_en && (state == STATE_DCT_DC_CHROMI_SIZE) && block_chromi1_code[12]) dct_dc_pred <= dct_dc_pred_1; // Cb block
|
1916 |
|
|
else if (clk_en && (state == STATE_DCT_DC_CHROMI_SIZE) && block_chromi2_code[12]) dct_dc_pred <= dct_dc_pred_2; // Cr block
|
1917 |
|
|
else if (clk_en && (state == STATE_DCT_DC_DIFF))
|
1918 |
|
|
begin
|
1919 |
|
|
if (dct_dc_size == 4'd0) dct_dc_pred <= dct_dc_pred;
|
1920 |
|
|
else if (getbits[23] == 1'b0) dct_dc_pred <= dct_dc_pred + dct_dc_pred_add - dct_dc_pred_sub;
|
1921 |
|
|
else dct_dc_pred <= dct_dc_pred + dct_dc_pred_add;
|
1922 |
|
|
end
|
1923 |
|
|
else dct_dc_pred <= dct_dc_pred;
|
1924 |
|
|
|
1925 |
|
|
// luminance (Y) dct dc predictor
|
1926 |
|
|
always @(posedge clk)
|
1927 |
|
|
if (~rst) dct_dc_pred_0 <= 11'b0;
|
1928 |
|
|
else if (clk_en && ((state == STATE_SLICE) || // at the start of a slice (par. 7.2.1)
|
1929 |
|
|
((state == STATE_BLOCK) && ~macroblock_intra) || // whenever a non-intra macroblock is decoded (par. 7.2.1.)
|
1930 |
|
|
(state == STATE_MACROBLOCK_SKIP) )) // whenever a macroblock is skipped, i.e. when macroblock_address_increment > 1
|
1931 |
|
|
dct_dc_pred_0 <= 11'b0; // the mpeg2 reference implementation (mpeg2decode) does not reset dct_dc_pred[i] to 11'd128 << intra_dc_precision; rather it adds 128 to the reconstructed output.
|
1932 |
|
|
else if (clk_en && (state == STATE_DCT_DC_DIFF_0) && block_lumi_code[12]) dct_dc_pred_0 <= dct_dc_pred;
|
1933 |
|
|
else dct_dc_pred_0 <= dct_dc_pred_0;
|
1934 |
|
|
|
1935 |
|
|
// first chrominance (Cb) dct dc predictor
|
1936 |
|
|
always @(posedge clk)
|
1937 |
|
|
if (~rst) dct_dc_pred_1 <= 11'b0;
|
1938 |
|
|
else if (clk_en && ((state == STATE_SLICE) || // at the start of a slice (par. 7.2.1)
|
1939 |
|
|
((state == STATE_BLOCK) && ~macroblock_intra) || // whenever a non-intra macroblock is decoded (par. 7.2.1.)
|
1940 |
|
|
(state == STATE_MACROBLOCK_SKIP) )) // whenever a macroblock is skipped, i.e. when macroblock_address_increment > 1
|
1941 |
|
|
dct_dc_pred_1 <= 11'b0; // the mpeg2 reference implementation (mpeg2decode) does not reset dct_dc_pred[i] to 11'd128 << intra_dc_precision; rather it adds 128 to the reconstructed output.
|
1942 |
|
|
else if (clk_en && (state == STATE_DCT_DC_DIFF_0) && block_chromi1_code[12]) dct_dc_pred_1 <= dct_dc_pred;
|
1943 |
|
|
else dct_dc_pred_1 <= dct_dc_pred_1;
|
1944 |
|
|
|
1945 |
|
|
// second chrominance (Cr) dct dc predictor
|
1946 |
|
|
always @(posedge clk)
|
1947 |
|
|
if (~rst) dct_dc_pred_2 <= 11'b0;
|
1948 |
|
|
else if (clk_en && ((state == STATE_SLICE) || // at the start of a slice (par. 7.2.1)
|
1949 |
|
|
((state == STATE_BLOCK) && ~macroblock_intra) || // whenever a non-intra macroblock is decoded (par. 7.2.1.)
|
1950 |
|
|
(state == STATE_MACROBLOCK_SKIP) )) // whenever a macroblock is skipped, i.e. when macroblock_address_increment > 1
|
1951 |
|
|
dct_dc_pred_2 <= 11'b0; // the mpeg2 reference implementation (mpeg2decode) does not reset dct_dc_pred[i] to 11'd128 << intra_dc_precision; rather it adds 128 to the reconstructed output.
|
1952 |
|
|
else if (clk_en && (state == STATE_DCT_DC_DIFF_0) && block_chromi2_code[12]) dct_dc_pred_2 <= dct_dc_pred;
|
1953 |
|
|
else dct_dc_pred_2 <= dct_dc_pred_2;
|
1954 |
|
|
|
1955 |
|
|
|
1956 |
|
|
/* dct coefficients */
|
1957 |
|
|
assign dct_coefficient_escape = (getbits[23:18] == 6'b000001); // one if dct coefficient escape in table B-14 or B-15
|
1958 |
|
|
|
1959 |
|
|
/* dct coeeficients are vlc decoded - still unsigned - and clocked in dct_coeff_run_0 and dct_coeff_signed_level_0.
|
1960 |
|
|
* next clock, the sign bit is applied, and the run/level pair is clocked in dct_coeff_run and dct_coeff_signed_level .
|
1961 |
|
|
*
|
1962 |
|
|
* A non-coded block (STATE_NON_CODED_BLOCK) or a block of a skipped macroblock (STATE_EMIT_EMPTY_BLOCK) is coded as a single zero,
|
1963 |
|
|
* which also is the end of block. run=0, level=0, signed_level=0, end=1, valid=1.
|
1964 |
|
|
*/
|
1965 |
|
|
|
1966 |
|
|
always @(posedge clk)
|
1967 |
|
|
if (~rst) dct_coeff_run_0 <= 5'd0;
|
1968 |
|
|
else if (clk_en && ((state == STATE_DCT_SUBS_B15) || (state == STATE_DCT_SUBS_B14) || (state == STATE_DCT_NON_INTRA_FIRST)) && dct_coefficient_escape) dct_coeff_run_0 <= getbits[17:12];
|
1969 |
|
|
else if (clk_en && (state == STATE_DCT_SUBS_B15)) dct_coeff_run_0 <= dct_coefficient_1_decoded[10:6];
|
1970 |
|
|
else if (clk_en && (state == STATE_DCT_SUBS_B14)) dct_coeff_run_0 <= dct_coefficient_0_decoded[10:6];
|
1971 |
|
|
else if (clk_en && (state == STATE_DCT_NON_INTRA_FIRST)) dct_coeff_run_0 <= dct_non_intra_first_coefficient_0_decoded[10:6];
|
1972 |
|
|
else if (clk_en && (state == STATE_DCT_DC_DIFF_0)) dct_coeff_run_0 <= 5'd0; // first (=dc) coefficient of intra block is never preceded by zeroes
|
1973 |
|
|
else if (clk_en && ((state == STATE_NON_CODED_BLOCK) || (state == STATE_EMIT_EMPTY_BLOCK))) dct_coeff_run_0 <= 5'd0; // non-coded block: all zeroes.
|
1974 |
|
|
else dct_coeff_run_0 <= dct_coeff_run_0;
|
1975 |
|
|
|
1976 |
|
|
always @(posedge clk)
|
1977 |
|
|
if (~rst) dct_coeff_signed_level_0 <= 12'd0;
|
1978 |
|
|
else if (clk_en && ((state == STATE_DCT_ESCAPE_B15) || (state == STATE_DCT_ESCAPE_B14))) dct_coeff_signed_level_0 <= getbits[23:12];
|
1979 |
|
|
else if (clk_en && (state == STATE_DCT_SUBS_B15) && ~dct_coefficient_escape) dct_coeff_signed_level_0 <= dct_coefficient_1_decoded[5:0]; // still needs sign
|
1980 |
|
|
else if (clk_en && (state == STATE_DCT_SUBS_B14) && ~dct_coefficient_escape) dct_coeff_signed_level_0 <= dct_coefficient_0_decoded[5:0]; // still needs sign
|
1981 |
|
|
else if (clk_en && (state == STATE_DCT_NON_INTRA_FIRST) && ~dct_coefficient_escape) dct_coeff_signed_level_0 <= dct_non_intra_first_coefficient_0_decoded[5:0]; // still needs sign
|
1982 |
|
|
else if (clk_en && (state == STATE_DCT_DC_DIFF_0)) dct_coeff_signed_level_0 <= {dct_dc_pred[10], dct_dc_pred}; // sign extend dc (first) coefficient of intra block
|
1983 |
|
|
else if (clk_en && (state == STATE_NON_CODED_BLOCK) || (state == STATE_EMIT_EMPTY_BLOCK)) dct_coeff_signed_level_0 <= 12'd0; // non-coded block: all zeroes.
|
1984 |
|
|
else dct_coeff_signed_level_0 <= dct_coeff_signed_level_0;
|
1985 |
|
|
|
1986 |
|
|
always @(posedge clk)
|
1987 |
|
|
if (~rst) dct_coeff_apply_signbit_0 <= 1'b0;
|
1988 |
|
|
else if (clk_en && ((state == STATE_DCT_DC_DIFF_0) || (state == STATE_DCT_ESCAPE_B15) || (state == STATE_DCT_ESCAPE_B14))) dct_coeff_apply_signbit_0 <= 1'b0;
|
1989 |
|
|
else if (clk_en && ((state == STATE_DCT_SUBS_B14) || (state == STATE_DCT_SUBS_B15) || (state == STATE_DCT_NON_INTRA_FIRST))) dct_coeff_apply_signbit_0 <= ~dct_coefficient_escape;
|
1990 |
|
|
else if (clk_en && (state == STATE_NON_CODED_BLOCK) || (state == STATE_EMIT_EMPTY_BLOCK)) dct_coeff_apply_signbit_0 <= 1'b0; // non-coded block: all zeroes.
|
1991 |
|
|
else dct_coeff_apply_signbit_0 <= dct_coeff_apply_signbit_0;
|
1992 |
|
|
|
1993 |
|
|
always @(posedge clk)
|
1994 |
|
|
if (~rst) dct_coeff_valid_0 <= 1'b0;
|
1995 |
|
|
else if (clk_en && ((state == STATE_DCT_DC_DIFF_0) || (state == STATE_DCT_ESCAPE_B15) || (state == STATE_DCT_ESCAPE_B14) || (state == STATE_NON_CODED_BLOCK) || (state == STATE_EMIT_EMPTY_BLOCK))) dct_coeff_valid_0 <= 1'b1;
|
1996 |
|
|
else if (clk_en && ((state == STATE_DCT_SUBS_B14) || (state == STATE_DCT_SUBS_B15) || (state == STATE_DCT_NON_INTRA_FIRST))) dct_coeff_valid_0 <= ~dct_coefficient_escape;
|
1997 |
|
|
else if (clk_en) dct_coeff_valid_0 <= 1'b0;
|
1998 |
|
|
else dct_coeff_valid_0 <= dct_coeff_valid_0;
|
1999 |
|
|
|
2000 |
|
|
always @(posedge clk)
|
2001 |
|
|
if (~rst) dct_coeff_end_0 <= 1'b0;
|
2002 |
|
|
else if (clk_en) dct_coeff_end_0 <= ((state == STATE_DCT_SUBS_B14) && (getbits[23:22] == 2'b10)) || ((state == STATE_DCT_SUBS_B15) && (getbits[23:20] == 4'b0110)) || (state == STATE_NON_CODED_BLOCK) || (state == STATE_EMIT_EMPTY_BLOCK);
|
2003 |
|
|
else dct_coeff_end_0 <= dct_coeff_end_0;
|
2004 |
|
|
|
2005 |
|
|
// Now we clock dct_coeff_run_0 into dct_coeff_run, dct_coeff_signed_level_0 into dct_coeff_signed_level, and apply sign bit, if needed.
|
2006 |
|
|
//
|
2007 |
|
|
always @(posedge clk)
|
2008 |
|
|
if (~rst) dct_coeff_run <= 5'd0;
|
2009 |
|
|
else if (clk_en) dct_coeff_run <= dct_coeff_run_0;
|
2010 |
|
|
else dct_coeff_run <= dct_coeff_run;
|
2011 |
|
|
|
2012 |
|
|
always @(posedge clk)
|
2013 |
|
|
if (~rst) dct_coeff_signed_level <= 12'd0;
|
2014 |
|
|
else if (clk_en) dct_coeff_signed_level <= (dct_coeff_apply_signbit_0 && signbit) ? 12'd1 + ~dct_coeff_signed_level_0 : dct_coeff_signed_level_0; // 2's complement -> negative
|
2015 |
|
|
else dct_coeff_signed_level <= dct_coeff_signed_level;
|
2016 |
|
|
|
2017 |
|
|
always @(posedge clk)
|
2018 |
|
|
if (~rst) dct_coeff_valid <= 1'b0;
|
2019 |
|
|
else if (clk_en) dct_coeff_valid <= dct_coeff_valid_0;
|
2020 |
|
|
else dct_coeff_valid <= dct_coeff_valid;
|
2021 |
|
|
|
2022 |
|
|
always @(posedge clk)
|
2023 |
|
|
if (~rst) dct_coeff_end <= 1'b0;
|
2024 |
|
|
else if (clk_en) dct_coeff_end <= dct_coeff_end_0;
|
2025 |
|
|
else dct_coeff_end <= dct_coeff_end;
|
2026 |
|
|
|
2027 |
|
|
/* coded block pattern */
|
2028 |
|
|
always @(posedge clk) // // par. 6.3.17.4
|
2029 |
|
|
if (~rst) coded_block_pattern <= 12'b0;
|
2030 |
|
|
else if (clk_en && (state == STATE_MOTION_PIPELINE_FLUSH))
|
2031 |
|
|
begin
|
2032 |
|
|
if (macroblock_intra) // default values
|
2033 |
|
|
case (chroma_format)
|
2034 |
|
|
CHROMA420: coded_block_pattern <= {12'b111111000000};
|
2035 |
|
|
CHROMA422: coded_block_pattern <= {12'b111111110000};
|
2036 |
|
|
CHROMA444: coded_block_pattern <= {12'b111111111111};
|
2037 |
|
|
default coded_block_pattern <= {12'b000000000000}; // error
|
2038 |
|
|
endcase
|
2039 |
|
|
else
|
2040 |
|
|
coded_block_pattern <= 12'b000000000000;
|
2041 |
|
|
end
|
2042 |
|
|
else if (clk_en && (state == STATE_CODED_BLOCK_PATTERN)) coded_block_pattern <= {coded_block_pattern_value, 6'b0};
|
2043 |
|
|
else if (clk_en && (state == STATE_CODED_BLOCK_PATTERN_1)) coded_block_pattern <= {coded_block_pattern[11:6], getbits[23:22], 4'b0};
|
2044 |
|
|
else if (clk_en && (state == STATE_CODED_BLOCK_PATTERN_2)) coded_block_pattern <= {coded_block_pattern[11:6], getbits[23:18]};
|
2045 |
|
|
else if (clk_en && (state == STATE_NEXT_BLOCK)) coded_block_pattern <= (coded_block_pattern << 1);
|
2046 |
|
|
else if (clk_en && (state == STATE_DCT_ERROR)) coded_block_pattern <= 12'b000000000000; // error occurred; output remaining blocks as non-coded blocks
|
2047 |
|
|
else coded_block_pattern <= coded_block_pattern;
|
2048 |
|
|
|
2049 |
|
|
/* block loop registers */
|
2050 |
|
|
/*
|
2051 |
|
|
* block_pattern_code and block_lumi_code are used in the loop which is
|
2052 |
|
|
* symbolically coded in par. 6.2.5 as:
|
2053 |
|
|
* for ( i = 0; i < block_count; i + + ) {
|
2054 |
|
|
* block( i )
|
2055 |
|
|
* }
|
2056 |
|
|
*
|
2057 |
|
|
* We set up two registers, block_pattern_code and block_lumi_code.
|
2058 |
|
|
* The "one" bits in block_pattern_code correspond to the blocks present
|
2059 |
|
|
* in the macroblock.
|
2060 |
|
|
* The "one" bits in block_lumi_code correspond to the luminance blocks
|
2061 |
|
|
* in the macroblock (the first four blocks).
|
2062 |
|
|
* Both block_pattern_code and block_lumi_code are shifted left one bit
|
2063 |
|
|
* after each block. Macroblock ends when block_pattern_code is zero.
|
2064 |
|
|
*/
|
2065 |
|
|
|
2066 |
|
|
always @(posedge clk)
|
2067 |
|
|
if (~rst) block_pattern_code <= 12'b0;
|
2068 |
|
|
else if (clk_en && (state == STATE_MOTION_PIPELINE_FLUSH))
|
2069 |
|
|
case (chroma_format) // Table 6-20
|
2070 |
|
|
CHROMA420: block_pattern_code <= {12'b111111000000};
|
2071 |
|
|
CHROMA422: block_pattern_code <= {12'b111111110000};
|
2072 |
|
|
CHROMA444: block_pattern_code <= {12'b111111111111};
|
2073 |
|
|
default block_pattern_code <= {12'b000000000000}; // error
|
2074 |
|
|
endcase
|
2075 |
|
|
else if (clk_en && (state == STATE_NEXT_BLOCK)) block_pattern_code <= (block_pattern_code << 1);
|
2076 |
|
|
else block_pattern_code <= block_pattern_code;
|
2077 |
|
|
|
2078 |
|
|
always @(posedge clk)
|
2079 |
|
|
if (~rst) block_lumi_code <= 6'b0;
|
2080 |
|
|
else if (clk_en && (state == STATE_BLOCK)) block_lumi_code <= 6'b011110;
|
2081 |
|
|
else if (clk_en && (state == STATE_NEXT_BLOCK)) block_lumi_code <= (block_lumi_code << 1);
|
2082 |
|
|
else block_lumi_code <= block_lumi_code;
|
2083 |
|
|
|
2084 |
|
|
always @(posedge clk)
|
2085 |
|
|
if (~rst) block_chromi1_code <= 13'b0;
|
2086 |
|
|
else if (clk_en && (state == STATE_BLOCK)) block_chromi1_code <= 13'b0000010101010;
|
2087 |
|
|
else if (clk_en && (state == STATE_NEXT_BLOCK)) block_chromi1_code <= (block_chromi1_code << 1);
|
2088 |
|
|
else block_chromi1_code <= block_chromi1_code;
|
2089 |
|
|
|
2090 |
|
|
always @(posedge clk)
|
2091 |
|
|
if (~rst) block_chromi2_code <= 13'b0;
|
2092 |
|
|
else if (clk_en && (state == STATE_BLOCK)) block_chromi2_code <= 13'b0000001010101;
|
2093 |
|
|
else if (clk_en && (state == STATE_NEXT_BLOCK)) block_chromi2_code <= (block_chromi2_code << 1);
|
2094 |
|
|
else block_chromi2_code <= block_chromi2_code;
|
2095 |
|
|
|
2096 |
|
|
`ifdef DEBUG
|
2097 |
|
|
always @(posedge clk)
|
2098 |
|
|
if (clk_en)
|
2099 |
|
|
case (state)
|
2100 |
|
|
STATE_NEXT_START_CODE: #0 $display("%m\tSTATE_NEXT_START_CODE");
|
2101 |
|
|
STATE_START_CODE: #0 $display("%m\tSTATE_START_CODE");
|
2102 |
|
|
STATE_PICTURE_HEADER: #0 $display("%m\tSTATE_PICTURE_HEADER");
|
2103 |
|
|
STATE_PICTURE_HEADER0: #0 $display("%m\tSTATE_PICTURE_HEADER0");
|
2104 |
|
|
STATE_PICTURE_HEADER1: #0 $display("%m\tSTATE_PICTURE_HEADER1");
|
2105 |
|
|
STATE_PICTURE_HEADER2: #0 $display("%m\tSTATE_PICTURE_HEADER2");
|
2106 |
|
|
STATE_SEQUENCE_HEADER: #0 $display("%m\tSTATE_SEQUENCE_HEADER");
|
2107 |
|
|
STATE_SEQUENCE_HEADER0: #0 $display("%m\tSTATE_SEQUENCE_HEADER0");
|
2108 |
|
|
STATE_SEQUENCE_HEADER1: #0 $display("%m\tSTATE_SEQUENCE_HEADER1");
|
2109 |
|
|
STATE_SEQUENCE_HEADER2: #0 $display("%m\tSTATE_SEQUENCE_HEADER2");
|
2110 |
|
|
STATE_SEQUENCE_HEADER3: #0 $display("%m\tSTATE_SEQUENCE_HEADER3");
|
2111 |
|
|
STATE_GROUP_HEADER: #0 $display("%m\tSTATE_GROUP_HEADER");
|
2112 |
|
|
STATE_GROUP_HEADER0: #0 $display("%m\tSTATE_GROUP_HEADER0");
|
2113 |
|
|
STATE_EXTENSION_START_CODE: #0 $display("%m\tSTATE_EXTENSION_START_CODE");
|
2114 |
|
|
STATE_SEQUENCE_EXT: #0 $display("%m\tSTATE_SEQUENCE_EXT");
|
2115 |
|
|
STATE_SEQUENCE_EXT0: #0 $display("%m\tSTATE_SEQUENCE_EXT0");
|
2116 |
|
|
STATE_SEQUENCE_EXT1: #0 $display("%m\tSTATE_SEQUENCE_EXT1");
|
2117 |
|
|
STATE_SEQUENCE_DISPLAY_EXT: #0 $display("%m\tSTATE_SEQUENCE_DISPLAY_EXT");
|
2118 |
|
|
STATE_SEQUENCE_DISPLAY_EXT0: #0 $display("%m\tSTATE_SEQUENCE_DISPLAY_EXT0");
|
2119 |
|
|
STATE_SEQUENCE_DISPLAY_EXT1: #0 $display("%m\tSTATE_SEQUENCE_DISPLAY_EXT1");
|
2120 |
|
|
STATE_SEQUENCE_DISPLAY_EXT2: #0 $display("%m\tSTATE_SEQUENCE_DISPLAY_EXT2");
|
2121 |
|
|
STATE_QUANT_MATRIX_EXT: #0 $display("%m\tSTATE_QUANT_MATRIX_EXT");
|
2122 |
|
|
STATE_PICTURE_CODING_EXT: #0 $display("%m\tSTATE_PICTURE_CODING_EXT");
|
2123 |
|
|
STATE_PICTURE_CODING_EXT0: #0 $display("%m\tSTATE_PICTURE_CODING_EXT0");
|
2124 |
|
|
STATE_PICTURE_CODING_EXT1: #0 $display("%m\tSTATE_PICTURE_CODING_EXT1");
|
2125 |
|
|
STATE_LD_INTRA_QUANT0: #0 $display("%m\tSTATE_LD_INTRA_QUANT0");
|
2126 |
|
|
STATE_LD_INTRA_QUANT1: #0 $display("%m\tSTATE_LD_INTRA_QUANT1");
|
2127 |
|
|
STATE_LD_NON_INTRA_QUANT0: #0 $display("%m\tSTATE_LD_NON_INTRA_QUANT0");
|
2128 |
|
|
STATE_LD_NON_INTRA_QUANT1: #0 $display("%m\tSTATE_LD_NON_INTRA_QUANT1");
|
2129 |
|
|
STATE_LD_CHROMA_INTRA_QUANT1: #0 $display("%m\tSTATE_LD_CHROMA_INTRA_QUANT1");
|
2130 |
|
|
STATE_LD_CHROMA_NON_INTRA_QUANT1: #0 $display("%m\tSTATE_LD_CHROMA_NON_INTRA_QUANT1");
|
2131 |
|
|
STATE_SLICE: #0 $display("%m\tSTATE_SLICE");
|
2132 |
|
|
STATE_SLICE_EXTENSION: #0 $display("%m\tSTATE_SLICE_EXTENSION");
|
2133 |
|
|
STATE_SLICE_EXTRA_INFORMATION: #0 $display("%m\tSTATE_SLICE_EXTRA_INFORMATION");
|
2134 |
|
|
STATE_NEXT_MACROBLOCK: #0 $display("%m\tSTATE_NEXT_MACROBLOCK");
|
2135 |
|
|
STATE_MACROBLOCK_SKIP: #0 $display("%m\tSTATE_MACROBLOCK_SKIP");
|
2136 |
|
|
STATE_DELAY_EMPTY_BLOCK: #0 $display("%m\tSTATE_DELAY_EMPTY_BLOCK");
|
2137 |
|
|
STATE_EMIT_EMPTY_BLOCK: #0 $display("%m\tSTATE_EMIT_EMPTY_BLOCK");
|
2138 |
|
|
STATE_MACROBLOCK_TYPE: #0 $display("%m\tSTATE_MACROBLOCK_TYPE");
|
2139 |
|
|
STATE_MOTION_TYPE: #0 $display("%m\tSTATE_MOTION_TYPE");
|
2140 |
|
|
STATE_DCT_TYPE: #0 $display("%m\tSTATE_DCT_TYPE");
|
2141 |
|
|
STATE_MACROBLOCK_QUANT: #0 $display("%m\tSTATE_MACROBLOCK_QUANT");
|
2142 |
|
|
STATE_NEXT_MOTION_VECTOR: #0 $display("%m\tSTATE_NEXT_MOTION_VECTOR");
|
2143 |
|
|
STATE_MOTION_VERT_FLD_SEL: #0 $display("%m\tSTATE_MOTION_VERT_FLD_SEL");
|
2144 |
|
|
STATE_MOTION_CODE: #0 $display("%m\tSTATE_MOTION_CODE");
|
2145 |
|
|
STATE_MOTION_RESIDUAL: #0 $display("%m\tSTATE_MOTION_RESIDUAL");
|
2146 |
|
|
STATE_MOTION_DMVECTOR: #0 $display("%m\tSTATE_MOTION_DMVECTOR");
|
2147 |
|
|
STATE_MOTION_PREDICT: #0 $display("%m\tSTATE_MOTION_PREDICT");
|
2148 |
|
|
STATE_MOTION_PIPELINE_FLUSH: #0 $display("%m\tSTATE_MOTION_PIPELINE_FLUSH");
|
2149 |
|
|
STATE_MARKER_BIT_0: #0 $display("%m\tSTATE_MARKER_BIT_0");
|
2150 |
|
|
STATE_CODED_BLOCK_PATTERN: #0 $display("%m\tSTATE_CODED_BLOCK_PATTERN");
|
2151 |
|
|
STATE_CODED_BLOCK_PATTERN_1: #0 $display("%m\tSTATE_CODED_BLOCK_PATTERN_1");
|
2152 |
|
|
STATE_CODED_BLOCK_PATTERN_2: #0 $display("%m\tSTATE_CODED_BLOCK_PATTERN_2");
|
2153 |
|
|
STATE_BLOCK: #0 $display("%m\tSTATE_BLOCK");
|
2154 |
|
|
STATE_NEXT_BLOCK: #0 $display("%m\tSTATE_NEXT_BLOCK");
|
2155 |
|
|
STATE_DCT_DC_LUMI_SIZE: #0 $display("%m\tSTATE_DCT_DC_LUMI_SIZE");
|
2156 |
|
|
STATE_DCT_DC_CHROMI_SIZE: #0 $display("%m\tSTATE_DCT_DC_CHROMI_SIZE");
|
2157 |
|
|
STATE_DCT_DC_DIFF: #0 $display("%m\tSTATE_DCT_DC_DIFF");
|
2158 |
|
|
STATE_DCT_DC_DIFF_0: #0 $display("%m\tSTATE_DCT_DC_DIFF_0");
|
2159 |
|
|
STATE_DCT_SUBS_B15: #0 $display("%m\tSTATE_DCT_SUBS_B15");
|
2160 |
|
|
STATE_DCT_ESCAPE_B15: #0 $display("%m\tSTATE_DCT_ESCAPE_B15");
|
2161 |
|
|
STATE_DCT_SUBS_B14: #0 $display("%m\tSTATE_DCT_SUBS_B14");
|
2162 |
|
|
STATE_DCT_ESCAPE_B14: #0 $display("%m\tSTATE_DCT_ESCAPE_B14");
|
2163 |
|
|
STATE_DCT_NON_INTRA_FIRST: #0 $display("%m\tSTATE_DCT_NON_INTRA_FIRST");
|
2164 |
|
|
STATE_NON_CODED_BLOCK: #0 $display("%m\tSTATE_NON_CODED_BLOCK");
|
2165 |
|
|
STATE_DCT_ERROR: #0 $display("%m\tSTATE_DCT_ERROR");
|
2166 |
|
|
STATE_SEQUENCE_END: #0 $display("%m\tSTATE_SEQUENCE_END");
|
2167 |
|
|
STATE_ERROR: #0 $display("%m\tSTATE_ERROR");
|
2168 |
|
|
default begin
|
2169 |
|
|
#0 $display("%m\tUnknown state");
|
2170 |
|
|
$finish;
|
2171 |
|
|
end
|
2172 |
|
|
endcase
|
2173 |
|
|
else
|
2174 |
|
|
begin
|
2175 |
|
|
#0 $display("%m\tnot clk_en");
|
2176 |
|
|
end
|
2177 |
|
|
|
2178 |
|
|
always @(posedge clk)
|
2179 |
|
|
if (clk_en)
|
2180 |
|
|
case (state)
|
2181 |
|
|
STATE_SEQUENCE_HEADER2:
|
2182 |
|
|
begin
|
2183 |
|
|
$strobe ("%m\tmb_width: %d", mb_width);
|
2184 |
|
|
$strobe ("%m\tmb_height: %d", mb_height);
|
2185 |
|
|
end
|
2186 |
|
|
|
2187 |
|
|
STATE_LD_INTRA_QUANT1,
|
2188 |
|
|
STATE_LD_NON_INTRA_QUANT0,
|
2189 |
|
|
STATE_LD_NON_INTRA_QUANT1,
|
2190 |
|
|
STATE_LD_CHROMA_INTRA_QUANT1,
|
2191 |
|
|
STATE_LD_CHROMA_NON_INTRA_QUANT1:
|
2192 |
|
|
begin
|
2193 |
|
|
$strobe ("%m\tcnt: %d", cnt);
|
2194 |
|
|
$strobe ("%m\tquant_wr_data: %d", quant_wr_data);
|
2195 |
|
|
$strobe ("%m\tquant_wr_addr: %d", quant_wr_addr);
|
2196 |
|
|
end
|
2197 |
|
|
STATE_SLICE:
|
2198 |
|
|
begin
|
2199 |
|
|
$strobe ("%m\tslice_vertical_position: %d", slice_vertical_position);
|
2200 |
|
|
$strobe ("%m\tquantiser_scale_code: %d", quantiser_scale_code);
|
2201 |
|
|
$strobe ("%m\tslice_extension_flag: %d", slice_extension_flag);
|
2202 |
|
|
end
|
2203 |
|
|
|
2204 |
|
|
STATE_SLICE_EXTENSION:
|
2205 |
|
|
begin
|
2206 |
|
|
$strobe ("%m\tintra_slice: %d", intra_slice);
|
2207 |
|
|
$strobe ("%m\tslice_picture_id_enable: %d", slice_picture_id_enable);
|
2208 |
|
|
$strobe ("%m\tslice_picture_id: %d", slice_picture_id);
|
2209 |
|
|
end
|
2210 |
|
|
|
2211 |
|
|
//STATE_SLICE_EXTRA_INFORMATION:
|
2212 |
|
|
STATE_NEXT_MACROBLOCK:
|
2213 |
|
|
begin
|
2214 |
|
|
$strobe ("%m\tmacroblock_addr_inc_value: %d", macroblock_addr_inc_value);
|
2215 |
|
|
$strobe ("%m\tmacroblock_address_increment: %d", macroblock_address_increment);
|
2216 |
|
|
end
|
2217 |
|
|
|
2218 |
|
|
STATE_MACROBLOCK_SKIP:
|
2219 |
|
|
begin
|
2220 |
|
|
$strobe ("%m\tmacroblock_address: %d", macroblock_address);
|
2221 |
|
|
$strobe ("%m\tmacroblock_address_increment: %d", macroblock_address_increment);
|
2222 |
|
|
$strobe ("%m\tmotion_type: %d", motion_type);
|
2223 |
|
|
$strobe ("%m\tpmv_reset: %d", pmv_reset);
|
2224 |
|
|
$strobe ("%m\tdct_dc_pred_0: %d", dct_dc_pred_0);
|
2225 |
|
|
$strobe ("%m\tdct_dc_pred_1: %d", dct_dc_pred_1);
|
2226 |
|
|
$strobe ("%m\tdct_dc_pred_2: %d", dct_dc_pred_2);
|
2227 |
|
|
end
|
2228 |
|
|
|
2229 |
|
|
STATE_EMIT_EMPTY_BLOCK:
|
2230 |
|
|
begin
|
2231 |
|
|
$strobe ("%m\tempty_blocks: %11b", empty_blocks);
|
2232 |
|
|
end
|
2233 |
|
|
|
2234 |
|
|
STATE_MACROBLOCK_TYPE:
|
2235 |
|
|
begin
|
2236 |
|
|
$strobe ("%m\tmacroblock_address: %d", macroblock_address);
|
2237 |
|
|
$strobe ("%m\tmacroblock_address_increment: %d", macroblock_address_increment);
|
2238 |
|
|
$strobe ("%m\tmacroblock_quant: %d", macroblock_quant);
|
2239 |
|
|
$strobe ("%m\tmacroblock_motion_forward: %d", macroblock_motion_forward);
|
2240 |
|
|
$strobe ("%m\tmacroblock_motion_backward: %d", macroblock_motion_backward);
|
2241 |
|
|
$strobe ("%m\tmacroblock_pattern: %d", macroblock_pattern);
|
2242 |
|
|
$strobe ("%m\tmacroblock_intra: %d", macroblock_intra);
|
2243 |
|
|
$strobe ("%m\tspatial_temporal_weight_code_flag: %d", spatial_temporal_weight_code_flag);
|
2244 |
|
|
$strobe ("%m\tmotion_type: %d", motion_type);
|
2245 |
|
|
end
|
2246 |
|
|
|
2247 |
|
|
STATE_MOTION_TYPE:
|
2248 |
|
|
begin
|
2249 |
|
|
$strobe ("%m\tmotion_type: %d", motion_type);
|
2250 |
|
|
end
|
2251 |
|
|
|
2252 |
|
|
STATE_DCT_TYPE:
|
2253 |
|
|
begin
|
2254 |
|
|
$strobe ("%m\tdct_type: %d", dct_type);
|
2255 |
|
|
end
|
2256 |
|
|
|
2257 |
|
|
STATE_MACROBLOCK_QUANT:
|
2258 |
|
|
begin
|
2259 |
|
|
if (macroblock_quant) $strobe ("%m\tquantiser_scale_code: %d", quantiser_scale_code);
|
2260 |
|
|
$strobe ("%m\tmotion_vector_reg: %8b", motion_vector_reg);
|
2261 |
|
|
end
|
2262 |
|
|
|
2263 |
|
|
STATE_NEXT_MOTION_VECTOR:
|
2264 |
|
|
begin
|
2265 |
|
|
case (motion_vector)
|
2266 |
|
|
MOTION_VECTOR_0_0_0: $strobe ("%m\tmotion_vector: MOTION_VECTOR_0_0_0");
|
2267 |
|
|
MOTION_VECTOR_0_0_1: $strobe ("%m\tmotion_vector: MOTION_VECTOR_0_0_1");
|
2268 |
|
|
MOTION_VECTOR_1_0_0: $strobe ("%m\tmotion_vector: MOTION_VECTOR_1_0_0");
|
2269 |
|
|
MOTION_VECTOR_1_0_1: $strobe ("%m\tmotion_vector: MOTION_VECTOR_1_0_1");
|
2270 |
|
|
MOTION_VECTOR_0_1_0: $strobe ("%m\tmotion_vector: MOTION_VECTOR_0_1_0");
|
2271 |
|
|
MOTION_VECTOR_0_1_1: $strobe ("%m\tmotion_vector: MOTION_VECTOR_0_1_1");
|
2272 |
|
|
MOTION_VECTOR_1_1_0: $strobe ("%m\tmotion_vector: MOTION_VECTOR_1_1_0");
|
2273 |
|
|
MOTION_VECTOR_1_1_1: $strobe ("%m\tmotion_vector: MOTION_VECTOR_1_1_1");
|
2274 |
|
|
endcase
|
2275 |
|
|
$strobe ("%m\tmotion_vector_reg: %8b", motion_vector_reg);
|
2276 |
|
|
end
|
2277 |
|
|
|
2278 |
|
|
STATE_MOTION_VERT_FLD_SEL:
|
2279 |
|
|
begin
|
2280 |
|
|
$strobe ("%m\t\tmotion_vert_field_select_0_0: %d", motion_vert_field_select_0_0);
|
2281 |
|
|
$strobe ("%m\t\tmotion_vert_field_select_0_1: %d", motion_vert_field_select_0_1);
|
2282 |
|
|
$strobe ("%m\t\tmotion_vert_field_select_1_0: %d", motion_vert_field_select_1_0);
|
2283 |
|
|
$strobe ("%m\t\tmotion_vert_field_select_1_1: %d", motion_vert_field_select_1_1);
|
2284 |
|
|
end
|
2285 |
|
|
|
2286 |
|
|
STATE_MOTION_CODE:
|
2287 |
|
|
begin
|
2288 |
|
|
$strobe ("%m\tr_size: %d", r_size);
|
2289 |
|
|
$strobe ("%m\tmotion_code: %d", motion_code);
|
2290 |
|
|
$strobe ("%m\tmotion_code_neg: %d", motion_code_neg);
|
2291 |
|
|
end
|
2292 |
|
|
|
2293 |
|
|
STATE_MOTION_RESIDUAL:
|
2294 |
|
|
begin
|
2295 |
|
|
$strobe ("%m\tmotion_code_residual: %d", motion_code_residual);
|
2296 |
|
|
end
|
2297 |
|
|
|
2298 |
|
|
STATE_MOTION_DMVECTOR:
|
2299 |
|
|
begin
|
2300 |
|
|
$strobe ("%m\tdmvector: %d", dmvector);
|
2301 |
|
|
end
|
2302 |
|
|
|
2303 |
|
|
STATE_MOTION_PREDICT:
|
2304 |
|
|
begin
|
2305 |
|
|
$strobe ("%m\tmotion_vector_reg: %8b", motion_vector_reg);
|
2306 |
|
|
end
|
2307 |
|
|
|
2308 |
|
|
|
2309 |
|
|
//STATE_MARKER_BIT_0:
|
2310 |
|
|
STATE_CODED_BLOCK_PATTERN,
|
2311 |
|
|
STATE_CODED_BLOCK_PATTERN_1,
|
2312 |
|
|
STATE_CODED_BLOCK_PATTERN_2:
|
2313 |
|
|
begin
|
2314 |
|
|
$strobe ("%m\tchroma_format: d%d", chroma_format);
|
2315 |
|
|
$strobe ("%m\tcoded_block_pattern: b%b", coded_block_pattern);
|
2316 |
|
|
$strobe ("%m\tblock_pattern_code: b%b", block_pattern_code);
|
2317 |
|
|
$strobe ("%m\tblock_lumi_code: b%b", block_lumi_code);
|
2318 |
|
|
$strobe ("%m\tblock_chromi1_code: b%b", block_chromi1_code);
|
2319 |
|
|
$strobe ("%m\tblock_chromi2_code: b%b", block_chromi2_code);
|
2320 |
|
|
end
|
2321 |
|
|
|
2322 |
|
|
STATE_BLOCK:
|
2323 |
|
|
begin
|
2324 |
|
|
#0 $display ("%m\tblock");
|
2325 |
|
|
// helper regs:
|
2326 |
|
|
$strobe ("%m\tmacroblock_intra: b%b", macroblock_intra);
|
2327 |
|
|
$strobe ("%m\tmacroblock_pattern: b%b", macroblock_pattern);
|
2328 |
|
|
$strobe ("%m\tcoded_block_pattern: b%b", coded_block_pattern);
|
2329 |
|
|
// result:
|
2330 |
|
|
$strobe ("%m\tblock_pattern_code: b%b", block_pattern_code);
|
2331 |
|
|
$strobe ("%m\tblock_lumi_code: b%b", block_lumi_code);
|
2332 |
|
|
$strobe ("%m\tblock_chromi1_code: b%b", block_chromi1_code);
|
2333 |
|
|
$strobe ("%m\tblock_chromi2_code: b%b", block_chromi2_code);
|
2334 |
|
|
end
|
2335 |
|
|
|
2336 |
|
|
STATE_NEXT_BLOCK:
|
2337 |
|
|
begin
|
2338 |
|
|
$strobe ("%m\tcoded_block_pattern: b%b", coded_block_pattern);
|
2339 |
|
|
$strobe ("%m\tblock_pattern_code: b%b", block_pattern_code);
|
2340 |
|
|
$strobe ("%m\tblock_lumi_code: b%b", block_lumi_code);
|
2341 |
|
|
$strobe ("%m\tblock_chromi1_code: b%b", block_chromi1_code);
|
2342 |
|
|
$strobe ("%m\tblock_chromi2_code: b%b", block_chromi2_code);
|
2343 |
|
|
end
|
2344 |
|
|
|
2345 |
|
|
STATE_DCT_DC_LUMI_SIZE:
|
2346 |
|
|
begin
|
2347 |
|
|
$strobe ("%m\tdct_dc_size_luminance_length: %d", dct_dc_size_luminance_length);
|
2348 |
|
|
$strobe ("%m\tdct_dc_size_luminance_value: %d", dct_dc_size_luminance_value);
|
2349 |
|
|
$strobe ("%m\tdct_dc_pred: %d (%b)", dct_dc_pred, dct_dc_pred);
|
2350 |
|
|
end
|
2351 |
|
|
|
2352 |
|
|
STATE_DCT_DC_CHROMI_SIZE:
|
2353 |
|
|
begin
|
2354 |
|
|
$strobe ("%m\tdct_dc_size_chrominance_length: %d", dct_dc_size_chrominance_length);
|
2355 |
|
|
$strobe ("%m\tdct_dc_size_chrominance_value: %d", dct_dc_size_chrominance_value);
|
2356 |
|
|
$strobe ("%m\tdct_dc_pred: %d (%b)", dct_dc_pred, dct_dc_pred);
|
2357 |
|
|
end
|
2358 |
|
|
|
2359 |
|
|
STATE_DCT_DC_DIFF:
|
2360 |
|
|
begin
|
2361 |
|
|
$strobe ("%m\tdct_dc_size: %d", dct_dc_size);
|
2362 |
|
|
$strobe ("%m\tdct_dc_pred: %d (%b)", dct_dc_pred, dct_dc_pred);
|
2363 |
|
|
end
|
2364 |
|
|
|
2365 |
|
|
STATE_DCT_DC_DIFF_0:
|
2366 |
|
|
begin
|
2367 |
|
|
if (block_lumi_code[12])
|
2368 |
|
|
begin
|
2369 |
|
|
$strobe ("%m\tdct_dc_pred_0: %d (%b) (Y)", dct_dc_pred_0, dct_dc_pred_0);
|
2370 |
|
|
end
|
2371 |
|
|
else if (block_chromi1_code[12])
|
2372 |
|
|
begin
|
2373 |
|
|
$strobe ("%m\tdct_dc_pred_1: %d (%b) (Cb)", dct_dc_pred_1, dct_dc_pred_1);
|
2374 |
|
|
end
|
2375 |
|
|
else if (block_chromi2_code[12])
|
2376 |
|
|
begin
|
2377 |
|
|
$strobe ("%m\tdct_dc_pred_2: %d (%b) (Cr)", dct_dc_pred_2, dct_dc_pred_2);
|
2378 |
|
|
end
|
2379 |
|
|
end
|
2380 |
|
|
|
2381 |
|
|
STATE_DCT_SUBS_B15,
|
2382 |
|
|
STATE_DCT_SUBS_B14,
|
2383 |
|
|
STATE_DCT_NON_INTRA_FIRST,
|
2384 |
|
|
STATE_DCT_ESCAPE_B15,
|
2385 |
|
|
STATE_DCT_ESCAPE_B14:
|
2386 |
|
|
begin
|
2387 |
|
|
$strobe ("%m\tdct_coeff_run_0: %d", dct_coeff_run_0);
|
2388 |
|
|
$strobe ("%m\tdct_coeff_signed_level_0: %0d (%12b)", dct_coeff_signed_level_0, dct_coeff_signed_level_0);
|
2389 |
|
|
$strobe ("%m\tsignbit: %d", signbit);
|
2390 |
|
|
$strobe ("%m\tdct_coeff_apply_signbit_0: %d", dct_coeff_apply_signbit_0);
|
2391 |
|
|
$strobe ("%m\tdct_coeff_valid_0: %d", dct_coeff_valid_0);
|
2392 |
|
|
$strobe ("%m\tdct_coeff_end_0: %d", dct_coeff_end_0);
|
2393 |
|
|
|
2394 |
|
|
$strobe ("%m\tdct_coeff_run: %d", dct_coeff_run);
|
2395 |
|
|
$strobe ("%m\tdct_coeff_signed_level: %0d (%12b)", dct_coeff_signed_level, dct_coeff_signed_level);
|
2396 |
|
|
$strobe ("%m\tdct_coeff_valid: %d", dct_coeff_valid);
|
2397 |
|
|
$strobe ("%m\tdct_coeff_end: %d", dct_coeff_end);
|
2398 |
|
|
end
|
2399 |
|
|
|
2400 |
|
|
STATE_ERROR:
|
2401 |
|
|
begin
|
2402 |
|
|
$strobe ("%m\tError");
|
2403 |
|
|
end
|
2404 |
|
|
|
2405 |
|
|
endcase
|
2406 |
|
|
|
2407 |
|
|
/* motion vector pipeline status */
|
2408 |
|
|
always @(posedge clk)
|
2409 |
|
|
if (clk_en && (state == STATE_MOTION_PREDICT))
|
2410 |
|
|
begin
|
2411 |
|
|
$strobe ("%m\tr_size: %d", r_size);
|
2412 |
|
|
$strobe ("%m\tmotion_code: %d", motion_code);
|
2413 |
|
|
$strobe ("%m\tmotion_code_residual: %d", motion_code_residual);
|
2414 |
|
|
$strobe ("%m\t\tmotion_vector_valid_0: %d", motion_vector_valid_0);
|
2415 |
|
|
$strobe ("%m\t\tmotion_vector_0: %d", motion_vector_0);
|
2416 |
|
|
$strobe ("%m\t\tpmv_delta_0: %d", pmv_delta_0);
|
2417 |
|
|
$strobe ("%m\t\tpmv_0: %d", pmv_0);
|
2418 |
|
|
$strobe ("%m\t\tmotion_code_neg_0: %d", motion_code_neg_0);
|
2419 |
|
|
$strobe ("%m\t\tr_size_0: %d", r_size_0);
|
2420 |
|
|
end
|
2421 |
|
|
|
2422 |
|
|
always @(posedge clk)
|
2423 |
|
|
if (clk_en && motion_vector_valid_0)
|
2424 |
|
|
begin
|
2425 |
|
|
$strobe ("%m\t\tmotion_vector_valid_1: %d", motion_vector_valid_1);
|
2426 |
|
|
$strobe ("%m\t\tmotion_vector_1: %d", motion_vector_1);
|
2427 |
|
|
$strobe ("%m\t\tpmv_1: %d", pmv_1);
|
2428 |
|
|
$strobe ("%m\t\tr_size_1: %d", r_size_1);
|
2429 |
|
|
$strobe ("%m\t\tshift_pmv: %d", shift_pmv);
|
2430 |
|
|
end
|
2431 |
|
|
|
2432 |
|
|
always @(posedge clk)
|
2433 |
|
|
if (clk_en && motion_vector_valid_1)
|
2434 |
|
|
begin
|
2435 |
|
|
$strobe ("%m\t\tmotion_vector_valid_2: %d", motion_vector_valid_2);
|
2436 |
|
|
$strobe ("%m\t\tmotion_vector_2: %d", motion_vector_2);
|
2437 |
|
|
$strobe ("%m\t\tpmv_2: %d", pmv_2);
|
2438 |
|
|
end
|
2439 |
|
|
|
2440 |
|
|
always @(posedge clk)
|
2441 |
|
|
if (clk_en && motion_vector_valid_2)
|
2442 |
|
|
begin
|
2443 |
|
|
$strobe ("%m\t\tmotion_vector_valid_3: %d", motion_vector_valid_3);
|
2444 |
|
|
$strobe ("%m\t\tmotion_vector_3: %d", motion_vector_3);
|
2445 |
|
|
$strobe ("%m\t\tpmv_3: %d", pmv_3);
|
2446 |
|
|
if (dmv)
|
2447 |
|
|
begin
|
2448 |
|
|
$strobe ("%m\t\tdmvector_aux_a_3: %d", dmvector_aux_a_3);
|
2449 |
|
|
$strobe ("%m\t\tdmvector_aux_b_3: %d", dmvector_aux_b_3);
|
2450 |
|
|
end
|
2451 |
|
|
end
|
2452 |
|
|
|
2453 |
|
|
always @(posedge clk)
|
2454 |
|
|
if (clk_en && motion_vector_valid_3)
|
2455 |
|
|
begin
|
2456 |
|
|
$strobe ("%m\t\tmotion_vector_valid_4: %d", motion_vector_valid_4);
|
2457 |
|
|
$strobe ("%m\t\tmotion_vector_4: %d", motion_vector_4);
|
2458 |
|
|
$strobe ("%m\t\tpmv_4: %d", pmv_4);
|
2459 |
|
|
if (dmv)
|
2460 |
|
|
begin
|
2461 |
|
|
$strobe ("%m\t\tdmvector_aux_a_4: %d", dmvector_aux_a_4);
|
2462 |
|
|
$strobe ("%m\t\tdmvector_aux_b_4: %d", dmvector_aux_b_4);
|
2463 |
|
|
$strobe ("%m\t\te_parity_ref_parity_pred_4: %d", e_parity_ref_parity_pred_4);
|
2464 |
|
|
end
|
2465 |
|
|
end
|
2466 |
|
|
|
2467 |
|
|
always @(posedge clk)
|
2468 |
|
|
if (clk_en && motion_vector_valid_4)
|
2469 |
|
|
begin
|
2470 |
|
|
$strobe ("%m\t\tmotion_vector_valid_5: %d", motion_vector_valid_5);
|
2471 |
|
|
$strobe ("%m\t\tmotion_vector_5: %d", motion_vector_5);
|
2472 |
|
|
$strobe ("%m\t\tpmv_5: %d", pmv_5);
|
2473 |
|
|
if (dmv)
|
2474 |
|
|
begin
|
2475 |
|
|
$strobe ("%m\t\tdmvector_aux_a_5: %d", dmvector_aux_a_5);
|
2476 |
|
|
$strobe ("%m\t\tdmvector_aux_b_5: %d", dmvector_aux_b_5);
|
2477 |
|
|
end
|
2478 |
|
|
end
|
2479 |
|
|
|
2480 |
|
|
always @(posedge clk)
|
2481 |
|
|
if (clk_en && motion_vector_valid_5)
|
2482 |
|
|
case (motion_vector_5)
|
2483 |
|
|
MOTION_VECTOR_0_0_1: $strobe("%m\t\tpmv: %0d,%0d", pmv_0_0_0, pmv_0_0_1);
|
2484 |
|
|
MOTION_VECTOR_0_1_1: $strobe("%m\t\tpmv: %0d,%0d", pmv_0_1_0, pmv_0_1_1);
|
2485 |
|
|
MOTION_VECTOR_1_0_1: $strobe("%m\t\tpmv: %0d,%0d", pmv_1_0_0, pmv_1_0_1);
|
2486 |
|
|
MOTION_VECTOR_1_1_1: $strobe("%m\t\tpmv: %0d,%0d", pmv_1_1_0, pmv_1_1_1);
|
2487 |
|
|
endcase
|
2488 |
|
|
|
2489 |
|
|
always @(posedge clk)
|
2490 |
|
|
if (clk_en && motion_vector_valid_5 && dmv && (motion_vector_5 == MOTION_VECTOR_0_0_1))
|
2491 |
|
|
begin
|
2492 |
|
|
$strobe ("%m\t\tdmv_0_0: %d", dmv_0_0);
|
2493 |
|
|
$strobe ("%m\t\tdmv_0_1: %d", dmv_0_1);
|
2494 |
|
|
$strobe ("%m\t\tdmv_1_0: %d", dmv_1_0);
|
2495 |
|
|
$strobe ("%m\t\tdmv_1_1: %d", dmv_1_1);
|
2496 |
|
|
end
|
2497 |
|
|
|
2498 |
|
|
always @(posedge clk)
|
2499 |
|
|
if (clk_en && pmv_reset)
|
2500 |
|
|
begin
|
2501 |
|
|
#0 $display ("%m\t\tresetting motion vectors. pmv_x_x_x <= 0");
|
2502 |
|
|
end
|
2503 |
|
|
|
2504 |
|
|
always @(posedge clk)
|
2505 |
|
|
if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_0_0) && pmv_update0)
|
2506 |
|
|
begin
|
2507 |
|
|
#0 $display ("%m\t\tupdating motion vectors. pmv_1_0_0 <= pmv_0_0_0");
|
2508 |
|
|
end
|
2509 |
|
|
|
2510 |
|
|
always @(posedge clk)
|
2511 |
|
|
if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_0_1) && pmv_update0)
|
2512 |
|
|
begin
|
2513 |
|
|
#0 $display ("%m\t\tupdating motion vectors. pmv_1_0_1 <= pmv_0_0_1");
|
2514 |
|
|
end
|
2515 |
|
|
|
2516 |
|
|
always @(posedge clk)
|
2517 |
|
|
if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_1_0) && pmv_update1)
|
2518 |
|
|
begin
|
2519 |
|
|
#0 $display ("%m\t\tupdating motion vectors. pmv_1_1_0 <= pmv_0_1_0");
|
2520 |
|
|
end
|
2521 |
|
|
|
2522 |
|
|
always @(posedge clk)
|
2523 |
|
|
if (clk_en && (motion_vector_valid_5) && (motion_vector_5 == MOTION_VECTOR_0_1_1) && pmv_update1)
|
2524 |
|
|
begin
|
2525 |
|
|
#0 $display ("%m\t\tupdating motion vectors. pmv_1_1_1 <= pmv_0_1_1");
|
2526 |
|
|
end
|
2527 |
|
|
|
2528 |
|
|
always @(posedge clk)
|
2529 |
|
|
if (clk_en && ((state == STATE_MOTION_PREDICT) || pmv_reset || motion_vector_valid_5))
|
2530 |
|
|
begin
|
2531 |
|
|
$strobe ("%m\t\tpmv_0_0_0: %d", pmv_0_0_0);
|
2532 |
|
|
$strobe ("%m\t\tpmv_0_0_1: %d", pmv_0_0_1);
|
2533 |
|
|
$strobe ("%m\t\tpmv_1_0_0: %d", pmv_1_0_0);
|
2534 |
|
|
$strobe ("%m\t\tpmv_1_0_1: %d", pmv_1_0_1);
|
2535 |
|
|
$strobe ("%m\t\tpmv_0_1_0: %d", pmv_0_1_0);
|
2536 |
|
|
$strobe ("%m\t\tpmv_0_1_1: %d", pmv_0_1_1);
|
2537 |
|
|
$strobe ("%m\t\tpmv_1_1_0: %d", pmv_1_1_0);
|
2538 |
|
|
$strobe ("%m\t\tpmv_1_1_1: %d", pmv_1_1_1);
|
2539 |
|
|
$strobe ("%m\t\tmotion_vert_field_select_0_0: %d", motion_vert_field_select_0_0);
|
2540 |
|
|
$strobe ("%m\t\tmotion_vert_field_select_0_1: %d", motion_vert_field_select_0_1);
|
2541 |
|
|
$strobe ("%m\t\tmotion_vert_field_select_1_0: %d", motion_vert_field_select_1_0);
|
2542 |
|
|
$strobe ("%m\t\tmotion_vert_field_select_1_1: %d", motion_vert_field_select_1_1);
|
2543 |
|
|
end
|
2544 |
|
|
|
2545 |
|
|
/* fifo status */
|
2546 |
|
|
always @(posedge clk)
|
2547 |
|
|
if (clk_en)
|
2548 |
|
|
begin
|
2549 |
|
|
#0 $display("%m\tgetbits: %h (%b)", getbits, getbits);
|
2550 |
|
|
end
|
2551 |
|
|
|
2552 |
|
|
always @(posedge clk)
|
2553 |
|
|
if (clk_en)
|
2554 |
|
|
begin
|
2555 |
|
|
$strobe("%m\talign: %d advance %d", align, advance);
|
2556 |
|
|
end
|
2557 |
|
|
`endif
|
2558 |
|
|
|
2559 |
|
|
endmodule
|
2560 |
|
|
|
2561 |
|
|
/*
|
2562 |
|
|
Extracts a register from the bitstream.
|
2563 |
|
|
when reset* is asserted, clear register 'fsm_reg'
|
2564 |
|
|
else, when in state 'fsm_state',
|
2565 |
|
|
clock 'width' bits at offset 'offset' in the video stream into the register 'fsm_reg'.
|
2566 |
|
|
|
2567 |
|
|
*/
|
2568 |
|
|
|
2569 |
|
|
module loadreg #(parameter offset=0, width=8, fsm_state = 8'hff) (
|
2570 |
|
|
input clk,
|
2571 |
|
|
input clk_en,
|
2572 |
|
|
input rst,
|
2573 |
|
|
input [7:0]state,
|
2574 |
|
|
input [23:0]getbits,
|
2575 |
|
|
output reg [width-1:0]fsm_reg
|
2576 |
|
|
);
|
2577 |
|
|
always @(posedge clk)
|
2578 |
|
|
begin
|
2579 |
|
|
if (~rst) fsm_reg <= {32{1'b0}}; // gets truncated
|
2580 |
|
|
else if (clk_en && (state == fsm_state))
|
2581 |
|
|
begin
|
2582 |
|
|
fsm_reg <= getbits[23-offset:23-offset-width+1];
|
2583 |
|
|
`ifdef DEBUG
|
2584 |
|
|
$strobe ("%m\t%0d'd%0d (%0d'h%0h, %0d'b%0b)", width, fsm_reg, width, fsm_reg, width, fsm_reg);
|
2585 |
|
|
`endif
|
2586 |
|
|
end
|
2587 |
|
|
else fsm_reg <= fsm_reg;
|
2588 |
|
|
end
|
2589 |
|
|
endmodule
|
2590 |
|
|
|
2591 |
|
|
/* not truncated */
|