//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
// Design : nova
|
// Design : nova
|
// Author(s) : Ke Xu
|
// Author(s) : Ke Xu
|
// Email : eexuke@yahoo.com
|
// Email : eexuke@yahoo.com
|
// File : sum.v
|
// File : sum.v
|
// Generated : Oct 29, 2005
|
// Generated : Oct 29, 2005
|
// Copyright (C) 2008 Ke Xu
|
// Copyright (C) 2008 Ke Xu
|
//-------------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------------
|
// Description
|
// Description
|
// Sum module for residual + prediction
|
// Sum module for residual + prediction
|
// Including output transpose and Intra_mbAddrB_RAM write control
|
// Including output transpose and Intra_mbAddrB_RAM write control
|
//-------------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------------
|
|
|
// synopsys translate_off
|
// synopsys translate_off
|
`include "timescale.v"
|
`include "timescale.v"
|
// synopsys translate_on
|
// synopsys translate_on
|
`include "nova_defines.v"
|
`include "nova_defines.v"
|
|
|
module sum (clk,reset_n,slice_data_state,residual_state,TotalCoeff,curr_CBPLuma_IsZero,CodedBlockPatternChroma,
|
module sum (clk,reset_n,slice_data_state,residual_state,TotalCoeff,curr_CBPLuma_IsZero,CodedBlockPatternChroma,
|
curr_DC_IsZero,curr_DC_scaled,gclk_pred_output,gclk_blk4x4_sum,trigger_blk4x4_rec_sum,
|
curr_DC_IsZero,curr_DC_scaled,gclk_pred_output,gclk_blk4x4_sum,trigger_blk4x4_rec_sum,
|
IQIT_output_0, IQIT_output_1, IQIT_output_2, IQIT_output_3,
|
IQIT_output_0, IQIT_output_1, IQIT_output_2, IQIT_output_3,
|
IQIT_output_4, IQIT_output_5, IQIT_output_6, IQIT_output_7,
|
IQIT_output_4, IQIT_output_5, IQIT_output_6, IQIT_output_7,
|
IQIT_output_8, IQIT_output_9, IQIT_output_10,IQIT_output_11,
|
IQIT_output_8, IQIT_output_9, IQIT_output_10,IQIT_output_11,
|
IQIT_output_12,IQIT_output_13,IQIT_output_14,IQIT_output_15,
|
IQIT_output_12,IQIT_output_13,IQIT_output_14,IQIT_output_15,
|
mb_type_general,Intra4x4_predmode,Intra16x16_predmode,Intra_chroma_predmode,
|
mb_type_general,Intra4x4_predmode,Intra16x16_predmode,Intra_chroma_predmode,
|
Intra_pred_PE0_out,Intra_pred_PE1_out,Intra_pred_PE2_out,Intra_pred_PE3_out,blk4x4_intra_calculate_counter,
|
Intra_pred_PE0_out,Intra_pred_PE1_out,Intra_pred_PE2_out,Intra_pred_PE3_out,blk4x4_intra_calculate_counter,
|
Inter_pred_out0,Inter_pred_out1,Inter_pred_out2,Inter_pred_out3,blk4x4_inter_calculate_counter,Inter_chroma2x2_counter,
|
Inter_pred_out0,Inter_pred_out1,Inter_pred_out2,Inter_pred_out3,blk4x4_inter_calculate_counter,Inter_chroma2x2_counter,
|
Inter_blk4x4_pred_output_valid,mv_below8x8_curr,pos_FracL,mb_num_v,mb_num_h,LowerMB_IsSkip,
|
Inter_blk4x4_pred_output_valid,mv_below8x8_curr,pos_FracL,mb_num_v,mb_num_h,LowerMB_IsSkip,
|
|
|
end_of_one_blk4x4_sum,blk4x4_sum_counter,blk4x4_rec_counter,
|
end_of_one_blk4x4_sum,blk4x4_sum_counter,blk4x4_rec_counter,
|
blk4x4_sum_PE0_out,blk4x4_sum_PE1_out,blk4x4_sum_PE2_out,blk4x4_sum_PE3_out,
|
blk4x4_sum_PE0_out,blk4x4_sum_PE1_out,blk4x4_sum_PE2_out,blk4x4_sum_PE3_out,
|
sum_right_column_reg,blk4x4_rec_counter_2_raster_order,
|
sum_right_column_reg,blk4x4_rec_counter_2_raster_order,
|
blk4x4_pred_output0, blk4x4_pred_output1, blk4x4_pred_output2,
|
blk4x4_pred_output0, blk4x4_pred_output1, blk4x4_pred_output2,
|
blk4x4_pred_output4, blk4x4_pred_output5, blk4x4_pred_output6,
|
blk4x4_pred_output4, blk4x4_pred_output5, blk4x4_pred_output6,
|
blk4x4_pred_output8, blk4x4_pred_output9, blk4x4_pred_output10,
|
blk4x4_pred_output8, blk4x4_pred_output9, blk4x4_pred_output10,
|
blk4x4_pred_output12,blk4x4_pred_output13,blk4x4_pred_output14,
|
blk4x4_pred_output12,blk4x4_pred_output13,blk4x4_pred_output14,
|
Intra_mbAddrB_RAM_wr,Intra_mbAddrB_RAM_wr_addr,Intra_mbAddrB_RAM_din
|
Intra_mbAddrB_RAM_wr,Intra_mbAddrB_RAM_wr_addr,Intra_mbAddrB_RAM_din
|
);
|
);
|
input clk,reset_n;
|
input clk,reset_n;
|
input [3:0] slice_data_state;
|
input [3:0] slice_data_state;
|
input [3:0] residual_state;
|
input [3:0] residual_state;
|
input [4:0] TotalCoeff;
|
input [4:0] TotalCoeff;
|
input curr_CBPLuma_IsZero;
|
input curr_CBPLuma_IsZero;
|
input [1:0] CodedBlockPatternChroma;
|
input [1:0] CodedBlockPatternChroma;
|
input curr_DC_IsZero;
|
input curr_DC_IsZero;
|
input [8:0] curr_DC_scaled;
|
input [8:0] curr_DC_scaled;
|
input gclk_pred_output;
|
input gclk_pred_output;
|
input gclk_blk4x4_sum;
|
input gclk_blk4x4_sum;
|
input trigger_blk4x4_rec_sum;
|
input trigger_blk4x4_rec_sum;
|
//residual from IQIT
|
//residual from IQIT
|
input [8:0] IQIT_output_0, IQIT_output_1, IQIT_output_2, IQIT_output_3;
|
input [8:0] IQIT_output_0, IQIT_output_1, IQIT_output_2, IQIT_output_3;
|
input [8:0] IQIT_output_4, IQIT_output_5, IQIT_output_6, IQIT_output_7;
|
input [8:0] IQIT_output_4, IQIT_output_5, IQIT_output_6, IQIT_output_7;
|
input [8:0] IQIT_output_8, IQIT_output_9, IQIT_output_10,IQIT_output_11;
|
input [8:0] IQIT_output_8, IQIT_output_9, IQIT_output_10,IQIT_output_11;
|
input [8:0] IQIT_output_12,IQIT_output_13,IQIT_output_14,IQIT_output_15;
|
input [8:0] IQIT_output_12,IQIT_output_13,IQIT_output_14,IQIT_output_15;
|
//Intra prediction output
|
//Intra prediction output
|
input [3:0] mb_type_general;
|
input [3:0] mb_type_general;
|
input [3:0] Intra4x4_predmode;
|
input [3:0] Intra4x4_predmode;
|
input [1:0] Intra16x16_predmode;
|
input [1:0] Intra16x16_predmode;
|
input [1:0] Intra_chroma_predmode;
|
input [1:0] Intra_chroma_predmode;
|
input [7:0] Intra_pred_PE0_out,Intra_pred_PE1_out,Intra_pred_PE2_out,Intra_pred_PE3_out;
|
input [7:0] Intra_pred_PE0_out,Intra_pred_PE1_out,Intra_pred_PE2_out,Intra_pred_PE3_out;
|
input [2:0] blk4x4_intra_calculate_counter;
|
input [2:0] blk4x4_intra_calculate_counter;
|
//Inter prediction output
|
//Inter prediction output
|
input [7:0] Inter_pred_out0,Inter_pred_out1,Inter_pred_out2,Inter_pred_out3;
|
input [7:0] Inter_pred_out0,Inter_pred_out1,Inter_pred_out2,Inter_pred_out3;
|
input [1:0] Inter_blk4x4_pred_output_valid;
|
input [1:0] Inter_blk4x4_pred_output_valid;
|
input mv_below8x8_curr;
|
input mv_below8x8_curr;
|
input [3:0] pos_FracL;
|
input [3:0] pos_FracL;
|
input [3:0] blk4x4_inter_calculate_counter;
|
input [3:0] blk4x4_inter_calculate_counter;
|
input [1:0] Inter_chroma2x2_counter;
|
input [1:0] Inter_chroma2x2_counter;
|
input [3:0] mb_num_h,mb_num_v;
|
input [3:0] mb_num_h,mb_num_v;
|
input LowerMB_IsSkip;
|
input LowerMB_IsSkip;
|
|
|
output end_of_one_blk4x4_sum;
|
output end_of_one_blk4x4_sum;
|
output [2:0] blk4x4_sum_counter;
|
output [2:0] blk4x4_sum_counter;
|
output [4:0] blk4x4_rec_counter;
|
output [4:0] blk4x4_rec_counter;
|
output [7:0] blk4x4_sum_PE0_out,blk4x4_sum_PE1_out,blk4x4_sum_PE2_out,blk4x4_sum_PE3_out;
|
output [7:0] blk4x4_sum_PE0_out,blk4x4_sum_PE1_out,blk4x4_sum_PE2_out,blk4x4_sum_PE3_out;
|
output [23:0] sum_right_column_reg;
|
output [23:0] sum_right_column_reg;
|
output [4:0] blk4x4_rec_counter_2_raster_order;
|
output [4:0] blk4x4_rec_counter_2_raster_order;
|
output [7:0] blk4x4_pred_output0, blk4x4_pred_output1, blk4x4_pred_output2;
|
output [7:0] blk4x4_pred_output0, blk4x4_pred_output1, blk4x4_pred_output2;
|
output [7:0] blk4x4_pred_output4, blk4x4_pred_output5, blk4x4_pred_output6;
|
output [7:0] blk4x4_pred_output4, blk4x4_pred_output5, blk4x4_pred_output6;
|
output [7:0] blk4x4_pred_output8, blk4x4_pred_output9, blk4x4_pred_output10;
|
output [7:0] blk4x4_pred_output8, blk4x4_pred_output9, blk4x4_pred_output10;
|
output [7:0] blk4x4_pred_output12,blk4x4_pred_output13,blk4x4_pred_output14;
|
output [7:0] blk4x4_pred_output12,blk4x4_pred_output13,blk4x4_pred_output14;
|
output Intra_mbAddrB_RAM_wr;
|
output Intra_mbAddrB_RAM_wr;
|
output [6:0] Intra_mbAddrB_RAM_wr_addr;
|
output [6:0] Intra_mbAddrB_RAM_wr_addr;
|
output [31:0] Intra_mbAddrB_RAM_din;
|
output [31:0] Intra_mbAddrB_RAM_din;
|
|
|
reg [2:0] blk4x4_sum_counter;
|
reg [2:0] blk4x4_sum_counter;
|
reg [4:0] blk4x4_rec_counter;
|
reg [4:0] blk4x4_rec_counter;
|
reg [4:0] blk4x4_rec_counter_2_raster_order;
|
reg [4:0] blk4x4_rec_counter_2_raster_order;
|
reg [23:0] sum_right_column_reg;
|
reg [23:0] sum_right_column_reg;
|
|
|
reg [7:0] blk4x4_pred_output0, blk4x4_pred_output1, blk4x4_pred_output2, blk4x4_pred_output3;
|
reg [7:0] blk4x4_pred_output0, blk4x4_pred_output1, blk4x4_pred_output2, blk4x4_pred_output3;
|
reg [7:0] blk4x4_pred_output4, blk4x4_pred_output5, blk4x4_pred_output6, blk4x4_pred_output7;
|
reg [7:0] blk4x4_pred_output4, blk4x4_pred_output5, blk4x4_pred_output6, blk4x4_pred_output7;
|
reg [7:0] blk4x4_pred_output8, blk4x4_pred_output9, blk4x4_pred_output10,blk4x4_pred_output11;
|
reg [7:0] blk4x4_pred_output8, blk4x4_pred_output9, blk4x4_pred_output10,blk4x4_pred_output11;
|
reg [7:0] blk4x4_pred_output12,blk4x4_pred_output13,blk4x4_pred_output14,blk4x4_pred_output15;
|
reg [7:0] blk4x4_pred_output12,blk4x4_pred_output13,blk4x4_pred_output14,blk4x4_pred_output15;
|
|
|
|
|
always @ (posedge gclk_pred_output or negedge reset_n)
|
always @ (posedge gclk_pred_output or negedge reset_n)
|
if (reset_n == 1'b0)
|
if (reset_n == 1'b0)
|
begin blk4x4_pred_output0 <= 0; blk4x4_pred_output1 <= 0; blk4x4_pred_output2 <= 0; blk4x4_pred_output3 <= 0;
|
begin blk4x4_pred_output0 <= 0; blk4x4_pred_output1 <= 0; blk4x4_pred_output2 <= 0; blk4x4_pred_output3 <= 0;
|
blk4x4_pred_output4 <= 0; blk4x4_pred_output5 <= 0; blk4x4_pred_output6 <= 0; blk4x4_pred_output7 <= 0;
|
blk4x4_pred_output4 <= 0; blk4x4_pred_output5 <= 0; blk4x4_pred_output6 <= 0; blk4x4_pred_output7 <= 0;
|
blk4x4_pred_output8 <= 0; blk4x4_pred_output9 <= 0; blk4x4_pred_output10 <= 0; blk4x4_pred_output11 <= 0;
|
blk4x4_pred_output8 <= 0; blk4x4_pred_output9 <= 0; blk4x4_pred_output10 <= 0; blk4x4_pred_output11 <= 0;
|
blk4x4_pred_output12 <= 0; blk4x4_pred_output13<= 0; blk4x4_pred_output14 <= 0; blk4x4_pred_output15 <= 0; end
|
blk4x4_pred_output12 <= 0; blk4x4_pred_output13<= 0; blk4x4_pred_output14 <= 0; blk4x4_pred_output15 <= 0; end
|
else if (blk4x4_intra_calculate_counter != 0)
|
else if (blk4x4_intra_calculate_counter != 0)
|
begin
|
begin
|
//Intra4x4DC or chromaDC intra prediction:output valid only at cycle3 by PE0
|
//Intra4x4DC or chromaDC intra prediction:output valid only at cycle3 by PE0
|
if ((mb_type_general[3:2] == 2'b11 && blk4x4_rec_counter < 16 && Intra4x4_predmode == `Intra4x4_DC) ||
|
if ((mb_type_general[3:2] == 2'b11 && blk4x4_rec_counter < 16 && Intra4x4_predmode == `Intra4x4_DC) ||
|
(mb_type_general[3] == 1'b1 && blk4x4_rec_counter > 15 && Intra_chroma_predmode == `Intra_chroma_DC))
|
(mb_type_general[3] == 1'b1 && blk4x4_rec_counter > 15 && Intra_chroma_predmode == `Intra_chroma_DC))
|
begin
|
begin
|
if (blk4x4_intra_calculate_counter == 3'd3) //Intra4x4DC or chromaDC completes calculation at cycle3 by PE0
|
if (blk4x4_intra_calculate_counter == 3'd3) //Intra4x4DC or chromaDC completes calculation at cycle3 by PE0
|
begin
|
begin
|
blk4x4_pred_output0 <= Intra_pred_PE0_out; blk4x4_pred_output1 <= Intra_pred_PE0_out;
|
blk4x4_pred_output0 <= Intra_pred_PE0_out; blk4x4_pred_output1 <= Intra_pred_PE0_out;
|
blk4x4_pred_output2 <= Intra_pred_PE0_out; blk4x4_pred_output3 <= Intra_pred_PE0_out;
|
blk4x4_pred_output2 <= Intra_pred_PE0_out; blk4x4_pred_output3 <= Intra_pred_PE0_out;
|
blk4x4_pred_output4 <= Intra_pred_PE0_out; blk4x4_pred_output5 <= Intra_pred_PE0_out;
|
blk4x4_pred_output4 <= Intra_pred_PE0_out; blk4x4_pred_output5 <= Intra_pred_PE0_out;
|
blk4x4_pred_output6 <= Intra_pred_PE0_out; blk4x4_pred_output7 <= Intra_pred_PE0_out;
|
blk4x4_pred_output6 <= Intra_pred_PE0_out; blk4x4_pred_output7 <= Intra_pred_PE0_out;
|
blk4x4_pred_output8 <= Intra_pred_PE0_out; blk4x4_pred_output9 <= Intra_pred_PE0_out;
|
blk4x4_pred_output8 <= Intra_pred_PE0_out; blk4x4_pred_output9 <= Intra_pred_PE0_out;
|
blk4x4_pred_output10 <= Intra_pred_PE0_out; blk4x4_pred_output11 <= Intra_pred_PE0_out;
|
blk4x4_pred_output10 <= Intra_pred_PE0_out; blk4x4_pred_output11 <= Intra_pred_PE0_out;
|
blk4x4_pred_output12 <= Intra_pred_PE0_out; blk4x4_pred_output13 <= Intra_pred_PE0_out;
|
blk4x4_pred_output12 <= Intra_pred_PE0_out; blk4x4_pred_output13 <= Intra_pred_PE0_out;
|
blk4x4_pred_output14 <= Intra_pred_PE0_out; blk4x4_pred_output15 <= Intra_pred_PE0_out;
|
blk4x4_pred_output14 <= Intra_pred_PE0_out; blk4x4_pred_output15 <= Intra_pred_PE0_out;
|
end
|
end
|
end
|
end
|
//Intra16x16DC intra prediction:output valid only at cycle1 by PE0
|
//Intra16x16DC intra prediction:output valid only at cycle1 by PE0
|
else if (mb_type_general[3:2] == 2'b10 && blk4x4_rec_counter < 16 && Intra16x16_predmode == `Intra16x16_DC)
|
else if (mb_type_general[3:2] == 2'b10 && blk4x4_rec_counter < 16 && Intra16x16_predmode == `Intra16x16_DC)
|
begin
|
begin
|
if (blk4x4_rec_counter == 0 && blk4x4_intra_calculate_counter == 3'd1)
|
if (blk4x4_rec_counter == 0 && blk4x4_intra_calculate_counter == 3'd1)
|
begin
|
begin
|
blk4x4_pred_output0 <= Intra_pred_PE0_out; blk4x4_pred_output1 <= Intra_pred_PE0_out;
|
blk4x4_pred_output0 <= Intra_pred_PE0_out; blk4x4_pred_output1 <= Intra_pred_PE0_out;
|
blk4x4_pred_output2 <= Intra_pred_PE0_out; blk4x4_pred_output3 <= Intra_pred_PE0_out;
|
blk4x4_pred_output2 <= Intra_pred_PE0_out; blk4x4_pred_output3 <= Intra_pred_PE0_out;
|
blk4x4_pred_output4 <= Intra_pred_PE0_out; blk4x4_pred_output5 <= Intra_pred_PE0_out;
|
blk4x4_pred_output4 <= Intra_pred_PE0_out; blk4x4_pred_output5 <= Intra_pred_PE0_out;
|
blk4x4_pred_output6 <= Intra_pred_PE0_out; blk4x4_pred_output7 <= Intra_pred_PE0_out;
|
blk4x4_pred_output6 <= Intra_pred_PE0_out; blk4x4_pred_output7 <= Intra_pred_PE0_out;
|
blk4x4_pred_output8 <= Intra_pred_PE0_out; blk4x4_pred_output9 <= Intra_pred_PE0_out;
|
blk4x4_pred_output8 <= Intra_pred_PE0_out; blk4x4_pred_output9 <= Intra_pred_PE0_out;
|
blk4x4_pred_output10 <= Intra_pred_PE0_out; blk4x4_pred_output11 <= Intra_pred_PE0_out;
|
blk4x4_pred_output10 <= Intra_pred_PE0_out; blk4x4_pred_output11 <= Intra_pred_PE0_out;
|
blk4x4_pred_output12 <= Intra_pred_PE0_out; blk4x4_pred_output13 <= Intra_pred_PE0_out;
|
blk4x4_pred_output12 <= Intra_pred_PE0_out; blk4x4_pred_output13 <= Intra_pred_PE0_out;
|
blk4x4_pred_output14 <= Intra_pred_PE0_out; blk4x4_pred_output15 <= Intra_pred_PE0_out;
|
blk4x4_pred_output14 <= Intra_pred_PE0_out; blk4x4_pred_output15 <= Intra_pred_PE0_out;
|
end
|
end
|
end
|
end
|
//Besides above DC intra prediction case,other intra prediction modes output valid from cycle4 ~ cycle1
|
//Besides above DC intra prediction case,other intra prediction modes output valid from cycle4 ~ cycle1
|
else
|
else
|
case (blk4x4_intra_calculate_counter)
|
case (blk4x4_intra_calculate_counter)
|
3'd4:begin blk4x4_pred_output0 <= Intra_pred_PE0_out; blk4x4_pred_output4 <= Intra_pred_PE1_out;
|
3'd4:begin blk4x4_pred_output0 <= Intra_pred_PE0_out; blk4x4_pred_output4 <= Intra_pred_PE1_out;
|
blk4x4_pred_output8 <= Intra_pred_PE2_out; blk4x4_pred_output12 <= Intra_pred_PE3_out; end
|
blk4x4_pred_output8 <= Intra_pred_PE2_out; blk4x4_pred_output12 <= Intra_pred_PE3_out; end
|
3'd3:begin blk4x4_pred_output1 <= Intra_pred_PE0_out; blk4x4_pred_output5 <= Intra_pred_PE1_out;
|
3'd3:begin blk4x4_pred_output1 <= Intra_pred_PE0_out; blk4x4_pred_output5 <= Intra_pred_PE1_out;
|
blk4x4_pred_output9 <= Intra_pred_PE2_out; blk4x4_pred_output13 <= Intra_pred_PE3_out; end
|
blk4x4_pred_output9 <= Intra_pred_PE2_out; blk4x4_pred_output13 <= Intra_pred_PE3_out; end
|
3'd2:begin blk4x4_pred_output2 <= Intra_pred_PE0_out; blk4x4_pred_output6 <= Intra_pred_PE1_out;
|
3'd2:begin blk4x4_pred_output2 <= Intra_pred_PE0_out; blk4x4_pred_output6 <= Intra_pred_PE1_out;
|
blk4x4_pred_output10 <= Intra_pred_PE2_out; blk4x4_pred_output14 <= Intra_pred_PE3_out; end
|
blk4x4_pred_output10 <= Intra_pred_PE2_out; blk4x4_pred_output14 <= Intra_pred_PE3_out; end
|
3'd1:begin blk4x4_pred_output3 <= Intra_pred_PE0_out; blk4x4_pred_output7 <= Intra_pred_PE1_out;
|
3'd1:begin blk4x4_pred_output3 <= Intra_pred_PE0_out; blk4x4_pred_output7 <= Intra_pred_PE1_out;
|
blk4x4_pred_output11 <= Intra_pred_PE2_out; blk4x4_pred_output15 <= Intra_pred_PE3_out; end
|
blk4x4_pred_output11 <= Intra_pred_PE2_out; blk4x4_pred_output15 <= Intra_pred_PE3_out; end
|
endcase
|
endcase
|
end
|
end
|
//Inter luma prediction output store
|
//Inter luma prediction output store
|
else if (Inter_blk4x4_pred_output_valid == 2'b01)
|
else if (Inter_blk4x4_pred_output_valid == 2'b01)
|
begin
|
begin
|
if (pos_FracL == `pos_i || pos_FracL == `pos_k)
|
if (pos_FracL == `pos_i || pos_FracL == `pos_k)
|
case (blk4x4_inter_calculate_counter)
|
case (blk4x4_inter_calculate_counter)
|
4'd7:begin blk4x4_pred_output0 <= Inter_pred_out0; blk4x4_pred_output4 <= Inter_pred_out1;
|
4'd7:begin blk4x4_pred_output0 <= Inter_pred_out0; blk4x4_pred_output4 <= Inter_pred_out1;
|
blk4x4_pred_output8 <= Inter_pred_out2; blk4x4_pred_output12 <= Inter_pred_out3; end
|
blk4x4_pred_output8 <= Inter_pred_out2; blk4x4_pred_output12 <= Inter_pred_out3; end
|
4'd5:begin blk4x4_pred_output1 <= Inter_pred_out0; blk4x4_pred_output5 <= Inter_pred_out1;
|
4'd5:begin blk4x4_pred_output1 <= Inter_pred_out0; blk4x4_pred_output5 <= Inter_pred_out1;
|
blk4x4_pred_output9 <= Inter_pred_out2; blk4x4_pred_output13 <= Inter_pred_out3; end
|
blk4x4_pred_output9 <= Inter_pred_out2; blk4x4_pred_output13 <= Inter_pred_out3; end
|
4'd3:begin blk4x4_pred_output2 <= Inter_pred_out0; blk4x4_pred_output6 <= Inter_pred_out1;
|
4'd3:begin blk4x4_pred_output2 <= Inter_pred_out0; blk4x4_pred_output6 <= Inter_pred_out1;
|
blk4x4_pred_output10 <= Inter_pred_out2; blk4x4_pred_output14 <= Inter_pred_out3; end
|
blk4x4_pred_output10 <= Inter_pred_out2; blk4x4_pred_output14 <= Inter_pred_out3; end
|
4'd1:begin blk4x4_pred_output3 <= Inter_pred_out0; blk4x4_pred_output7 <= Inter_pred_out1;
|
4'd1:begin blk4x4_pred_output3 <= Inter_pred_out0; blk4x4_pred_output7 <= Inter_pred_out1;
|
blk4x4_pred_output11 <= Inter_pred_out2; blk4x4_pred_output15 <= Inter_pred_out3; end
|
blk4x4_pred_output11 <= Inter_pred_out2; blk4x4_pred_output15 <= Inter_pred_out3; end
|
endcase
|
endcase
|
else
|
else
|
case (blk4x4_inter_calculate_counter)
|
case (blk4x4_inter_calculate_counter)
|
4'd4:begin blk4x4_pred_output0 <= Inter_pred_out0; blk4x4_pred_output4 <= Inter_pred_out1;
|
4'd4:begin blk4x4_pred_output0 <= Inter_pred_out0; blk4x4_pred_output4 <= Inter_pred_out1;
|
blk4x4_pred_output8 <= Inter_pred_out2; blk4x4_pred_output12 <= Inter_pred_out3; end
|
blk4x4_pred_output8 <= Inter_pred_out2; blk4x4_pred_output12 <= Inter_pred_out3; end
|
4'd3:begin blk4x4_pred_output1 <= Inter_pred_out0; blk4x4_pred_output5 <= Inter_pred_out1;
|
4'd3:begin blk4x4_pred_output1 <= Inter_pred_out0; blk4x4_pred_output5 <= Inter_pred_out1;
|
blk4x4_pred_output9 <= Inter_pred_out2; blk4x4_pred_output13 <= Inter_pred_out3; end
|
blk4x4_pred_output9 <= Inter_pred_out2; blk4x4_pred_output13 <= Inter_pred_out3; end
|
4'd2:begin blk4x4_pred_output2 <= Inter_pred_out0; blk4x4_pred_output6 <= Inter_pred_out1;
|
4'd2:begin blk4x4_pred_output2 <= Inter_pred_out0; blk4x4_pred_output6 <= Inter_pred_out1;
|
blk4x4_pred_output10 <= Inter_pred_out2; blk4x4_pred_output14 <= Inter_pred_out3; end
|
blk4x4_pred_output10 <= Inter_pred_out2; blk4x4_pred_output14 <= Inter_pred_out3; end
|
4'd1:begin blk4x4_pred_output3 <= Inter_pred_out0; blk4x4_pred_output7 <= Inter_pred_out1;
|
4'd1:begin blk4x4_pred_output3 <= Inter_pred_out0; blk4x4_pred_output7 <= Inter_pred_out1;
|
blk4x4_pred_output11 <= Inter_pred_out2; blk4x4_pred_output15 <= Inter_pred_out3; end
|
blk4x4_pred_output11 <= Inter_pred_out2; blk4x4_pred_output15 <= Inter_pred_out3; end
|
endcase
|
endcase
|
end
|
end
|
//Inter chroma prediction output store
|
//Inter chroma prediction output store
|
else if (Inter_blk4x4_pred_output_valid == 2'b10)
|
else if (Inter_blk4x4_pred_output_valid == 2'b10)
|
case (mv_below8x8_curr)
|
case (mv_below8x8_curr)
|
1'b1:
|
1'b1:
|
case (Inter_chroma2x2_counter)
|
case (Inter_chroma2x2_counter)
|
2'b11:
|
2'b11:
|
begin
|
begin
|
blk4x4_pred_output0 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out0:0;
|
blk4x4_pred_output0 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out0:0;
|
blk4x4_pred_output1 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out1:0;
|
blk4x4_pred_output1 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out1:0;
|
blk4x4_pred_output4 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out2:0;
|
blk4x4_pred_output4 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out2:0;
|
blk4x4_pred_output5 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out3:0;
|
blk4x4_pred_output5 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out3:0;
|
end
|
end
|
2'b10:
|
2'b10:
|
begin
|
begin
|
blk4x4_pred_output2 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out0:0;
|
blk4x4_pred_output2 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out0:0;
|
blk4x4_pred_output3 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out1:0;
|
blk4x4_pred_output3 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out1:0;
|
blk4x4_pred_output6 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out2:0;
|
blk4x4_pred_output6 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out2:0;
|
blk4x4_pred_output7 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out3:0;
|
blk4x4_pred_output7 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out3:0;
|
end
|
end
|
2'b01:
|
2'b01:
|
begin
|
begin
|
blk4x4_pred_output8 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out0:0;
|
blk4x4_pred_output8 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out0:0;
|
blk4x4_pred_output9 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out1:0;
|
blk4x4_pred_output9 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out1:0;
|
blk4x4_pred_output12 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out2:0;
|
blk4x4_pred_output12 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out2:0;
|
blk4x4_pred_output13 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out3:0;
|
blk4x4_pred_output13 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out3:0;
|
end
|
end
|
2'b00:
|
2'b00:
|
begin
|
begin
|
blk4x4_pred_output10 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out0:0;
|
blk4x4_pred_output10 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out0:0;
|
blk4x4_pred_output11 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out1:0;
|
blk4x4_pred_output11 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out1:0;
|
blk4x4_pred_output14 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out2:0;
|
blk4x4_pred_output14 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out2:0;
|
blk4x4_pred_output15 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out3:0;
|
blk4x4_pred_output15 <= (blk4x4_inter_calculate_counter != 0)? Inter_pred_out3:0;
|
end
|
end
|
endcase
|
endcase
|
1'b0:
|
1'b0:
|
case (blk4x4_inter_calculate_counter)
|
case (blk4x4_inter_calculate_counter)
|
4'd4:begin blk4x4_pred_output0 <= Inter_pred_out0; blk4x4_pred_output1 <= Inter_pred_out1;
|
4'd4:begin blk4x4_pred_output0 <= Inter_pred_out0; blk4x4_pred_output1 <= Inter_pred_out1;
|
blk4x4_pred_output4 <= Inter_pred_out2; blk4x4_pred_output5 <= Inter_pred_out3; end
|
blk4x4_pred_output4 <= Inter_pred_out2; blk4x4_pred_output5 <= Inter_pred_out3; end
|
4'd3:begin blk4x4_pred_output2 <= Inter_pred_out0; blk4x4_pred_output3 <= Inter_pred_out1;
|
4'd3:begin blk4x4_pred_output2 <= Inter_pred_out0; blk4x4_pred_output3 <= Inter_pred_out1;
|
blk4x4_pred_output6 <= Inter_pred_out2; blk4x4_pred_output7 <= Inter_pred_out3; end
|
blk4x4_pred_output6 <= Inter_pred_out2; blk4x4_pred_output7 <= Inter_pred_out3; end
|
4'd2:begin blk4x4_pred_output8 <= Inter_pred_out0; blk4x4_pred_output9 <= Inter_pred_out1;
|
4'd2:begin blk4x4_pred_output8 <= Inter_pred_out0; blk4x4_pred_output9 <= Inter_pred_out1;
|
blk4x4_pred_output12 <= Inter_pred_out2; blk4x4_pred_output13 <= Inter_pred_out3; end
|
blk4x4_pred_output12 <= Inter_pred_out2; blk4x4_pred_output13 <= Inter_pred_out3; end
|
4'd1:begin blk4x4_pred_output10 <= Inter_pred_out0; blk4x4_pred_output11 <= Inter_pred_out1;
|
4'd1:begin blk4x4_pred_output10 <= Inter_pred_out0; blk4x4_pred_output11 <= Inter_pred_out1;
|
blk4x4_pred_output14 <= Inter_pred_out2; blk4x4_pred_output15 <= Inter_pred_out3; end
|
blk4x4_pred_output14 <= Inter_pred_out2; blk4x4_pred_output15 <= Inter_pred_out3; end
|
endcase
|
endcase
|
endcase
|
endcase
|
|
|
//------------------------------------------------------
|
//------------------------------------------------------
|
//blk4x4_sum_counter
|
//blk4x4_sum_counter
|
//------------------------------------------------------
|
//------------------------------------------------------
|
always @ (posedge clk)
|
always @ (posedge clk)
|
if (reset_n == 1'b0)
|
if (reset_n == 1'b0)
|
blk4x4_sum_counter <= 3'd4;
|
blk4x4_sum_counter <= 3'd4;
|
else if (trigger_blk4x4_rec_sum == 1'b1)
|
else if (trigger_blk4x4_rec_sum == 1'b1)
|
blk4x4_sum_counter <= 3'd0;
|
blk4x4_sum_counter <= 3'd0;
|
else if (blk4x4_sum_counter != 3'd4)
|
else if (blk4x4_sum_counter != 3'd4)
|
blk4x4_sum_counter <= blk4x4_sum_counter + 1;
|
blk4x4_sum_counter <= blk4x4_sum_counter + 1;
|
|
|
assign end_of_one_blk4x4_sum = (blk4x4_sum_counter == 3'd3)? 1'b1:1'b0;
|
assign end_of_one_blk4x4_sum = (blk4x4_sum_counter == 3'd3)? 1'b1:1'b0;
|
//------------------------------------------------------
|
//------------------------------------------------------
|
//blk4x4_rec_counter
|
//blk4x4_rec_counter
|
//------------------------------------------------------
|
//------------------------------------------------------
|
always @ (posedge clk)
|
always @ (posedge clk)
|
if (reset_n == 1'b0)
|
if (reset_n == 1'b0)
|
blk4x4_rec_counter <= 0;
|
blk4x4_rec_counter <= 0;
|
else if (blk4x4_sum_counter == 3'd3)
|
else if (blk4x4_sum_counter == 3'd3)
|
blk4x4_rec_counter <= (blk4x4_rec_counter == 5'd23)? 5'd0:(blk4x4_rec_counter + 1);
|
blk4x4_rec_counter <= (blk4x4_rec_counter == 5'd23)? 5'd0:(blk4x4_rec_counter + 1);
|
//------------------------------------------------------
|
//------------------------------------------------------
|
//reconstruction sum
|
//reconstruction sum
|
//------------------------------------------------------
|
//------------------------------------------------------
|
|
|
//Note:since res_blk4x4_IsAllZero has a higer priority over res_blk4x4_OnlyDC,the conditions
|
//Note:since res_blk4x4_IsAllZero has a higer priority over res_blk4x4_OnlyDC,the conditions
|
//to assign res_blk4x4_OnlyDC is NOT complete (but when take current assigned res_blk4x4_IsAllZero
|
//to assign res_blk4x4_OnlyDC is NOT complete (but when take current assigned res_blk4x4_IsAllZero
|
//value into account, res_blk4x4_OnlyDC is correct!)
|
//value into account, res_blk4x4_OnlyDC is correct!)
|
|
|
//res_blk4x4_IsAllZero:curr_DC_IsZero? curr_CBPLuma_IsZero? TotalCoeff is zero? CBPChroma is zero or one?
|
//res_blk4x4_IsAllZero:curr_DC_IsZero? curr_CBPLuma_IsZero? TotalCoeff is zero? CBPChroma is zero or one?
|
|
|
reg res_blk4x4_IsAllZero;
|
reg res_blk4x4_IsAllZero;
|
reg res_blk4x4_onlyDC;
|
reg res_blk4x4_onlyDC;
|
always @ (slice_data_state or residual_state or curr_DC_IsZero or TotalCoeff
|
always @ (slice_data_state or residual_state or curr_DC_IsZero or TotalCoeff
|
or curr_DC_IsZero or curr_CBPLuma_IsZero or CodedBlockPatternChroma)
|
or curr_DC_IsZero or curr_CBPLuma_IsZero or CodedBlockPatternChroma)
|
if (slice_data_state == `skip_run_duration)
|
if (slice_data_state == `skip_run_duration)
|
begin
|
begin
|
res_blk4x4_IsAllZero <= 1'b1;
|
res_blk4x4_IsAllZero <= 1'b1;
|
res_blk4x4_onlyDC <= 1'b0;
|
res_blk4x4_onlyDC <= 1'b0;
|
end
|
end
|
else
|
else
|
case (residual_state)
|
case (residual_state)
|
`Intra16x16ACLevel_0_s:
|
`Intra16x16ACLevel_0_s:
|
begin
|
begin
|
res_blk4x4_IsAllZero <= (curr_DC_IsZero)? 1'b1:1'b0;
|
res_blk4x4_IsAllZero <= (curr_DC_IsZero)? 1'b1:1'b0;
|
res_blk4x4_onlyDC <= (curr_DC_IsZero)? 1'b0:1'b1;
|
res_blk4x4_onlyDC <= (curr_DC_IsZero)? 1'b0:1'b1;
|
end
|
end
|
`Intra16x16ACLevel_s,`ChromaACLevel_Cb_s,`ChromaACLevel_Cr_s:
|
`Intra16x16ACLevel_s,`ChromaACLevel_Cb_s,`ChromaACLevel_Cr_s:
|
begin
|
begin
|
res_blk4x4_IsAllZero <= (TotalCoeff == 0 && curr_DC_IsZero)? 1'b1:1'b0;
|
res_blk4x4_IsAllZero <= (TotalCoeff == 0 && curr_DC_IsZero)? 1'b1:1'b0;
|
res_blk4x4_onlyDC <= (TotalCoeff == 0)? 1'b1:1'b0;
|
res_blk4x4_onlyDC <= (TotalCoeff == 0)? 1'b1:1'b0;
|
end
|
end
|
`LumaLevel_0_s:
|
`LumaLevel_0_s:
|
begin
|
begin
|
res_blk4x4_IsAllZero <= 1'b1;
|
res_blk4x4_IsAllZero <= 1'b1;
|
res_blk4x4_onlyDC <= 1'b0;
|
res_blk4x4_onlyDC <= 1'b0;
|
end
|
end
|
`LumaLevel_s:
|
`LumaLevel_s:
|
begin
|
begin
|
res_blk4x4_IsAllZero <= (TotalCoeff == 0 || curr_CBPLuma_IsZero)? 1'b1:1'b0;
|
res_blk4x4_IsAllZero <= (TotalCoeff == 0 || curr_CBPLuma_IsZero)? 1'b1:1'b0;
|
res_blk4x4_onlyDC <= 1'b0;
|
res_blk4x4_onlyDC <= 1'b0;
|
end
|
end
|
`ChromaACLevel_0_s: //CodedBlockPatternChroma == 0 or 1
|
`ChromaACLevel_0_s: //CodedBlockPatternChroma == 0 or 1
|
if (CodedBlockPatternChroma == 0) //CodedBlockPatternChroma == 0
|
if (CodedBlockPatternChroma == 0) //CodedBlockPatternChroma == 0
|
begin
|
begin
|
res_blk4x4_IsAllZero <= 1'b1;
|
res_blk4x4_IsAllZero <= 1'b1;
|
res_blk4x4_onlyDC <= 1'b0;
|
res_blk4x4_onlyDC <= 1'b0;
|
end
|
end
|
else //CodedBlockPatternChroma == 1
|
else //CodedBlockPatternChroma == 1
|
begin
|
begin
|
res_blk4x4_IsAllZero <= (curr_DC_IsZero)? 1'b1:1'b0;
|
res_blk4x4_IsAllZero <= (curr_DC_IsZero)? 1'b1:1'b0;
|
res_blk4x4_onlyDC <= (curr_DC_IsZero)? 1'b0:1'b1;
|
res_blk4x4_onlyDC <= (curr_DC_IsZero)? 1'b0:1'b1;
|
end
|
end
|
default:
|
default:
|
begin
|
begin
|
res_blk4x4_IsAllZero <= 1'b0;
|
res_blk4x4_IsAllZero <= 1'b0;
|
res_blk4x4_onlyDC <= 1'b0;
|
res_blk4x4_onlyDC <= 1'b0;
|
end
|
end
|
endcase
|
endcase
|
|
|
reg [8:0] sum_PE0_a,sum_PE1_a,sum_PE2_a,sum_PE3_a;
|
reg [8:0] sum_PE0_a,sum_PE1_a,sum_PE2_a,sum_PE3_a;
|
reg [7:0] sum_PE0_b,sum_PE1_b,sum_PE2_b,sum_PE3_b;
|
reg [7:0] sum_PE0_b,sum_PE1_b,sum_PE2_b,sum_PE3_b;
|
wire sum_PE_bypass; //only one bypass signal for all sum_PE0 ~ sum_PE3
|
wire sum_PE_bypass; //only one bypass signal for all sum_PE0 ~ sum_PE3
|
assign sum_PE_bypass = (blk4x4_sum_counter != 3'd4 && !res_blk4x4_IsAllZero)? 1'b0:1'b1;
|
assign sum_PE_bypass = (blk4x4_sum_counter != 3'd4 && !res_blk4x4_IsAllZero)? 1'b0:1'b1;
|
|
|
sum_PE sum_PE0 (
|
sum_PE sum_PE0 (
|
.a(sum_PE0_a),
|
.a(sum_PE0_a),
|
.b(sum_PE0_b),
|
.b(sum_PE0_b),
|
.bypass(sum_PE_bypass),
|
.bypass(sum_PE_bypass),
|
.c(blk4x4_sum_PE0_out)
|
.c(blk4x4_sum_PE0_out)
|
);
|
);
|
sum_PE sum_PE1 (
|
sum_PE sum_PE1 (
|
.a(sum_PE1_a),
|
.a(sum_PE1_a),
|
.b(sum_PE1_b),
|
.b(sum_PE1_b),
|
.bypass(sum_PE_bypass),
|
.bypass(sum_PE_bypass),
|
.c(blk4x4_sum_PE1_out)
|
.c(blk4x4_sum_PE1_out)
|
);
|
);
|
sum_PE sum_PE2 (
|
sum_PE sum_PE2 (
|
.a(sum_PE2_a),
|
.a(sum_PE2_a),
|
.b(sum_PE2_b),
|
.b(sum_PE2_b),
|
.bypass(sum_PE_bypass),
|
.bypass(sum_PE_bypass),
|
.c(blk4x4_sum_PE2_out)
|
.c(blk4x4_sum_PE2_out)
|
);
|
);
|
sum_PE sum_PE3 (
|
sum_PE sum_PE3 (
|
.a(sum_PE3_a),
|
.a(sum_PE3_a),
|
.b(sum_PE3_b),
|
.b(sum_PE3_b),
|
.bypass(sum_PE_bypass),
|
.bypass(sum_PE_bypass),
|
.c(blk4x4_sum_PE3_out)
|
.c(blk4x4_sum_PE3_out)
|
);
|
);
|
|
|
// only for statistical purpose
|
// only for statistical purpose
|
// synopsys translate_off
|
// synopsys translate_off
|
integer number_of_IsAllZero;
|
integer number_of_IsAllZero;
|
integer number_of_onlyDC;
|
integer number_of_onlyDC;
|
initial
|
initial
|
begin
|
begin
|
number_of_IsAllZero = 0;
|
number_of_IsAllZero = 0;
|
number_of_onlyDC = 0;
|
number_of_onlyDC = 0;
|
end
|
end
|
always @ (blk4x4_sum_counter)
|
always @ (blk4x4_sum_counter)
|
if (blk4x4_sum_counter == 3'd2)
|
if (blk4x4_sum_counter == 3'd2)
|
begin
|
begin
|
if (res_blk4x4_IsAllZero == 1'b1) number_of_IsAllZero <= number_of_IsAllZero + 1;
|
if (res_blk4x4_IsAllZero == 1'b1) number_of_IsAllZero <= number_of_IsAllZero + 1;
|
else if (res_blk4x4_onlyDC == 1'b1) number_of_onlyDC <= number_of_onlyDC + 1;
|
else if (res_blk4x4_onlyDC == 1'b1) number_of_onlyDC <= number_of_onlyDC + 1;
|
end
|
end
|
// synopsys translate_on
|
// synopsys translate_on
|
|
|
always @ (blk4x4_sum_counter or res_blk4x4_IsAllZero or res_blk4x4_onlyDC or curr_DC_scaled or
|
always @ (blk4x4_sum_counter or res_blk4x4_IsAllZero or res_blk4x4_onlyDC or curr_DC_scaled or
|
IQIT_output_0 or IQIT_output_1 or IQIT_output_2 or IQIT_output_3 or
|
IQIT_output_0 or IQIT_output_1 or IQIT_output_2 or IQIT_output_3 or
|
IQIT_output_4 or IQIT_output_5 or IQIT_output_6 or IQIT_output_7 or
|
IQIT_output_4 or IQIT_output_5 or IQIT_output_6 or IQIT_output_7 or
|
IQIT_output_8 or IQIT_output_9 or IQIT_output_10 or IQIT_output_11 or
|
IQIT_output_8 or IQIT_output_9 or IQIT_output_10 or IQIT_output_11 or
|
IQIT_output_12 or IQIT_output_13 or IQIT_output_14 or IQIT_output_15)
|
IQIT_output_12 or IQIT_output_13 or IQIT_output_14 or IQIT_output_15)
|
if (res_blk4x4_IsAllZero)
|
if (res_blk4x4_IsAllZero)
|
begin sum_PE0_a <= 0; sum_PE1_a <= 0; sum_PE2_a <= 0; sum_PE3_a <= 0; end
|
begin sum_PE0_a <= 0; sum_PE1_a <= 0; sum_PE2_a <= 0; sum_PE3_a <= 0; end
|
else if (res_blk4x4_onlyDC)
|
else if (res_blk4x4_onlyDC)
|
begin sum_PE0_a <= curr_DC_scaled; sum_PE1_a <= curr_DC_scaled;
|
begin sum_PE0_a <= curr_DC_scaled; sum_PE1_a <= curr_DC_scaled;
|
sum_PE2_a <= curr_DC_scaled; sum_PE3_a <= curr_DC_scaled; end
|
sum_PE2_a <= curr_DC_scaled; sum_PE3_a <= curr_DC_scaled; end
|
else
|
else
|
case (blk4x4_sum_counter)
|
case (blk4x4_sum_counter)
|
0:begin sum_PE0_a <= IQIT_output_0; sum_PE1_a <= IQIT_output_1;
|
0:begin sum_PE0_a <= IQIT_output_0; sum_PE1_a <= IQIT_output_1;
|
sum_PE2_a <= IQIT_output_2; sum_PE3_a <= IQIT_output_3; end
|
sum_PE2_a <= IQIT_output_2; sum_PE3_a <= IQIT_output_3; end
|
1:begin sum_PE0_a <= IQIT_output_4; sum_PE1_a <= IQIT_output_5;
|
1:begin sum_PE0_a <= IQIT_output_4; sum_PE1_a <= IQIT_output_5;
|
sum_PE2_a <= IQIT_output_6; sum_PE3_a <= IQIT_output_7; end
|
sum_PE2_a <= IQIT_output_6; sum_PE3_a <= IQIT_output_7; end
|
2:begin sum_PE0_a <= IQIT_output_8; sum_PE1_a <= IQIT_output_9;
|
2:begin sum_PE0_a <= IQIT_output_8; sum_PE1_a <= IQIT_output_9;
|
sum_PE2_a <= IQIT_output_10;sum_PE3_a <= IQIT_output_11; end
|
sum_PE2_a <= IQIT_output_10;sum_PE3_a <= IQIT_output_11; end
|
3:begin sum_PE0_a <= IQIT_output_12;sum_PE1_a <= IQIT_output_13;
|
3:begin sum_PE0_a <= IQIT_output_12;sum_PE1_a <= IQIT_output_13;
|
sum_PE2_a <= IQIT_output_14;sum_PE3_a <= IQIT_output_15; end
|
sum_PE2_a <= IQIT_output_14;sum_PE3_a <= IQIT_output_15; end
|
default:begin sum_PE0_a <= 0; sum_PE1_a <= 0; sum_PE2_a <= 0; sum_PE3_a <= 0; end
|
default:begin sum_PE0_a <= 0; sum_PE1_a <= 0; sum_PE2_a <= 0; sum_PE3_a <= 0; end
|
endcase
|
endcase
|
always @ (blk4x4_sum_counter or
|
always @ (blk4x4_sum_counter or
|
blk4x4_pred_output0 or blk4x4_pred_output1 or blk4x4_pred_output2 or blk4x4_pred_output3 or
|
blk4x4_pred_output0 or blk4x4_pred_output1 or blk4x4_pred_output2 or blk4x4_pred_output3 or
|
blk4x4_pred_output4 or blk4x4_pred_output5 or blk4x4_pred_output6 or blk4x4_pred_output7 or
|
blk4x4_pred_output4 or blk4x4_pred_output5 or blk4x4_pred_output6 or blk4x4_pred_output7 or
|
blk4x4_pred_output8 or blk4x4_pred_output9 or blk4x4_pred_output10 or blk4x4_pred_output11 or
|
blk4x4_pred_output8 or blk4x4_pred_output9 or blk4x4_pred_output10 or blk4x4_pred_output11 or
|
blk4x4_pred_output12 or blk4x4_pred_output13 or blk4x4_pred_output14 or blk4x4_pred_output15)
|
blk4x4_pred_output12 or blk4x4_pred_output13 or blk4x4_pred_output14 or blk4x4_pred_output15)
|
case (blk4x4_sum_counter)
|
case (blk4x4_sum_counter)
|
0:begin sum_PE0_b <= blk4x4_pred_output0; sum_PE1_b <= blk4x4_pred_output1;
|
0:begin sum_PE0_b <= blk4x4_pred_output0; sum_PE1_b <= blk4x4_pred_output1;
|
sum_PE2_b <= blk4x4_pred_output2; sum_PE3_b <= blk4x4_pred_output3; end
|
sum_PE2_b <= blk4x4_pred_output2; sum_PE3_b <= blk4x4_pred_output3; end
|
1:begin sum_PE0_b <= blk4x4_pred_output4; sum_PE1_b <= blk4x4_pred_output5;
|
1:begin sum_PE0_b <= blk4x4_pred_output4; sum_PE1_b <= blk4x4_pred_output5;
|
sum_PE2_b <= blk4x4_pred_output6; sum_PE3_b <= blk4x4_pred_output7; end
|
sum_PE2_b <= blk4x4_pred_output6; sum_PE3_b <= blk4x4_pred_output7; end
|
2:begin sum_PE0_b <= blk4x4_pred_output8; sum_PE1_b <= blk4x4_pred_output9;
|
2:begin sum_PE0_b <= blk4x4_pred_output8; sum_PE1_b <= blk4x4_pred_output9;
|
sum_PE2_b <= blk4x4_pred_output10;sum_PE3_b <= blk4x4_pred_output11; end
|
sum_PE2_b <= blk4x4_pred_output10;sum_PE3_b <= blk4x4_pred_output11; end
|
3:begin sum_PE0_b <= blk4x4_pred_output12;sum_PE1_b <= blk4x4_pred_output13;
|
3:begin sum_PE0_b <= blk4x4_pred_output12;sum_PE1_b <= blk4x4_pred_output13;
|
sum_PE2_b <= blk4x4_pred_output14;sum_PE3_b <= blk4x4_pred_output15; end
|
sum_PE2_b <= blk4x4_pred_output14;sum_PE3_b <= blk4x4_pred_output15; end
|
default:begin sum_PE0_b <= 0; sum_PE1_b <= 0; sum_PE2_b <= 0; sum_PE3_b <= 0; end
|
default:begin sum_PE0_b <= 0; sum_PE1_b <= 0; sum_PE2_b <= 0; sum_PE3_b <= 0; end
|
endcase
|
endcase
|
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
//sum right most column latch for Intra mbAddrA
|
//sum right most column latch for Intra mbAddrA
|
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
//sum_right_column_reg:
|
//sum_right_column_reg:
|
always @ (posedge gclk_blk4x4_sum or negedge reset_n)
|
always @ (posedge gclk_blk4x4_sum or negedge reset_n)
|
if (reset_n == 0)
|
if (reset_n == 0)
|
sum_right_column_reg <= 0;
|
sum_right_column_reg <= 0;
|
else
|
else
|
case (blk4x4_sum_counter)
|
case (blk4x4_sum_counter)
|
3'd0:sum_right_column_reg[7:0] <= blk4x4_sum_PE3_out;
|
3'd0:sum_right_column_reg[7:0] <= blk4x4_sum_PE3_out;
|
3'd1:sum_right_column_reg[15:8] <= blk4x4_sum_PE3_out;
|
3'd1:sum_right_column_reg[15:8] <= blk4x4_sum_PE3_out;
|
3'd2:sum_right_column_reg[23:16] <= blk4x4_sum_PE3_out;
|
3'd2:sum_right_column_reg[23:16] <= blk4x4_sum_PE3_out;
|
endcase
|
endcase
|
|
|
//blk4x4_rec_counter_2_raster_order:
|
//blk4x4_rec_counter_2_raster_order:
|
//change from double-z order to raster order
|
//change from double-z order to raster order
|
always @ (blk4x4_rec_counter)
|
always @ (blk4x4_rec_counter)
|
case (blk4x4_rec_counter)
|
case (blk4x4_rec_counter)
|
5'd2 :blk4x4_rec_counter_2_raster_order <= 5'd4;
|
5'd2 :blk4x4_rec_counter_2_raster_order <= 5'd4;
|
5'd3 :blk4x4_rec_counter_2_raster_order <= 5'd5;
|
5'd3 :blk4x4_rec_counter_2_raster_order <= 5'd5;
|
5'd4 :blk4x4_rec_counter_2_raster_order <= 5'd2;
|
5'd4 :blk4x4_rec_counter_2_raster_order <= 5'd2;
|
5'd5 :blk4x4_rec_counter_2_raster_order <= 5'd3;
|
5'd5 :blk4x4_rec_counter_2_raster_order <= 5'd3;
|
5'd10:blk4x4_rec_counter_2_raster_order <= 5'd12;
|
5'd10:blk4x4_rec_counter_2_raster_order <= 5'd12;
|
5'd11:blk4x4_rec_counter_2_raster_order <= 5'd13;
|
5'd11:blk4x4_rec_counter_2_raster_order <= 5'd13;
|
5'd12:blk4x4_rec_counter_2_raster_order <= 5'd10;
|
5'd12:blk4x4_rec_counter_2_raster_order <= 5'd10;
|
5'd13:blk4x4_rec_counter_2_raster_order <= 5'd11;
|
5'd13:blk4x4_rec_counter_2_raster_order <= 5'd11;
|
default:blk4x4_rec_counter_2_raster_order <= blk4x4_rec_counter;
|
default:blk4x4_rec_counter_2_raster_order <= blk4x4_rec_counter;
|
endcase
|
endcase
|
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
//Intra_mbAddrB_RAM write control
|
//Intra_mbAddrB_RAM write control
|
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
wire Is_blk4x4_rec_bottom;
|
wire Is_blk4x4_rec_bottom;
|
assign Is_blk4x4_rec_bottom = (blk4x4_rec_counter == 5'd10 || blk4x4_rec_counter == 5'd11 ||
|
assign Is_blk4x4_rec_bottom = (blk4x4_rec_counter == 5'd10 || blk4x4_rec_counter == 5'd11 ||
|
blk4x4_rec_counter == 5'd14 || blk4x4_rec_counter == 5'd15 || blk4x4_rec_counter == 5'd18 ||
|
blk4x4_rec_counter == 5'd14 || blk4x4_rec_counter == 5'd15 || blk4x4_rec_counter == 5'd18 ||
|
blk4x4_rec_counter == 5'd19 || blk4x4_rec_counter == 5'd22 || blk4x4_rec_counter == 5'd23);
|
blk4x4_rec_counter == 5'd19 || blk4x4_rec_counter == 5'd22 || blk4x4_rec_counter == 5'd23);
|
|
|
assign Intra_mbAddrB_RAM_wr = (mb_num_v != 4'd8 && blk4x4_sum_counter == 3'd3 && Is_blk4x4_rec_bottom && !LowerMB_IsSkip);
|
assign Intra_mbAddrB_RAM_wr = (mb_num_v != 4'd8 && blk4x4_sum_counter == 3'd3 && Is_blk4x4_rec_bottom && !LowerMB_IsSkip);
|
assign Intra_mbAddrB_RAM_din = (Intra_mbAddrB_RAM_wr)? {blk4x4_sum_PE3_out,blk4x4_sum_PE2_out,blk4x4_sum_PE1_out,blk4x4_sum_PE0_out}:0;
|
assign Intra_mbAddrB_RAM_din = (Intra_mbAddrB_RAM_wr)? {blk4x4_sum_PE3_out,blk4x4_sum_PE2_out,blk4x4_sum_PE1_out,blk4x4_sum_PE0_out}:0;
|
|
|
// base pointer, [43:0] luma, [65:44] Chroma Cb, [87:66] Chroma Cr
|
// base pointer, [43:0] luma, [65:44] Chroma Cb, [87:66] Chroma Cr
|
reg [6:0] Intra_mbAddrB_RAM_addr_bp;
|
reg [6:0] Intra_mbAddrB_RAM_addr_bp;
|
always @ (Intra_mbAddrB_RAM_wr or blk4x4_rec_counter[4] or blk4x4_rec_counter[2])
|
always @ (Intra_mbAddrB_RAM_wr or blk4x4_rec_counter[4] or blk4x4_rec_counter[2])
|
if (Intra_mbAddrB_RAM_wr)
|
if (Intra_mbAddrB_RAM_wr)
|
begin
|
begin
|
if (blk4x4_rec_counter[4] == 1'b0) Intra_mbAddrB_RAM_addr_bp <= 0;
|
if (blk4x4_rec_counter[4] == 1'b0) Intra_mbAddrB_RAM_addr_bp <= 0;
|
else if (blk4x4_rec_counter[2] == 1'b0) Intra_mbAddrB_RAM_addr_bp <= 7'd44;
|
else if (blk4x4_rec_counter[2] == 1'b0) Intra_mbAddrB_RAM_addr_bp <= 7'd44;
|
else Intra_mbAddrB_RAM_addr_bp <= 7'd66;
|
else Intra_mbAddrB_RAM_addr_bp <= 7'd66;
|
end
|
end
|
else Intra_mbAddrB_RAM_addr_bp <= 0;
|
else Intra_mbAddrB_RAM_addr_bp <= 0;
|
|
|
// shift pointer,x2 for chroma,x4 for luma
|
// shift pointer,x2 for chroma,x4 for luma
|
wire [5:0] Intra_mbAddrB_RAM_addr_sp;
|
wire [5:0] Intra_mbAddrB_RAM_addr_sp;
|
assign Intra_mbAddrB_RAM_addr_sp = (Intra_mbAddrB_RAM_wr && blk4x4_rec_counter[4] == 1'b1)?
|
assign Intra_mbAddrB_RAM_addr_sp = (Intra_mbAddrB_RAM_wr && blk4x4_rec_counter[4] == 1'b1)?
|
{1'b0,mb_num_h,1'b0}:{mb_num_h,2'b0};
|
{1'b0,mb_num_h,1'b0}:{mb_num_h,2'b0};
|
// pointer for relative address of each 4x4 block inside a MB
|
// pointer for relative address of each 4x4 block inside a MB
|
reg [1:0] Intra_mbAddrB_RAM_addr_ip;
|
reg [1:0] Intra_mbAddrB_RAM_addr_ip;
|
always @ (Intra_mbAddrB_RAM_wr or blk4x4_rec_counter[4] or blk4x4_rec_counter[2:0])
|
always @ (Intra_mbAddrB_RAM_wr or blk4x4_rec_counter[4] or blk4x4_rec_counter[2:0])
|
if (Intra_mbAddrB_RAM_wr)
|
if (Intra_mbAddrB_RAM_wr)
|
begin
|
begin
|
if (blk4x4_rec_counter[4] == 1'b0)
|
if (blk4x4_rec_counter[4] == 1'b0)
|
case (blk4x4_rec_counter[2:0])
|
case (blk4x4_rec_counter[2:0])
|
3'b010:Intra_mbAddrB_RAM_addr_ip <= 2'd0;
|
3'b010:Intra_mbAddrB_RAM_addr_ip <= 2'd0;
|
3'b011:Intra_mbAddrB_RAM_addr_ip <= 2'd1;
|
3'b011:Intra_mbAddrB_RAM_addr_ip <= 2'd1;
|
3'b110:Intra_mbAddrB_RAM_addr_ip <= 2'd2;
|
3'b110:Intra_mbAddrB_RAM_addr_ip <= 2'd2;
|
3'b111:Intra_mbAddrB_RAM_addr_ip <= 2'd3;
|
3'b111:Intra_mbAddrB_RAM_addr_ip <= 2'd3;
|
default:Intra_mbAddrB_RAM_addr_ip <= 0;
|
default:Intra_mbAddrB_RAM_addr_ip <= 0;
|
endcase
|
endcase
|
else
|
else
|
Intra_mbAddrB_RAM_addr_ip <= {1'b0,blk4x4_rec_counter[0]};
|
Intra_mbAddrB_RAM_addr_ip <= {1'b0,blk4x4_rec_counter[0]};
|
end
|
end
|
else
|
else
|
Intra_mbAddrB_RAM_addr_ip <= 0;
|
Intra_mbAddrB_RAM_addr_ip <= 0;
|
|
|
assign Intra_mbAddrB_RAM_wr_addr = Intra_mbAddrB_RAM_addr_bp + Intra_mbAddrB_RAM_addr_sp + Intra_mbAddrB_RAM_addr_ip;
|
assign Intra_mbAddrB_RAM_wr_addr = Intra_mbAddrB_RAM_addr_bp + Intra_mbAddrB_RAM_addr_sp + Intra_mbAddrB_RAM_addr_ip;
|
|
|
/*
|
/*
|
// synopsys translate_off
|
// synopsys translate_off
|
integer tracefile;
|
integer tracefile;
|
initial
|
initial
|
begin
|
begin
|
tracefile = $fopen("nova_sum_output.log");
|
tracefile = $fopen("nova_sum_output.log");
|
end
|
end
|
|
|
wire [6:0] mb_num;
|
wire [6:0] mb_num;
|
assign mb_num = mb_num_v * 11 + mb_num_h;
|
assign mb_num = mb_num_v * 11 + mb_num_h;
|
|
|
wire [1:0] blk4x4_rec_counter_M4;
|
wire [1:0] blk4x4_rec_counter_M4;
|
assign blk4x4_rec_counter_M4 = blk4x4_rec_counter[1:0];
|
assign blk4x4_rec_counter_M4 = blk4x4_rec_counter[1:0];
|
|
|
reg [8:0] pic_num;
|
reg [8:0] pic_num;
|
always @ (reset_n or mb_num)
|
always @ (reset_n or mb_num)
|
if (reset_n == 1'b0)
|
if (reset_n == 1'b0)
|
pic_num <= 9'b111111111;
|
pic_num <= 9'b111111111;
|
else if (mb_num == 0)
|
else if (mb_num == 0)
|
pic_num <= pic_num + 1;
|
pic_num <= pic_num + 1;
|
|
|
always @ (posedge clk)
|
always @ (posedge clk)
|
if (blk4x4_sum_counter == 0)
|
if (blk4x4_sum_counter == 0)
|
begin
|
begin
|
$fdisplay (tracefile,"------------------------ Pic = %3d, MB = %3d -------------------------",pic_num,mb_num);
|
$fdisplay (tracefile,"------------------------ Pic = %3d, MB = %3d -------------------------",pic_num,mb_num);
|
if (blk4x4_rec_counter < 16)
|
if (blk4x4_rec_counter < 16)
|
$fdisplay (tracefile," [Luma] blk4x4Idx = %2d",blk4x4_rec_counter);
|
$fdisplay (tracefile," [Luma] blk4x4Idx = %2d",blk4x4_rec_counter);
|
else
|
else
|
$fdisplay (tracefile," [Chroma] blk4x4Idx = %2d",blk4x4_rec_counter_M4);
|
$fdisplay (tracefile," [Chroma] blk4x4Idx = %2d",blk4x4_rec_counter_M4);
|
$fdisplay (tracefile," Sum output: %8d %8d %8d %8d",blk4x4_sum_PE0_out,blk4x4_sum_PE1_out,blk4x4_sum_PE2_out,blk4x4_sum_PE3_out);
|
$fdisplay (tracefile," Sum output: %8d %8d %8d %8d",blk4x4_sum_PE0_out,blk4x4_sum_PE1_out,blk4x4_sum_PE2_out,blk4x4_sum_PE3_out);
|
end
|
end
|
else if (blk4x4_sum_counter != 3'd4)
|
else if (blk4x4_sum_counter != 3'd4)
|
$fdisplay (tracefile," %8d %8d %8d %8d",blk4x4_sum_PE0_out,blk4x4_sum_PE1_out,blk4x4_sum_PE2_out,blk4x4_sum_PE3_out);
|
$fdisplay (tracefile," %8d %8d %8d %8d",blk4x4_sum_PE0_out,blk4x4_sum_PE1_out,blk4x4_sum_PE2_out,blk4x4_sum_PE3_out);
|
// synopsys translate_on
|
// synopsys translate_on
|
*/
|
*/
|
|
|
endmodule
|
endmodule
|
|
|
module sum_PE (a,b,bypass,c);
|
module sum_PE (a,b,bypass,c);
|
input [8:0] a; //for residual from IQIT
|
input [8:0] a; //for residual from IQIT
|
input [7:0] b; //for prediction from intra or inter
|
input [7:0] b; //for prediction from intra or inter
|
input bypass;
|
input bypass;
|
output [7:0] c;
|
output [7:0] c;
|
|
|
wire [9:0] sum;
|
wire [9:0] sum;
|
|
|
assign sum = (bypass)? 0:({2'b0,b} + {a[8],a});
|
assign sum = (bypass)? 0:({2'b0,b} + {a[8],a});
|
assign c = (bypass)? b:((sum[9] == 1'b1)? 0:((sum[8] == 1'b1)? 8'd255:sum[7:0]));
|
assign c = (bypass)? b:((sum[9] == 1'b1)? 0:((sum[8] == 1'b1)? 8'd255:sum[7:0]));
|
endmodule
|
endmodule
|
|
|