这篇文章主要介绍一下verilog读ov7670的出厂序列号

读时序共分为五个部分

  • 首先发送start,然后发送OV7670的器件地址,ov6070的ID是0x42,0x42+一位响应位
  • 发送ov7670的寄存器地址,这里可以读取它的厂商识别号 ,比如1c  发送八位寄存器+接受一位响应位
  • ov7670的SCCB时序不同与iic时序,在发送完第一个部分需要比iic时序多发送一个stop,那就是stop+start
  • 再次发送ov7670的器件地址,这次需要指定读写,第八位是读写控制位,0是写,1是读,即0x43+响应位
  • 最后就是接受数据,需要注意的是最后不是响应位,而是NA,发送高电平即可,最后跟一个结束stop

ov7670管脚

  • pwdn是睡眠模式,0工作,1睡眠
  • rst_n  复位   低电平复位 高电平工作
  • XCLK系统时钟输入 官方手册推荐使用24M
  • SCl IIC时钟引脚  我用的是100K
  • SDA IIC数据输入   

简单的列一下程序

  • 100K时钟产生

IIC时钟对时钟要求不严格,所以采用进位的方法进行分频,所产生的时钟频率略小于100K,

div_en是使能信号,如果采用使能时钟可能会出现问题。

  • 时序采用状态机的方法一步步执行,相对比较直观

  • 响应标志位,因为数据位是双向口,需要在响应时间设置位输入

  • 状态机
//--------------------------------
//Funtion : sda_reg always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
iic_clk1 <= 'd1;
sda_reg <= 'd1;
riic_data <= 'd0;
end
else if(dir == 'b1) //read
case(time_cnt)
//idle
'd0 : begin
iic_clk1 <= 'd1;
sda_reg <= 'd1;
end
//start
'd1 :begin
iic_clk1 <= 'd1;
sda_reg <= 'd0;
end
'd2 :begin
iic_clk1 <= 'd0;
sda_reg <= 'd0;
end //ID_addr
'd3 : sda_reg <= wdata_reg[23];
'd4 : sda_reg <= wdata_reg[22];
'd5 : sda_reg <= wdata_reg[21];
'd6 : sda_reg <= wdata_reg[20];
'd7 : sda_reg <= wdata_reg[19];
'd8 : sda_reg <= wdata_reg[18];
'd9 : sda_reg <= wdata_reg[17];
'd10: sda_reg <= wdata_reg[16];
//ack
'd11: iic_clk1<= 1'd0;
'd12: ;
'd13: iic_clk1<= 1'd0;
//sub_addr
'd14: sda_reg <= wdata_reg[15];
'd15: sda_reg <= wdata_reg[14];
'd16: sda_reg <= wdata_reg[13];
'd17: sda_reg <= wdata_reg[12];
'd18: sda_reg <= wdata_reg[11];
'd19: sda_reg <= wdata_reg[10];
'd20: sda_reg <= wdata_reg[9];
'd21: sda_reg <= wdata_reg[8];
//ack
'd22: iic_clk1<= 1'd0;
'd23: ;
'd24: iic_clk1<= 1'd0;
//stop
'd25:begin
iic_clk1 <= 'd1;
sda_reg <= 'd0;
end
'd26:begin
iic_clk1 <= 'd1;
sda_reg <= 'd1;
end
//start
'd27:begin
iic_clk1 <= 'd1;
sda_reg <= 'd1;
end
'd28:begin
iic_clk1 <= 'd1;
sda_reg <= 'd0;
end
//ID_addr
'd29: sda_reg <= wdata_reg[7];
'd30: sda_reg <= wdata_reg[6];
'd31: sda_reg <= wdata_reg[5];
'd32: sda_reg <= wdata_reg[4];
'd33: sda_reg <= wdata_reg[3];
'd34: sda_reg <= wdata_reg[2];
'd35: sda_reg <= wdata_reg[1];
'd36: sda_reg <= wdata_reg[0];
//ack
'd37: iic_clk1<= 1'd0;
'd38: ;
'd39: iic_clk1<= 1'd0;
//read_data
'd40: riic_data[7] <= iic_sda;
'd41: riic_data[6] <= iic_sda;
'd42: riic_data[5] <= iic_sda;
'd43: riic_data[4] <= iic_sda;
'd44: riic_data[3] <= iic_sda;
'd45: riic_data[2] <= iic_sda;
'd46: riic_data[1] <= iic_sda;
'd47: riic_data[0] <= iic_sda;
//nack
'd48: sda_reg <= 1'd1;
//stop
'd49:begin
iic_clk1 <= 'd1;
sda_reg <= 'd0;
end
'd50:begin
iic_clk1 <= 'd1;
sda_reg <= 'd1;
end
default :
begin
iic_clk1 <= 'd1;
sda_reg <= 'd1;
end
endcase
end
  • iic_clk和iic_sda

  sda是双向端口,在输入的1时候设置为高阻态

dir是读写方向控制段,这里只是读所以置一

  • sigtab抓取数据

OV7670读操作的更多相关文章

  1. NoSql数据库初探-mongoDB读操作

    MongoDB以文档的形式来存储数据,此结果类似于JSON键值对.文档类似于编程语言中将键和值关联起来的结构(比如:字典.Map.哈希表.关联数组).MongoDB文档是以BOSN文档的形式存在的.B ...

  2. CI中获取读操作的结果集行数+获取写操作的影响行数

    本质:读操作,用mysql_num_rows函数,写操作用mysql_affected_rows函数 mysql_num_rows() 返回结果集中行的数目.此命令仅对 SELECT 语句有效.要取得 ...

  3. LVS+Keepalived实现MySQL从库读操作负载均衡

    http://www.osyunwei.com/archives/7464.html (学习运维知识好站) 说明: 操作系统:CentOS 5.X 64位 MySQL主服务器:192.168.21.1 ...

  4. 怎么看时序图--nand flash的读操作详解(转载)

    出处:http://blog.chinaunix.net/uid-28852942-id-3992727.html这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知 ...

  5. LVS+Keepalived实现MySQL从库读操作负载均衡配置

    转载于osyunwei 说明: 操作系统:CentOS 5.X 64位 MySQL主服务器:192.168.21.126 MySQL从服务器:192.168.21.127,192.168.21.128 ...

  6. 为什么ConcurrentHashMap的读操作不需要加锁?

    我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇博文讨论的问题--为什么它不需要加锁呢? ...

  7. python的读写和写读操作

    # 读写操作 (读写操作是正常的)f = open('log',mode='r+',encoding='utf-8') # log是文件名 print(f.read()) f.write(" ...

  8. operator[],识别读操作和写操作

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. 通过vb.net 和NPOI实现对excel的读操作

    通过vb.net 和NPOI实现对excel的读操作,很久很久前用过vb,这次朋友的代码是vb.net写的需要一个excel的操作, 就顾着着实现功能了,大家凑合着看吧 Option Explicit ...

随机推荐

  1. git远程仓库之添加远程库

    现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...

  2. ABP+AdminLTE+Bootstrap Table权限管理系统第一节--使用ASP.NET Boilerplate模板创建解决方案

    "abp是ASP.NET Boilerplate简称,是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板" abp官方网站: ...

  3. linux下U盘挂载

    linux下挂载U盘 一.Linux挂载U盘:1.插入u盘到计算机,如果目前只插入了一个u盘而且你的硬盘不是scsi的硬盘接口的话,那它的硬件名称为:sda1,可以用"fdisk -l&qu ...

  4. ubuntu 创建 PyCharm 桌面快捷方式 (或者叫 启动器 )

    优麒麟新出的 17.04 新加了各种软件支持.忍不住体验一把.可是安装完 PyCharm 之后,总是无法创建桌面快捷方式(这种说法貌似是windows的,ubuntu不认,它管这种方式 叫 启动器). ...

  5. 常见C/C++笔试、面试题(二)

    我自己总结过一些常见的C++面试题,那个是基于一个同学的腾讯面经所问问题,再加上知识点扩展进行了总结,这个是网上之前就有的版本,比较基础,有些题目总结一下,不能忘了基础: 1.求下面函数的返回值( 微 ...

  6. centos下从源码安装openssl

    cd /usr/src wget https://www.openssl.org/source/openssl-1.0.1g.tar.gz -O openssl-1.0.1g.tar.gz tar - ...

  7. SVProgressHUD源码解读(2.0.3)

    SVProgressHUD是iOS开发中比较常用的一个三方库,用来在执行耗时操作或者指示用户操作结果的场合,由于使用简单,功能丰富,交互友好,被广泛应用.本文从源码的角度,解读一下实现的过程,希望能起 ...

  8. 【前端】向blog或网站中添加语法高亮显示代码方法总结

    向blog或网站中添加语法高亮显示的代码方法总结 文章目录 预备知识 目标 第一类方法:嵌入 第二类方法:外部引用 第三类方法:忽略HTML和PHP 最近在写代码时遇到一个问题,就是如何让代码像在ID ...

  9. 如何修改ionic Popup的样式

    第一次用ionic的Popup时感觉很好用,但是太丑了.但是又不会修改自定义的样式,只能自己写了个模态框.后来仔细搜索了一下.发现还是可以修改的. var confirmPopup = $ionicP ...

  10. Tuple元组 C#

    使用元组, 一些简单的结构或对象就不需要新建一个类了. https://msdn.microsoft.com/zh-cn/library/system.tuple.aspx