这篇文章主要介绍一下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. 染色[SDOI2011]

    题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如"11 ...

  2. 之前同事问到的一道python题目

    Python面试题 之前同事问了一道Python题目如下,暂时归类为面试题 题目:把类似'123.456'的字符串转换成浮点型数据 方法一: >>> print '{:.3f}'.f ...

  3. jQuery 去空

    //去左右空格; function trim(s){ return s.replace(/(^\s*)|(\s*$)/g, ""); }     //去掉字符串中所有空格(包括中间 ...

  4. Vue事件处理

    前面的话 Vue事件监听的方式貌似违背了关注点分离(separation of concern)的传统理念.实际上,所有的Vue.js事件处理方法和表达式都严格绑定在当前视图的ViewModel上,它 ...

  5. Html常用标签元素

    Html常用标签元素 Html常用标签元素 常用HTML标签元素结合及简介 <html></html> 创建一个HTML文档 <head></head> ...

  6. Selenium 新窗口处理方法

    有时点击一个链接,跳到一个新的窗口,这时WebDriver需切换到新窗口,才能对新窗口的元素进行操作 这里封装一个switchToWindow方法: public boolean switchToWi ...

  7. 【NO.13】Jmeter - 在Linux整理和计算测试结果

    我们现在描述的是:在Linux系统使用Jmeter执行性能测试. 所以当执行完测试以后,就要计算一下测试结果,反馈给开发人员嘛. 在Linux系统使用Jmeter执行性能测试都包含哪些步骤,来,回顾一 ...

  8. 'IFileDialog' : no GUID has been associated with this object

    在VS2010中使用IFileDialog,提示一下错误: 'IFileDialog' : no GUID has been associated with this object MSDN上明确表示 ...

  9. Windows环境下Mysql如何快速导入或恢复表为innodb的数据

    注: 一.这个是对Innodb的数据恢复.MyISAM不需要这么麻烦,只要数据文件存在直接复制过去就可以. 二.该方法只适用于 1:想要恢复或者导入表的ibd文件和frm文件 2:你不仅需有ibd和f ...

  10. JSON以及Java转换JSON的方法(前后端常用处理方法)

    )); map.put("arr", new String[] { "a", "b" }); map.put("func" ...