⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intra_pred_pipeline.v

📁 a H.264/AVC Baseline Decoder
💻 V
📖 第 1 页 / 共 3 页
字号:
//--------------------------------------------------------------------------------------------------// Design    : nova// Author(s) : Ke Xu// Email	   : eexuke@yahoo.com// File      : Intra_pred_pipeline.v// Generated : Aug 4, 2005// Copyright (C) 2008 Ke Xu                //-------------------------------------------------------------------------------------------------// Description // Intra16x16,Intra4x4 prediction pipeline//-------------------------------------------------------------------------------------------------// synopsys translate_off`include "timescale.v"// synopsys translate_on`include "nova_defines.v"module Intra_pred_pipeline (clk,reset_n,mb_type_general,blk4x4_rec_counter,	trigger_blk4x4_intra_pred,mb_num_v,mb_num_h,blk4x4_sum_counter,NextMB_IsSkip,	Intra16x16_predmode,Intra4x4_predmode_CurrMb,Intra_chroma_predmode,		Intra_mbAddrA_reg0, Intra_mbAddrA_reg1, Intra_mbAddrA_reg2, Intra_mbAddrA_reg3,	Intra_mbAddrA_reg4, Intra_mbAddrA_reg5, Intra_mbAddrA_reg6, Intra_mbAddrA_reg7,	Intra_mbAddrA_reg8, Intra_mbAddrA_reg9, Intra_mbAddrA_reg10,Intra_mbAddrA_reg11,	Intra_mbAddrA_reg12,Intra_mbAddrA_reg13,Intra_mbAddrA_reg14,Intra_mbAddrA_reg15,		Intra_mbAddrB_reg0, Intra_mbAddrB_reg1, Intra_mbAddrB_reg2, Intra_mbAddrB_reg3,	Intra_mbAddrB_reg4, Intra_mbAddrB_reg5, Intra_mbAddrB_reg6, Intra_mbAddrB_reg7,	Intra_mbAddrB_reg8, Intra_mbAddrB_reg9, Intra_mbAddrB_reg10,Intra_mbAddrB_reg11,	Intra_mbAddrB_reg12,Intra_mbAddrB_reg13,Intra_mbAddrB_reg14,Intra_mbAddrB_reg15,	Intra_mbAddrD_window,			Intra4x4_predmode,blk4x4_intra_preload_counter,blk4x4_intra_precompute_counter,	blk4x4_intra_calculate_counter,end_of_one_blk4x4_intra,	blkAddrA_availability,blkAddrB_availability,mbAddrA_availability,mbAddrB_availability,mbAddrC_availability,	main_seed,plane_b_reg,plane_c_reg,	Intra_mbAddrB_RAM_rd,Intra_mbAddrB_RAM_rd_addr	);	input clk,reset_n;	input [3:0] mb_type_general;	input [4:0] blk4x4_rec_counter;	input trigger_blk4x4_intra_pred;	input [3:0] mb_num_v,mb_num_h;	input [2:0] blk4x4_sum_counter;	input NextMB_IsSkip;	input [1:0] Intra16x16_predmode;	input [63:0] Intra4x4_predmode_CurrMb;	input [1:0] Intra_chroma_predmode;		input [7:0] Intra_mbAddrA_reg0, Intra_mbAddrA_reg1, Intra_mbAddrA_reg2, Intra_mbAddrA_reg3;	input [7:0] Intra_mbAddrA_reg4, Intra_mbAddrA_reg5, Intra_mbAddrA_reg6, Intra_mbAddrA_reg7;	input [7:0] Intra_mbAddrA_reg8, Intra_mbAddrA_reg9, Intra_mbAddrA_reg10,Intra_mbAddrA_reg11;	input [7:0] Intra_mbAddrA_reg12,Intra_mbAddrA_reg13,Intra_mbAddrA_reg14,Intra_mbAddrA_reg15;		input [7:0] Intra_mbAddrB_reg0, Intra_mbAddrB_reg1, Intra_mbAddrB_reg2, Intra_mbAddrB_reg3;	input [7:0] Intra_mbAddrB_reg4, Intra_mbAddrB_reg5, Intra_mbAddrB_reg6, Intra_mbAddrB_reg7;	input [7:0] Intra_mbAddrB_reg8, Intra_mbAddrB_reg9, Intra_mbAddrB_reg10,Intra_mbAddrB_reg11;	input [7:0] Intra_mbAddrB_reg12,Intra_mbAddrB_reg13,Intra_mbAddrB_reg14,Intra_mbAddrB_reg15;	input [7:0] Intra_mbAddrD_window;		output [3:0] Intra4x4_predmode;	output [2:0] blk4x4_intra_preload_counter;	output [3:0] blk4x4_intra_precompute_counter;	output [2:0] blk4x4_intra_calculate_counter;	output end_of_one_blk4x4_intra;	output blkAddrA_availability,blkAddrB_availability;	output mbAddrA_availability,mbAddrB_availability,mbAddrC_availability;	output [15:0] main_seed;	output [11:0] plane_b_reg,plane_c_reg;	output Intra_mbAddrB_RAM_rd;	output [6:0] Intra_mbAddrB_RAM_rd_addr;		reg [3:0] Intra4x4_predmode;	reg [2:0] blk4x4_intra_preload_counter;	reg [3:0] blk4x4_intra_precompute_counter;	reg [2:0] blk4x4_intra_calculate_counter;		reg [11:0] plane_b_reg,plane_c_reg;	wire Intra_mbAddrB_RAM_rd;	wire [6:0] Intra_mbAddrB_RAM_rd_addr;	wire end_of_one_blk4x4_intra;	wire blkAddrA_availability,blkAddrB_availability;	wire mbAddrA_availability,mbAddrB_availability;		//----------------------------------------------------------------------------------------	//Intra4x4 prediction mode for current 4x4 block	//----------------------------------------------------------------------------------------	always @ (Intra4x4_predmode_CurrMb or blk4x4_rec_counter or mb_type_general)		if (mb_type_general == `MB_Intra4x4)			case (blk4x4_rec_counter)				0 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[3:0]; 				1 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[7:4];				2 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[11:8];				3 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[15:12];				4 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[19:16];				5 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[23:20];				6 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[27:24];				7 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[31:28];				8 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[35:32];				9 :Intra4x4_predmode <= Intra4x4_predmode_CurrMb[39:36];				10:Intra4x4_predmode <= Intra4x4_predmode_CurrMb[43:40];				11:Intra4x4_predmode <= Intra4x4_predmode_CurrMb[47:44];				12:Intra4x4_predmode <= Intra4x4_predmode_CurrMb[51:48];				13:Intra4x4_predmode <= Intra4x4_predmode_CurrMb[55:52];				14:Intra4x4_predmode <= Intra4x4_predmode_CurrMb[59:56];				15:Intra4x4_predmode <= Intra4x4_predmode_CurrMb[63:60];				default:Intra4x4_predmode <= 4'b1111;				endcase		else			Intra4x4_predmode <= 4'b1111;		//availability for intra4x4 predmode = Intra4x4_DC only	assign blkAddrA_availability = (mb_type_general == `MB_Intra4x4 && Intra4x4_predmode == `Intra4x4_DC && 	blk4x4_rec_counter < 16 && ((blk4x4_rec_counter == 0 || blk4x4_rec_counter == 2 || blk4x4_rec_counter == 8 ||	blk4x4_rec_counter == 10) && mb_num_h == 0))? 1'b0:1'b1;		assign blkAddrB_availability = (mb_type_general == `MB_Intra4x4 && Intra4x4_predmode == `Intra4x4_DC && 	blk4x4_rec_counter < 16 && ((blk4x4_rec_counter == 0 || blk4x4_rec_counter == 1 || blk4x4_rec_counter == 4 || 	blk4x4_rec_counter == 5) && mb_num_v == 0))? 1'b0:1'b1; 		//availability for whole intra predicted MB (both intra16x16 & intra4x4)	//assign mbAddrA_availability = (mb_type_general[3] && mb_num_h != 0)? 1'b1:1'b0;	//assign mbAddrB_availability = (mb_type_general[3] && mb_num_v != 0)? 1'b1:1'b0;	assign mbAddrA_availability = (mb_type_general[3] && mb_num_h != 0)? 1'b1:1'b0;	assign mbAddrB_availability = (mb_type_general[3] && mb_num_v != 0)? 1'b1:1'b0;	assign mbAddrC_availability = (mb_type_general[3] && mb_num_v != 0 && mb_num_h != 10)? 1'b1:1'b0;		//----------------------------------------------------------------------------------------	//Intra prediction step control counter	//---------------------------------------------------------------------------------------- 	//1.Preload upper pels counter	always @ (posedge clk)		if (reset_n == 1'b0)			blk4x4_intra_preload_counter <= 0;		else if (trigger_blk4x4_intra_pred)			begin				//Chroma				if (mb_type_general[3] == 1'b1 && (blk4x4_rec_counter == 16 || blk4x4_rec_counter == 20))					case (Intra_chroma_predmode)						`Intra_chroma_DC			  :blk4x4_intra_preload_counter <= (mbAddrB_availability)? 3'b011:3'b000;						`Intra_chroma_Horizontal:blk4x4_intra_preload_counter <= 3'b000;							`Intra_chroma_Vertical  :blk4x4_intra_preload_counter <= 3'b011;							`Intra_chroma_Plane     :blk4x4_intra_preload_counter <= 3'b011;						endcase				//Luma				//	Intra16x16				else if (mb_type_general[3:2] == 2'b10 && blk4x4_rec_counter == 0)					case (Intra16x16_predmode)						`Intra16x16_Vertical  :blk4x4_intra_preload_counter <= 3'b101;						`Intra16x16_Horizontal:blk4x4_intra_preload_counter <= 3'b000;							`Intra16x16_DC        :blk4x4_intra_preload_counter <= (mbAddrB_availability)? 3'b101:3'b000;						`Intra16x16_Plane     :blk4x4_intra_preload_counter <= 3'b101;						endcase				//	Intra4x4				else if (mb_type_general[3:2] == 2'b11 && (blk4x4_rec_counter == 0 || blk4x4_rec_counter == 1					|| blk4x4_rec_counter == 4 || blk4x4_rec_counter == 5))						case (Intra4x4_predmode)						`Intra4x4_Vertical           :blk4x4_intra_preload_counter <= 3'b010;								`Intra4x4_Horizontal         :blk4x4_intra_preload_counter <= 3'b000;								`Intra4x4_DC                 :blk4x4_intra_preload_counter <= (mbAddrB_availability)? 3'b010:3'b000;						`Intra4x4_Diagonal_Down_Left :blk4x4_intra_preload_counter <= 3'b011;	//need mbAddrC									`Intra4x4_Diagonal_Down_Right:blk4x4_intra_preload_counter <= (blk4x4_rec_counter == 0)? 3'b010:3'b011;//need mbAddrD							`Intra4x4_Vertical_Right     :blk4x4_intra_preload_counter <= (blk4x4_rec_counter == 0)? 3'b010:3'b011;//need mbAddrD							`Intra4x4_Horizontal_Down    :blk4x4_intra_preload_counter <= (blk4x4_rec_counter == 0)? 3'b010:3'b011;//need mbAddrD							`Intra4x4_Vertical_Left      :blk4x4_intra_preload_counter <= 3'b011;	//need mbAddrC							`Intra4x4_Horizontal_Up      :blk4x4_intra_preload_counter <= 3'b000;							endcase			end		else if (blk4x4_intra_preload_counter != 0)			blk4x4_intra_preload_counter <= blk4x4_intra_preload_counter - 1;			//2.Precomputation for plane mode counter	always @ (posedge clk)		if (reset_n == 1'b0)			blk4x4_intra_precompute_counter <= 0;		//Intra16x16 plane mode: 10 cycle + 1 cycle (seed)		else if (mb_type_general[2] == 1'b0 && blk4x4_rec_counter == 0 && Intra16x16_predmode == `Intra16x16_Plane && blk4x4_intra_preload_counter == 3'b001)			blk4x4_intra_precompute_counter <= 4'b1011;		//Chroma8x8 plane mode: 6 cycle + 1 cycle (seed)		else if ((blk4x4_rec_counter == 16 || blk4x4_rec_counter == 20) && Intra_chroma_predmode == `Intra_chroma_Plane && blk4x4_intra_preload_counter == 3'b001)			blk4x4_intra_precompute_counter <= 4'b0111;		else if (blk4x4_intra_precompute_counter != 0)			blk4x4_intra_precompute_counter <= blk4x4_intra_precompute_counter - 1;		//3.Intra prediction calculation counter	always @ (posedge clk)		if (reset_n == 1'b0)			blk4x4_intra_calculate_counter <= 0;		//Intra16x16 Luma		else if (mb_type_general[3:2] == 2'b10 && blk4x4_rec_counter < 16)			begin				if (blk4x4_rec_counter == 0)					case (Intra16x16_predmode)						`Intra16x16_Vertical:							if (blk4x4_intra_preload_counter == 3'b001)							blk4x4_intra_calculate_counter <= 3'b100;						else if (blk4x4_intra_calculate_counter != 0)							blk4x4_intra_calculate_counter <= blk4x4_intra_calculate_counter - 1;						`Intra16x16_Horizontal:							if (trigger_blk4x4_intra_pred)							blk4x4_intra_calculate_counter <= 3'b100;						else if (blk4x4_intra_calculate_counter != 0)							blk4x4_intra_calculate_counter <= blk4x4_intra_calculate_counter - 1;							`Intra16x16_DC:						if (mbAddrB_availability && blk4x4_intra_preload_counter == 3'b001)							blk4x4_intra_calculate_counter <= 3'b100;						else if (!mbAddrB_availability && trigger_blk4x4_intra_pred)							blk4x4_intra_calculate_counter <= 3'b100;						else if (blk4x4_intra_calculate_counter != 0)							blk4x4_intra_calculate_counter <= blk4x4_intra_calculate_counter - 1;						`Intra16x16_Plane:						if (blk4x4_intra_precompute_counter == 4'b0001)							blk4x4_intra_calculate_counter <= 3'b100;						else if (blk4x4_intra_calculate_counter != 0)							blk4x4_intra_calculate_counter <= blk4x4_intra_calculate_counter - 1;					endcase				else					begin						if (trigger_blk4x4_intra_pred)							blk4x4_intra_calculate_counter <= 3'b100;						else if (blk4x4_intra_calculate_counter != 0)							blk4x4_intra_calculate_counter <= blk4x4_intra_calculate_counter - 1;					end			end		//Intra4x4 Luma		else if (mb_type_general[3:2] == 2'b11 && blk4x4_rec_counter < 16)			begin				if (blk4x4_rec_counter == 0 || blk4x4_rec_counter == 1 || 					blk4x4_rec_counter == 4 || blk4x4_rec_counter == 5)					case (Intra4x4_predmode)						`Intra4x4_Horizontal,`Intra4x4_Horizontal_Up://Intra4x4 prediction modes do NOT need preload						if (trigger_blk4x4_intra_pred)							blk4x4_intra_calculate_counter <= 3'b100;						else if (blk4x4_intra_calculate_counter != 0)							blk4x4_intra_calculate_counter <= blk4x4_intra_calculate_counter - 1;						`Intra4x4_DC:	//Intra4x4 prediction modes may or may NOT need preload						if (mbAddrB_availability == 1'b1)	//need reload							begin								if (blk4x4_intra_preload_counter == 3'b001)									blk4x4_intra_calculate_counter <= 3'b100;								else if (blk4x4_intra_calculate_counter != 0)									blk4x4_intra_calculate_counter <= blk4x4_intra_calculate_counter - 1;							end						else								//do not need reload							begin								if (trigger_blk4x4_intra_pred)									blk4x4_intra_calculate_counter <= 3'b100;								else if (blk4x4_intra_calculate_counter != 0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -