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

📄 df_pipeline.v

📁 a H.264/AVC Baseline Decoder
💻 V
📖 第 1 页 / 共 3 页
字号:
	assign delta_p1i_tmp = (need_p1i)? (p2_PRE + p0_q0_sum[8:1] + neg_p1_shift):0;	assign delta_q1i_tmp = (need_q1i)? (q2_PRE + p0_q0_sum[8:1] + neg_q1_shift):0;	assign delta_p1i = delta_p1i_tmp[9:1];	assign delta_q1i = delta_q1i_tmp[9:1];		wire [8:0] clip_to_c_0_delta,clip_to_c_p1_delta,clip_to_c_q1_delta;	wire [4:0] clip_to_c_0_c,clip_to_c_p1_c,clip_to_c_q1_c;	wire [5:0] clip_to_c_0_out,clip_to_c_p1_out,clip_to_c_q1_out;	clip_to_c clip_to_c_0 (.delta(clip_to_c_0_delta),.c(clip_to_c_0_c),.out(clip_to_c_0_out));	clip_to_c clip_to_c_p1 (.delta(clip_to_c_p1_delta),.c(clip_to_c_p1_c),.out(clip_to_c_p1_out));	clip_to_c clip_to_c_q1 (.delta(clip_to_c_q1_delta),.c(clip_to_c_q1_c),.out(clip_to_c_q1_out)); 		assign clip_to_c_0_delta  = (bs_curr_PRE != 0 && bs_curr_PRE != 3'd4)? delta_0i:0;	assign clip_to_c_0_c      = (bs_curr_PRE != 0 && bs_curr_PRE != 3'd4)? c0:0;	assign clip_to_c_p1_delta = (bs_curr_PRE != 0 && bs_curr_PRE != 3'd4 && p2_m_p0_less_beta)? delta_p1i:0;	assign clip_to_c_p1_c 	  = (bs_curr_PRE != 0 && bs_curr_PRE != 3'd4 && p2_m_p0_less_beta)? c1:0;	assign clip_to_c_q1_delta = (bs_curr_PRE != 0 && bs_curr_PRE != 3'd4 && q2_m_q0_less_beta)? delta_q1i:0;	assign clip_to_c_q1_c 	  = (bs_curr_PRE != 0 && bs_curr_PRE != 3'd4 && q2_m_q0_less_beta)? c1:0; 						//	Pipelined parameters	reg [5:0] delta_0,delta_p1,delta_q1;	always @ (posedge gclk_DF or negedge reset_n)		if (reset_n == 1'b0)			begin delta_0 <= 0;	delta_p1 <= 0;	delta_q1 <= 0;	end				else if (bs_curr_PRE != 0 && bs_curr_PRE != 3'd4)			begin				delta_0  <= clip_to_c_0_out;				delta_p1 <= (p2_m_p0_less_beta)? clip_to_c_p1_out:0;				delta_q1 <= (q2_m_q0_less_beta)? clip_to_c_q1_out:0;			end		reg p2_m_p0_less_beta_FIR,q2_m_q0_less_beta_FIR,p0_m_q0_less_alpha_shift_FIR;	reg lumaEdgeFlag_FIR,chromaEdgeFlag_FIR;	reg [2:0] bs_curr_FIR;	reg [5:0] DF_edge_counter_FIR;	reg [1:0] one_edge_counter_FIR;	reg [7:0] p0_FIR,p1_FIR,p2_FIR,p3_FIR;	reg [7:0] q0_FIR,q1_FIR,q2_FIR,q3_FIR;	always @ (posedge gclk_DF or negedge reset_n)		if (reset_n == 1'b0)			begin				p2_m_p0_less_beta_FIR <= 0;	q2_m_q0_less_beta_FIR <= 0;					p0_m_q0_less_alpha_shift_FIR <= 0;				bs_curr_FIR		<= 0;				lumaEdgeFlag_FIR <= 0;			chromaEdgeFlag_FIR <= 0;				DF_edge_counter_FIR <= 6'd48;	one_edge_counter_FIR <= 2'd3;				p0_FIR <= 0;	p1_FIR <= 0;	p2_FIR <= 0;	p3_FIR <= 0;					q0_FIR <= 0;	q1_FIR <= 0;	q2_FIR <= 0;	q3_FIR <= 0;			end		else  			begin				p2_m_p0_less_beta_FIR <= p2_m_p0_less_beta;					q2_m_q0_less_beta_FIR <= q2_m_q0_less_beta;					p0_m_q0_less_alpha_shift_FIR <= p0_m_q0_less_alpha_shift;				bs_curr_FIR 	<= bs_curr_PRE;				lumaEdgeFlag_FIR <= lumaEdgeFlag_PRE;		chromaEdgeFlag_FIR <= chromaEdgeFlag_PRE;				DF_edge_counter_FIR <= DF_edge_counter_PRE; one_edge_counter_FIR <= one_edge_counter_PRE;				p0_FIR <= p0_PRE;	p1_FIR <= p1_PRE;	p2_FIR <= p2_PRE;	p3_FIR <= p3_PRE;				q0_FIR <= q0_PRE;	q1_FIR <= q1_PRE;	q2_FIR <= q2_PRE;	q3_FIR <= q3_PRE;			end	//---------------------------------------------------------------------	//4.FIR: filtering	//---------------------------------------------------------------------	reg [7:0] bs4_strong_FIR_p0,bs4_strong_FIR_p1,bs4_strong_FIR_p2,bs4_strong_FIR_p3;	reg [7:0] bs4_strong_FIR_q0,bs4_strong_FIR_q1,bs4_strong_FIR_q2,bs4_strong_FIR_q3;	wire [7:0] bs4_strong_FIR_p0_out,bs4_strong_FIR_p1_out,bs4_strong_FIR_p2_out;	wire [7:0] bs4_strong_FIR_q0_out,bs4_strong_FIR_q1_out,bs4_strong_FIR_q2_out;	bs4_strong_FIR bs4_strong_FIR (		.p0(bs4_strong_FIR_p0),.p1(bs4_strong_FIR_p1),.p2(bs4_strong_FIR_p2),.p3(bs4_strong_FIR_p3),		.q0(bs4_strong_FIR_q0),.q1(bs4_strong_FIR_q1),.q2(bs4_strong_FIR_q2),.q3(bs4_strong_FIR_q3),		.p0_out(bs4_strong_FIR_p0_out),.p1_out(bs4_strong_FIR_p1_out),.p2_out(bs4_strong_FIR_p2_out),		.q0_out(bs4_strong_FIR_q0_out),.q1_out(bs4_strong_FIR_q1_out),.q2_out(bs4_strong_FIR_q2_out)		);	reg [7:0] bs4_weak_FIR0_a,bs4_weak_FIR0_b,bs4_weak_FIR0_c;	reg [7:0] bs4_weak_FIR1_a,bs4_weak_FIR1_b,bs4_weak_FIR1_c; 	wire [7:0] bs4_weak_FIR0_out,bs4_weak_FIR1_out;	bs4_weak_FIR bs4_weak_FIR0 (.a(bs4_weak_FIR0_a),.b(bs4_weak_FIR0_b),.c(bs4_weak_FIR0_c),.out(bs4_weak_FIR0_out));	bs4_weak_FIR bs4_weak_FIR1 (.a(bs4_weak_FIR1_a),.b(bs4_weak_FIR1_b),.c(bs4_weak_FIR1_c),.out(bs4_weak_FIR1_out));	// bs = 4	always @ (bs_curr_FIR or lumaEdgeFlag_FIR or p0_m_q0_less_alpha_shift_FIR 		or p2_m_p0_less_beta_FIR or q2_m_q0_less_beta_FIR		or p0_FIR or p1_FIR or p2_FIR or p3_FIR or q0_FIR or q1_FIR or q2_FIR or q3_FIR)			if (bs_curr_FIR == 3'd4 && lumaEdgeFlag_FIR == 1'b1 && p0_m_q0_less_alpha_shift_FIR			&& (p2_m_p0_less_beta_FIR || q2_m_q0_less_beta_FIR))			begin				bs4_strong_FIR_p0 <= p0_FIR;	bs4_strong_FIR_p1 <= p1_FIR;				bs4_strong_FIR_p2 <= p2_FIR;	bs4_strong_FIR_p3 <= p3_FIR;				bs4_strong_FIR_q0 <= q0_FIR;	bs4_strong_FIR_q1 <= q1_FIR;					bs4_strong_FIR_q2 <= q2_FIR;	bs4_strong_FIR_q3 <= q3_FIR;			end		else			begin				bs4_strong_FIR_p0 <= 0;	bs4_strong_FIR_p1 <= 0;	bs4_strong_FIR_p2 <= 0; bs4_strong_FIR_p3 <= 0;				bs4_strong_FIR_q0 <= 0;	bs4_strong_FIR_q1 <= 0;	bs4_strong_FIR_q2 <= 0;	bs4_strong_FIR_q3 <= 0;			end	always @ (bs_curr_FIR or lumaEdgeFlag_FIR or chromaEdgeFlag_FIR		or p2_m_p0_less_beta_FIR or p0_m_q0_less_alpha_shift_FIR		or p1_FIR or p0_FIR or q1_FIR) 		if (bs_curr_FIR == 3'd4 && lumaEdgeFlag_FIR == 1'b1)			begin				if (!p2_m_p0_less_beta_FIR || !p0_m_q0_less_alpha_shift_FIR)					begin						bs4_weak_FIR0_a <= p1_FIR;	bs4_weak_FIR0_b <= p0_FIR;	bs4_weak_FIR0_c <= q1_FIR;					end				else					begin						bs4_weak_FIR0_a <= 0;	bs4_weak_FIR0_b <= 0;	bs4_weak_FIR0_c <= 0;					end			end		else if (bs_curr_FIR == 3'd4 && chromaEdgeFlag_FIR == 1'b1)			begin				bs4_weak_FIR0_a <= p1_FIR;	bs4_weak_FIR0_b <= p0_FIR;	bs4_weak_FIR0_c <= q1_FIR;			end		else			begin				bs4_weak_FIR0_a <= 0;	bs4_weak_FIR0_b <= 0;	bs4_weak_FIR0_c <= 0;			end	always @ (bs_curr_FIR or lumaEdgeFlag_FIR or chromaEdgeFlag_FIR		or q2_m_q0_less_beta_FIR or p0_m_q0_less_alpha_shift_FIR		or q1_FIR or q0_FIR or p1_FIR) 		if (bs_curr_FIR == 3'd4 && lumaEdgeFlag_FIR == 1'b1)			begin				if (!q2_m_q0_less_beta_FIR || !p0_m_q0_less_alpha_shift_FIR)					begin						bs4_weak_FIR1_a <= q1_FIR;	bs4_weak_FIR1_b <= q0_FIR;	bs4_weak_FIR1_c <= p1_FIR;					end				else					begin						bs4_weak_FIR1_a <= 0;	bs4_weak_FIR1_b <= 0;	bs4_weak_FIR1_c <= 0;					end			end		else if (bs_curr_FIR == 3'd4 && chromaEdgeFlag_FIR == 1'b1)			begin				bs4_weak_FIR1_a <= q1_FIR;	bs4_weak_FIR1_b <= q0_FIR;	bs4_weak_FIR1_c <= p1_FIR;			end		else			begin				bs4_weak_FIR1_a <= 0;	bs4_weak_FIR1_b <= 0;	bs4_weak_FIR1_c <= 0;			end		//bs = 1 ~ 3,for p0 and q0 filtering	wire [9:0] p0_MW_tmp,q0_MW_tmp;	wire [7:0] p0_MW_clipped,q0_MW_clipped;	assign p0_MW_tmp = (bs_curr_FIR != 0 && bs_curr_FIR != 3'd4)? ({2'b0,p0_FIR} + {{4{delta_0[5]}},delta_0}):0;	assign q0_MW_tmp = (bs_curr_FIR != 0 && bs_curr_FIR != 3'd4)? ({2'b0,q0_FIR} + 						{~delta_0[5],~delta_0[5],~delta_0[5],~delta_0[5],~delta_0} + 1):0;	assign p0_MW_clipped = (p0_MW_tmp[9] == 1'b1)? 0:((p0_MW_tmp[8] == 1'b1)? 8'd255:p0_MW_tmp[7:0]);	assign q0_MW_clipped = (q0_MW_tmp[9] == 1'b1)? 0:((q0_MW_tmp[8] == 1'b1)? 8'd255:q0_MW_tmp[7:0]);				//	Pipelined parameters	reg [7:0] p0_MW,p1_MW,p2_MW,p3_MW;	reg [7:0] q0_MW,q1_MW,q2_MW,q3_MW;	always @ (posedge gclk_DF or negedge reset_n)		if (reset_n == 1'b0)			begin				p0_MW <= 0;	p1_MW <= 0;	p2_MW <= 0;				q0_MW <= 0;	q1_MW <= 0;	q2_MW <= 0;			end			else if (bs_curr_FIR == 3'd4)			begin				if (lumaEdgeFlag_FIR)					begin						p0_MW <= (p0_m_q0_less_alpha_shift_FIR && p2_m_p0_less_beta_FIR)? 								  	bs4_strong_FIR_p0_out:bs4_weak_FIR0_out;						q0_MW <= (p0_m_q0_less_alpha_shift_FIR && q2_m_q0_less_beta_FIR)? 									bs4_strong_FIR_q0_out:bs4_weak_FIR1_out;						p1_MW <= (p0_m_q0_less_alpha_shift_FIR && p2_m_p0_less_beta_FIR)? 									bs4_strong_FIR_p1_out:p1_FIR;						q1_MW <= (p0_m_q0_less_alpha_shift_FIR && q2_m_q0_less_beta_FIR)? 									bs4_strong_FIR_q1_out:q1_FIR;						p2_MW <= (p0_m_q0_less_alpha_shift_FIR && p2_m_p0_less_beta_FIR)? 									bs4_strong_FIR_p2_out:p2_FIR;						q2_MW <= (p0_m_q0_less_alpha_shift_FIR && q2_m_q0_less_beta_FIR)? 									bs4_strong_FIR_q2_out:q2_FIR;					end				else					begin 						p0_MW <= bs4_weak_FIR0_out;	q0_MW <= bs4_weak_FIR1_out;						p1_MW <= p1_FIR;		q1_MW <= q1_FIR;						p2_MW <= p2_FIR;		q2_MW <= q2_FIR;					end			end		else if (bs_curr_FIR != 0 && bs_curr_FIR != 3'd4)			begin				p0_MW <= p0_MW_clipped;				q0_MW <= q0_MW_clipped;				p1_MW <= (lumaEdgeFlag_FIR)? ((p2_m_p0_less_beta_FIR)? (p1_FIR + {delta_p1[5],delta_p1[5],delta_p1}):p1_FIR):p1_FIR; 				q1_MW <= (lumaEdgeFlag_FIR)? ((q2_m_q0_less_beta_FIR)? (q1_FIR + {delta_q1[5],delta_q1[5],delta_q1}):q1_FIR):q1_FIR;				p2_MW <= p2_FIR;				q2_MW <= q2_FIR;			end		else			begin				p0_MW <= p0_FIR;	p1_MW <= p1_FIR;	p2_MW <= p2_FIR;				q0_MW <= q0_FIR;	q1_MW <= q1_FIR;	q2_MW <= q2_FIR;			end		reg [2:0] bs_curr_MW;	reg [5:0] DF_edge_counter_MW;	reg [1:0] one_edge_counter_MW;	always @ (posedge gclk_DF or negedge reset_n)		if (reset_n == 1'b0)			begin				DF_edge_counter_MW <= 6'd48;	one_edge_counter_MW <= 2'd3;				p3_MW <= 0;						q3_MW <= 0;				bs_curr_MW <= 0;							end		else			begin				DF_edge_counter_MW <= DF_edge_counter_FIR;		p3_MW <= p3_FIR;							one_edge_counter_MW <= one_edge_counter_FIR;	q3_MW <= q3_FIR;				bs_curr_MW <= bs_curr_FIR;					endendmodulemodule absolute (a,b,out);	input [7:0] a,b;	output [7:0] out;		assign out = (a > b)? (a - b):(b - a);endmodulemodule clip_to_c (delta,c,out);	input [8:0] delta;	input [4:0] c;		// 0 ~ 25,	 [4:0]	output [5:0] out;	// -25 ~ 25, [5:0] 	reg [5:0] out;		wire [5:0] neg_c;	//-25 ~ 25,[5:0]	assign neg_c = {1'b1,~c} + 1;		always @ (delta or c or neg_c)		if (delta[8] == 1'b0)	//delta is positive			out <= (delta[7:0] > {3'b0,c})? {1'b0,c}:delta[5:0];		else					//delta is negtive			out <= (delta[7:0] < {2'b11,neg_c})? {1'b1,neg_c}:delta[5:0];endmodulemodule bs4_strong_FIR (p0,p1,p2,p3,q0,q1,q2,q3,p0_out,p1_out,p2_out,q0_out,q1_out,q2_out);	input [7:0]  p0,p1,p2,p3,q0,q1,q2,q3;	output [7:0] p0_out,p1_out,p2_out,q0_out,q1_out,q2_out;		wire [8:0] sum_p2p3,sum_p1p2,sum_p0q0,sum_p1q1,sum_q1q2,sum_q2q3;	assign sum_p2p3 = p2 + p3;	assign sum_p1p2 = p1 + p2;	assign sum_p0q0 = p0 + q0;	assign sum_p1q1 = p1 + q1;	assign sum_q1q2 = q1 + q2;	assign sum_q2q3 = q2 + q3;		wire [9:0] sum_p2p3_x2,sum_q2q3_x2;	assign sum_p2p3_x2 = {sum_p2p3,1'b0};	assign sum_q2q3_x2 = {sum_q2q3,1'b0};		wire [9:0] sum_0,sum_1,sum_2;	assign sum_0 = sum_p0q0 + sum_p1p2;	assign sum_1 = sum_p0q0 + sum_p1q1;	assign sum_2 = sum_p0q0 + sum_q1q2;		wire [10:0] p0_tmp,p2_tmp,q0_tmp,q2_tmp;	assign p0_tmp = sum_0 + sum_1;	assign p2_tmp = sum_p2p3_x2 + sum_0;	assign q0_tmp = sum_1 + sum_2;	assign q2_tmp = sum_q2q3_x2 + sum_2;		assign p0_out = (p0_tmp + 4) >> 3;	assign p1_out = (sum_0  + 2) >> 2;	assign p2_out = (p2_tmp + 4) >> 3;	assign q0_out = (q0_tmp + 4) >> 3;	assign q1_out = (sum_2  + 2) >> 2;	assign q2_out = (q2_tmp + 4) >> 3;endmodulemodule bs4_weak_FIR (a,b,c,out);	input [7:0] a,b,c;	output [7:0] out;		wire [8:0] a_x2;	assign a_x2 = {a,1'b0};		wire [8:0] sum_bc;	assign sum_bc = b + c;		wire [9:0] out_tmp;	assign out_tmp = (a_x2 + sum_bc) + 2;	assign out = out_tmp[9:2];endmodule	

⌨️ 快捷键说明

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