搜索
bottom↓
回复: 11

ov7670 的verilog代码,有点不明白,高手帮忙分析一下

[复制链接]

出0入0汤圆

发表于 2011-12-12 10:54:23 | 显示全部楼层 |阅读模式
module cmos_top(
                        osc_24MHZ,
                        iRST,
                        //ov7660
                        ov7660_reset,
                        ov7660_xclk,
                        ov7660_pclk,
                        ov7660_data_8bit,
                        iVSYNC,
                    iLVAL,
                        lcd2_cs,
                        lcd2_wr,
                        lcd2_rs,
                        lcd2_reset,
                        lcd2_rd,
                        lcd2_data16,
                        oDVAL
                );
                input osc_24MHZ;
                input iRST;
                //ov7660
                output ov7660_reset;
                output ov7660_xclk;
                input ov7660_pclk;
                input [7:0] ov7660_data_8bit;
                input iVSYNC;
                input iLVAL;
                //tft
                output lcd2_cs;
                output lcd2_wr;
                output lcd2_rs;
                output lcd2_reset;
                output lcd2_rd;
                output [15:0] lcd2_data16;
///////////////////////////////////
                output oDVAL;
assign iCLK = ov7660_pclk;
assign lcd2_wr = reg_lcd2_wr;   
assign lcd2_rs = 1'b1;
assign lcd2_rd = 1'b1;
assign lcd2_cs = 1'b0;
assign lcd2_reset = 1'b1;
assign lcd2_data16[15:0] = ov7660_data_16bit[15:0];

reg                                Pre_FVAL;
reg                                mCCD_FVAL;
reg                                mCCD_LVAL;
reg                [7:0]        mCCD_DATA;
reg                [10:0]        X_Cont;
reg                [10:0]        Y_Cont;

assign        oX_Cont                =        X_Cont;
assign        oY_Cont                =        Y_Cont;
//assign        i0v7660_data_8bit[7:0]        =        mCCD_DATA[7:0];
assign        i0v7660_data_8bit[7:0]        = ov7660_data_8bit[7:0];
//assign        oDVAL                =        mCCD_FVAL&mCCD_LVAL;
assign        oDVAL                =        mCCD_FVAL&iLVAL;
wire [7:0] i0v7660_data_8bit;
////////////////////////////////
//
assign iFVAL = iVSYNC;
reg [1:0] temp_count;
always@(posedge iCLK or negedge iRST)
begin
        if(!iRST)
        begin
                Pre_FVAL        <=        0;
                mCCD_FVAL        <=        0;
                mCCD_LVAL        <=        0;
                mCCD_DATA[7:0]        <=        8'h00;
                X_Cont                <=        0;
                Y_Cont                <=        0;
        end
        else
        begin
                Pre_FVAL        <=        iFVAL;
                if( {Pre_FVAL,iFVAL}==2'b10)
                mCCD_FVAL        <=        1;
                else if({Pre_FVAL,iFVAL}==4'b01)
                mCCD_FVAL        <=        0;
               
                mCCD_LVAL        <=        iLVAL;
//                mCCD_DATA[7:0]        <=        ov7660_data_8bit[7:0];
                if(mCCD_FVAL)
                begin
                        if(mCCD_LVAL)
                        begin
                                if(X_Cont<639)
                                X_Cont        <=        X_Cont+1;
                                else
                                begin
                                        X_Cont        <=        0;
                                        Y_Cont        <=        Y_Cont+1;
                                end
                        end
                end
                else
                begin
                        X_Cont        <=        0;
                        if(temp_count == 3)                                //这里的temp_count是什么作用
                                begin
                                Y_Cont        <=        0;
                                temp_count <= 2'b00;
                                end
                        else
                                temp_count <= temp_count + 1'b1;
                end
        end
end
///////////////////////////////////////////////////////
//ov7660 data 8 bit to 16 bit
//功    能:将输入的8位数据转换成16位,同时进行位转换。
//由OV7660 RGB565 的输出格式 RRRRRGGGGGGBBBBB 改为 BBBBBGGGGGGRRRRR 格式
//转换后的数据符合TFT 数据输入格式
reg  state1;
reg [7:0] pre_i0v7660_data_8bit;
reg [15:0] ov7660_data_16bit;
always@(posedge iCLK or negedge iRST)
        if(!iRST)
                begin
                        state1 <= 1'b0;
                end
        else
        begin
        if(iLVAL)
                case(state1)
                1'b0 : begin
                        pre_i0v7660_data_8bit[7:0] <= i0v7660_data_8bit[7:0];
                        state1 <= 1'b1;
                        end
                1'b1 : begin
                        ov7660_data_16bit[15:0] <= {pre_i0v7660_data_8bit[7:0],i0v7660_data_8bit[7:0]};
//{pre_i0v7660_data_8bit[7:0],i0v7660_data_8bit[7:0]};
//{i0v7660_data_8bit[4:0],pre_i0v7660_data_8bit[7:3],pre_i0v7660_data_8bit[2:0],i0v7660_data_8bit[7:5]};
//{i0v7660_data_8bit[4:0],pre_i0v7660_data_8bit[2:0],i0v7660_data_8bit[7:5],pre_i0v7660_data_8bit[7:3]};//{pre_i0v7660_data_8bit,i0v7660_data_8bit};
                        state1 <= 1'b0;
                        end
                default : state1 <= 1'b0;
                endcase
        end


reg temp1;
reg temp2;
always@(posedge iCLK or negedge iRST)
        if(!iRST)
                begin
                        temp1 <= 1'b0;
                        temp2 <= 1'b0;
                end
        else
                begin
                        temp1 <= iLVAL;
                        temp2 <= temp1;
                end               
       
reg reg_lcd2_wr;
reg write_state;
always@(negedge iCLK or negedge iRST)
        if(!iRST)
                begin
                        reg_lcd2_wr <= 1'b1;
                        write_state <= 1'b0;
                end
        else
                case(write_state)
                        0 : if(temp2&(Y_Cont == 0)&tft_outenable)
                                begin
                                        reg_lcd2_wr <= ~reg_lcd2_wr;
                                        write_state <= 1'b1;
                                end
                                else
                                        reg_lcd2_wr <= 1'b1;
                        1 : begin
                                if(temp2)
                                        reg_lcd2_wr <= ~reg_lcd2_wr;
                                else
                                        reg_lcd2_wr <= 1'b1;
                                if(Y_Cont < 240)
                                        write_state <= 1'b1;
                                else
                                        write_state <= 1'b0;
                                end
                endcase
reg [2:0] Frame_Cont;
reg tft_outenable;
always@(posedge iCLK or negedge iRST)
begin
        if(!iRST)
                Frame_Cont        <=        0;
        else
        begin
                if({Pre_FVAL,iFVAL}==2'b10)                     //这里是当iVSYNC下降沿时让Frame_cont 加1吗,为什么要加到小于5呢?
                        if(Frame_Cont < 5)                                       
                                begin
                                Frame_Cont        <=        Frame_Cont+1;
                                tft_outenable <= 1'b0;
                                end
                        else
                                tft_outenable <= 1'b1;
        end
end

endmodule

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-12-12 11:03:55 | 显示全部楼层
好长啊!等会回实验室用电脑看下!

出0入0汤圆

 楼主| 发表于 2011-12-12 11:24:40 | 显示全部楼层
这块是ov7670数据读取,然后送到tft上显示出来,Frame_Cont 这个量是控制什么呢?

出0入17汤圆

发表于 2011-12-12 12:23:42 | 显示全部楼层
应该是禁止最前面5帧输出,利用iVSYNC下降沿使Frame_cont加1来对帧同步信号计数。

出0入0汤圆

发表于 2011-12-12 12:48:19 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-12-12 14:18:09 | 显示全部楼层
没有电路???没有fifo??控制思想是什么??一头雾水,lz先介绍点背景的说

出0入0汤圆

 楼主| 发表于 2011-12-12 14:39:15 | 显示全部楼层
这是从网上看的一个利用nios配置好ov7670和lcd以后,然后在用verilog读取ov7670里的数据直接送到tft上显示,这是verilog读取数据并送lcd显示的一段代码?里面包括了读取ov7670的数据,然后将读取的8位数据转换成16位数据送lcd显示,就这样的,下面是一个完整的工程。 点击此处下载 ourdev_703922LOBDYK.rar(文件大小:14.83M) (原文件名:N_ov.rar)   留个qq2319786543,不知道坛里还有没有人做这个,可以讨论讨论。

出0入0汤圆

发表于 2011-12-18 12:00:12 | 显示全部楼层
有点诡异,没看懂。我写的代码直接让TFT暴走了。不知道是什么原因。哎

出0入0汤圆

发表于 2012-1-1 21:07:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-12 09:31:35 | 显示全部楼层
这种方式是让OV7670输出格式为RGB565,而这个格式正好和LCD的RGB565输入格式相同,所以直接写入就可以显示图像了。

出0入0汤圆

发表于 2012-5-21 23:05:52 | 显示全部楼层
顶,我也想知到fpag怎么实现数据的正确处理

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-27 11:24

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

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