这篇文章主要介绍一下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. JPA常用注解

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.        JPA由EJB 3.0软件专家 ...

  2. ASP.NET Core MVC – Form Tag Helpers

    ASP.NET Core Tag Helpers系列目录 ASP.NET Core MVC Tag Helpers 介绍 ASP.NET Core MVC – Caching Tag Helpers ...

  3. python3.6----datetime.timedelta

    学习利用python进行数据分析---时间序列分析的时候发现python2.7版本的timedelta模块跟python3.6模块区别python2.7:in:delta= datetime(2017 ...

  4. javaWeb学习之tomcat服务器

    一.web a)        web结构 b)        常见的服务器 WebLogic: orcale公司的产品,支持JAVAEE规范,收费 WebsphereAS: IBM公司的产品 ,支持 ...

  5. 数据结构-->栈

    首先,栈是什么? 在代码当中,栈主要是一种实现特殊功能的一种数据结构,而不是像数组.集合之类的数据存储工具.它最大的特点就是后进先出. 那么后进先出是什么? 假设有一个数组,我们向里面添加一个数据,再 ...

  6. sqlite 的基本使用3

    AND 运算符和OR运算符 这两个运算符一般被称为连接运算符,用来缩小sqlite所选的数据 AND 运算符是当所有的条件都为真时,表达式才为真 sqlite and name = "bb& ...

  7. sqlite数据库之简单操作

    一 sqlite介绍 Sqlite是一种嵌入式数据库,类似于一个文件系统,是跟程序在一起的.跟mysql等数据库程序跟数据分离是不一样的. 应用场景:常用于保存本地配置,类似于本地文件系统,因此他内嵌 ...

  8. [Linux] Desktop Management

    xrandr --output Virtual1 --mode 1360x768 Extend Display Size

  9. 【可视化】Echarts3坐标系倒映

    目标: 用echarts实现在一个echarts图表中包含上下两个坐标系 横轴合并在一块.有一种上下对称水映的视觉效果 要点提示:grid 是一个数组 包含两个grid xAxis,yAxis也都是数 ...

  10. [js高手之路]this知多少

    this关键字在javascript中的变化非常的灵活,如果用的不好就非常恶心,用的好,程序就非常的优雅,灵活,飘逸.所以掌握this的用法,是每一个前端工程师必知必会的.而且这个也是一些大公司笔试中 ...