搜索
bottom↓
回复: 3

[请教]:FPGA从视频656数据流中提取奇/偶场的起始位置.

[复制链接]

出0入0汤圆

发表于 2013-1-16 16:51:16 | 显示全部楼层 |阅读模式
[请教]: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, 杜汶泽)

出0入0汤圆

发表于 2013-1-16 17:35:31 | 显示全部楼层
代码比较繁琐、BT656行场信号解织10来行代码就够的、

出0入0汤圆

 楼主| 发表于 2013-1-16 18:15:54 | 显示全部楼层
蓝色风暴@FPGA 发表于 2013-1-16 17:35
代码比较繁琐、BT656行场信号解织10来行代码就够的、

可否提供一个思路呢 有代码共享更好 谢谢

出0入0汤圆

发表于 2013-1-16 18:36:52 | 显示全部楼层
winkle 发表于 2013-1-16 18:15
可否提供一个思路呢 有代码共享更好 谢谢

用移位寄存器
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表