这篇文章主要介绍一下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. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  2. spring容器注入一个接口的两个实现类

    spring容器中能拥有两个同种类型的bean吗?我有两个dao类同时实现一个接口,这两个接口注入时报了异常如下. org.springframework.beans.factory.NoSuchBe ...

  3. OpenCV 之 Mat 类

    以前看 OpenCV 的书,或者资料也好,遇到 Mat 类的介绍,一般都是匆匆带过,自以为已经很熟悉了,从来没有深入研究过. 结果前段时间面试了一家公司,被问到两个 Mat 的问题:一是,谈谈对 Ma ...

  4. 关于Web.config的debug和release.config文件

    使用Web.Config Transformation配置灵活的配置文件 发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等.如果常 ...

  5. Linux误删C基本运行库libc.so.6处理方法

    1. libc.so.6介绍/usr/lib/libc.so.6是glibc的软链接,不同的平台可能路径会不一样.使用命令查看会看到: [root@farmer:~]$ls -l /lib/libc. ...

  6. “selection does not contain a main type”解决方法

    在运行java程序时,出现了错误“selection does not contain a main type”. 是因为.java文件不在项目的src路径内,也就是说源代码未被eclipse编译,字 ...

  7. Linux学习总结(十二)—— CentOS用户管理:创建用户、修改用户、修改密码、密码有效期、禁用账户、解锁账户、删除用户、查看所有用户信息

    文章首发于Linux学习总结(十二)-- CentOS用户管理,请尊重原创保留原文链接. 创建用户 useradd -g webadmin -d /home/zhangsan zhangsan pas ...

  8. 【Linux笔记(000) 】-- 系统启动过程

    一.   启动流程 BIOS --> MBR(Boot Code) --> 引导程序(GRUB) --> 加载内核 --> 执行Init --> runlevel 二.  ...

  9. cat命令汇总整理

    Cat命令:一般用作打开文件,查看文件内容(可以一次查看多个文件),参数有如下几个: -a 或 –all,显示全部 -b 或--number-nonblank 对非空输出行编号 -n 或 --numb ...

  10. spring(四)之基于注解(Annotation-based)的配置.md

    注解 这里讲的注解有下面几个 @Autowired @Qualifier(" ") @Genre(" ") @Offline @Resource(name=&q ...