|
[请教]:FPGA从视频656数据流中提取奇/偶场的起始位置.
小弟不才,还在慢慢摸索中;
目的想实现: 从视频656数据流中找到FF 00 00 80/C7,然后再找到FF 00 00 C7/80, 这样就可以找到了某场的 StartOfOddFieldFlag标志;
大侠们帮忙看看下面代码. 部分代码从zrtech资料中的来的. 谢谢了
module receiver(
rst_n,
qd,
clk,
qfv,
qfv_odd,
qfv_even,
StartOfOddFieldFlag,
qd_out
);
// ports
input rst_n;
input [7:0] qd;
input clk;
output qfv,qfv_odd,qfv_even;
output StartOfOddFieldFlag; // =1'b1
output [7:0]qd_out;
//internal
reg [7:0] qd_dly,qd_dly1,qd_dly2,qd_dly3;
assign qd_out = (StartOfOddFieldFlag)? qd_dly3 : 8'hab;
always @ (posedge clk) begin
qd_dly <= qd;
qd_dly1 <= qd_dly;
qd_dly2 <= qd_dly1;
qd_dly3 <= qd_dly2;
end
reg [2:0] ODD_STATE;
always @ (posedge clk or negedge rst_n)
if(!rst_n) begin
ODD_STATE <= 0;
end
else
case(ODD_STATE) //FF 000080
3'd0: if(qd_dly==8'hff)
ODD_STATE <= 3'd1;
else
ODD_STATE <= 3'd0;
3'd1: if(qd_dly==8'h00)
ODD_STATE <= 3'd2;
else if(qd_dly==8'hff)
ODD_STATE <= 3'd1;
else
ODD_STATE <= 3'd0;
3'd2: if(qd_dly==8'h00)
ODD_STATE <= 3'd3;
else
ODD_STATE <= 3'd0;
3'd3: if(qd_dly==8'h80) //qfv_odd
ODD_STATE <= 3'd4;
else if(qd_dly==8'h9d)
ODD_STATE <= 3'd5;
else if(qd_dly == 8'hc7) //qfv_even
ODD_STATE <= 3'd6;
else if(qd_dly == 8'hda)
ODD_STATE <= 3'd7;
else
ODD_STATE <= 3'd0;
3'd4: ODD_STATE <= 1'b0;
3'd5: ODD_STATE <= 1'b0;
3'd6: ODD_STATE <= 1'b0;
3'd7: ODD_STATE <= 1'b0;
endcase
wire qfv = qfv_even | qfv_odd;
reg [10:0] qfv_cnt;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
qfv_cnt <= 1'b0;
else if(qfv)
qfv_cnt <= qfv_cnt + 1'b1;
else
qfv_cnt <= 1'b0;
reg qfv_odd;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
qfv_odd <= 1'b0;
else if(ODD_STATE == 3'd4) // one frame
qfv_odd <= 1'b1;
else if(qfv_cnt == 11'd1439)
qfv_odd <= 1'b0;
reg qfv_even;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
qfv_even <= 1'b0;
else if(ODD_STATE == 3'd6)
qfv_even <= 1'b1;
else if(qfv_cnt == 11'd1439)
qfv_even <= 1'b0;
//find 1st(odd frame) line of odd field,when state=3.
reg [2:0] STATE;
reg StartOfOddFieldFlag;
always @ (posedge clk or negedge rst_n)
if(!rst_n) begin
STATE <= 1'b0;
StartOfOddFieldFlag <=1'b0;
end
else
case(STATE)
3'd0: if(qfv_even) begin //find the first line of odd frame.
STATE <= 3'd1;
StartOfOddFieldFlag <=1'b0;
end
else begin
STATE <= 3'd0;
StartOfOddFieldFlag <=1'b0;
end
3'd1: if(qfv_odd) begin
STATE <= 3'd2;
StartOfOddFieldFlag <=1'b1;
end
else
STATE <= 3'd1;
3'd2: if(qfv_odd | qfv_even) //qfv_dly <= qfv_odd | qfv_even; ==find actvie pixel area per line,
STATE <= 3'd3; //to aviod the blanking(eav+280+sav) per line.
else
STATE <= 3'd2;
3'd3: if(!(qfv_odd | qfv_even))
STATE <= 3'd4;
else
STATE <= 3'd3;
3'd4: STATE <= 3'd2;
endcase
endmodule |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|