📄 df_pipeline.v
字号:
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 + -