上一节向大家介绍了摄像头配置的SCCB协议发送器的Verilog实现,这一节则向大家介绍配置信息存储模块:ovcfg_info的Verilog实现。

学习目标

  • 配置模块Verilog实现

系统框图

从图中我们可以看到,ov7725_cfg模块的作用类似一个存储器,根据SCCB模块输出的 i2c_clk 与done,确定输送进SCCB模块地址接口和数据接口的数据。

因此我们可以有一个思路出现:首先数据的更新要赶在TRAN1状态之前,而恰好在STOP3状态结束的后四分之一周期,done信号发生一个跳变。因此可以用触发器检测done信号对数据进行计数。

代码实现

接口

sys_resetn 复位信号
i2c_clk 触发时钟信号
done 配置完成信号
i2c_addr 地址数据输出
i2c_data 配置参数输出

Verilog代码

/*
 By WWD 2022/9/3
  OV7725 cfg  V1.0

转载请注明出处!
*/
module ovcfg_info(
input wire i2c_clk,
input wire sys_resetn,
input wire done,

output wire [7:0] i2c_addr,
output wire [7:0] i2c_data
);

reg[6:0] info_cnt;

wire[15:0] cfg_data_reg [68:0];

assign  cfg_data_reg[00]  =       {8'h3d,  8'h03};
assign  cfg_data_reg[01]  =       {8'h15,  8'h00};
assign  cfg_data_reg[02]  =       {8'h17,  8'h23};
assign  cfg_data_reg[03]  =       {8'h18,  8'ha0};
assign  cfg_data_reg[04]  =       {8'h19,  8'h07};
assign  cfg_data_reg[05]  =       {8'h1a,  8'hf0};
assign  cfg_data_reg[06]  =       {8'h32,  8'h00};
assign  cfg_data_reg[07]  =       {8'h29,  8'ha0};
assign  cfg_data_reg[08]  =       {8'h2a,  8'h00};
assign  cfg_data_reg[09]  =       {8'h2b,  8'h00};
assign  cfg_data_reg[10]  =       {8'h2c,  8'hf0};
assign  cfg_data_reg[11]  =       {8'h0d,  8'h41};
assign  cfg_data_reg[12]  =       {8'h11,  8'h00};
assign  cfg_data_reg[13]  =       {8'h12,  8'h06};
assign  cfg_data_reg[14]  =       {8'h0c,  8'hd0};
assign  cfg_data_reg[15]  =       {8'h42,  8'h7f};
assign  cfg_data_reg[16]  =       {8'h4d,  8'h09};
assign  cfg_data_reg[17]  =       {8'h63,  8'hf0};
assign  cfg_data_reg[18]  =       {8'h64,  8'hff};
assign  cfg_data_reg[19]  =       {8'h65,  8'h00};
assign  cfg_data_reg[20]  =       {8'h66,  8'h00};
assign  cfg_data_reg[21]  =       {8'h67,  8'h00};
assign  cfg_data_reg[22]  =       {8'h13,  8'hff};
assign  cfg_data_reg[23]  =       {8'h0f,  8'hc5};
assign  cfg_data_reg[24]  =       {8'h14,  8'h11};
assign  cfg_data_reg[25]  =       {8'h22,  8'h98};
assign  cfg_data_reg[26]  =       {8'h23,  8'h03};
assign  cfg_data_reg[27]  =       {8'h24,  8'h40};
assign  cfg_data_reg[28]  =       {8'h25,  8'h30};
assign  cfg_data_reg[29]  =       {8'h26,  8'ha1};
assign  cfg_data_reg[30]  =       {8'h6b,  8'haa};
assign  cfg_data_reg[31]  =       {8'h13,  8'hff};
assign  cfg_data_reg[32]  =       {8'h90,  8'h0a};
assign  cfg_data_reg[33]  =       {8'h91,  8'h01};
assign  cfg_data_reg[34]  =       {8'h92,  8'h01};
assign  cfg_data_reg[35]  =       {8'h93,  8'h01};
assign  cfg_data_reg[36]  =       {8'h94,  8'h5f};
assign  cfg_data_reg[37]  =       {8'h95,  8'h53};
assign  cfg_data_reg[38]  =       {8'h96,  8'h11};
assign  cfg_data_reg[39]  =       {8'h97,  8'h1a};
assign  cfg_data_reg[40]  =       {8'h98,  8'h3d};
assign  cfg_data_reg[41]  =       {8'h99,  8'h5a};
assign  cfg_data_reg[42]  =       {8'h9a,  8'h1e};
assign  cfg_data_reg[43]  =       {8'h9b,  8'h3f};
assign  cfg_data_reg[44]  =       {8'h9c,  8'h25};
assign  cfg_data_reg[45]  =       {8'h9e,  8'h81};
assign  cfg_data_reg[46]  =       {8'ha6,  8'h06};
assign  cfg_data_reg[47]  =       {8'ha7,  8'h65};
assign  cfg_data_reg[48]  =       {8'ha8,  8'h65};
assign  cfg_data_reg[49]  =       {8'ha9,  8'h80};
assign  cfg_data_reg[50]  =       {8'haa,  8'h80};
assign  cfg_data_reg[51]  =       {8'h7e,  8'h0c};
assign  cfg_data_reg[52]  =       {8'h7f,  8'h16};
assign  cfg_data_reg[53]  =       {8'h80,  8'h2a};
assign  cfg_data_reg[54]  =       {8'h81,  8'h4e};
assign  cfg_data_reg[55]  =       {8'h82,  8'h61};
assign  cfg_data_reg[56]  =       {8'h83,  8'h6f};
assign  cfg_data_reg[57]  =       {8'h84,  8'h7b};
assign  cfg_data_reg[58]  =       {8'h85,  8'h86};
assign  cfg_data_reg[59]  =       {8'h86,  8'h8e};
assign  cfg_data_reg[60]  =       {8'h87,  8'h97};
assign  cfg_data_reg[61]  =       {8'h88,  8'ha4};
assign  cfg_data_reg[62]  =       {8'h89,  8'haf};
assign  cfg_data_reg[63]  =       {8'h8a,  8'hc5};
assign  cfg_data_reg[64]  =       {8'h8b,  8'hd7};
assign  cfg_data_reg[65]  =       {8'h8c,  8'he8};
assign  cfg_data_reg[66]  =       {8'h8d,  8'h20};
assign  cfg_data_reg[67]  =       {8'h0e,  8'h65};
assign  cfg_data_reg[68]  =       {8'h09,  8'h00};

always@(posedge i2c_clk or negedge sys_resetn)begin
if(sys_resetn == 1'b0)
    info_cnt <= 7'd0;
else if(info_cnt == 7'd69)
    info_cnt <= 7'd0;
else if(done == 1'b1)
    info_cnt <= info_cnt +7'd1;
end

assign i2c_addr = cfg_data_reg[info_cnt][15:8];
assign i2c_data = cfg_data_reg[info_cnt][7:0];

endmodule

测试验证

TB文件

/*
By WWD 2022/9/3
转载请注明出处
*/
`timescale 1ns/1nsmodule tb_topovcfg();reg sys_reset_n;
reg sys_clk;
reg i2c_start;wire i2c_clk;
wire done;
wire [7:0] i2c_addr;
wire [7:0] i2c_data;initial beginsys_reset_n = 1'b0;
sys_clk = 1'b1;
i2c_start = 1'b0;
#20i2c_start = 1'b1;sys_reset_n = 1'b1;/*#2000byte_addr = 8'b1000_1111;i2c_data = 8'b1111_0100;*/
endalways #10 sys_clk = ~sys_clk; //50MHz时钟SCCB u1(
.sys_reset_n(sys_reset_n),
.sys_clk(sys_clk),
.i2c_start(i2c_start),
.byte_addr(i2c_addr),
.i2c_data(i2c_data),
.i2c_clk(i2c_clk),
.done(done),
.SDA(),
.SCL()
); ovcfg_info u2(
.i2c_clk(i2c_clk),
.sys_resetn(sys_reset_n),
.done(done),
.i2c_addr(i2c_addr),
.i2c_data(i2c_data)
);endmodule

Modelsim波形图

我们随意验证第一组数据与第二组数据:

assign  cfg_data_reg[00]  =       {8'h3d,  8'h03};
assign  cfg_data_reg[01]  =       {8'h15,  8'h00};

发现完全符合要求!

并且可以看到,当计数到68后,计数器归零,并且对应数据完全正确。

这里留给大家一个小任务,请大家改造这个模块,使得配置的过程只经历一遍。

下一节,我们将介绍如何设计OV7725的数据采集模块,敬请期待!

FPGA之OV7725摄像头采集与VGA显示实验--3--摄像头配置模块实现(Verilog代码)相关推荐

  1. FPGA之OV7725摄像头采集与VGA显示实验--2--SCCB协议发送器实现(Verilog代码)

    上一节学习了OV7725的配置协议SCCB,且该协议几乎与一致,大家可能会疑惑应答位的问题,实际上SCCB协议虽说不关心,但是还是会把SDA拉低:这一节我们将讲解OV7725配置模块中SCCB发送器的 ...

  2. FPGA之OV7725摄像头采集与VGA显示实验--4--摄像头数据输出VAG协议分析

    大家好,前面几节给大家介绍了OV7725摄像头通过SCCB协议进行配置的内容,这一节我们来聊一下关于OV7725摄像头的VAG协议的知识,为后面的数据采集模块做铺垫. 学习目标 理解VGA协议传输数据 ...

  3. FPGA--(基于Quartus的FPAG程序下载与固化教程)VGA显示实验之上板测试

    本节内容旨在教会大家如何下载程序进入FPGA并且验证我们前几节所做的VGA显示实验. 材料 EP4CE10F17C8N FPGA .USB_Blaster 下载器 完整Verilog代码.Quartu ...

  4. 【接口协议】FPGA 驱动 VGA 显示实验(二)实验设计部分

    目录 实验任务 实验环境 实验设计 程序设计 VGA 时序模块 模块框图 仿真波形 顶层模块 约束文件 实验任务 利用FPGA驱动VGA实现彩条显示,分辨率为800 × 600@60Hz,分别显示三种 ...

  5. 【Verilog】基于FPGA的五子棋小游戏(VGA显示、双人对战、胜负判别、附完整代码)

    基于FPGA的五子棋小游戏 有一些说明: 1.本文是基于VGA的显示小游戏,主要为VGA显示的拓展应用: 2.为适应不同显示屏的分辨率,棋盘确定为10X10的黑线白底的方格: 3.下棋主要用棋格颜色变 ...

  6. 基于FPGA的VGA显示实验

    VGA驱动原理 信号线 定义 HS 行同步信号(3.3V 电平) VS 场同步信号(3.3V 电平) R 红基色 (0~0.714V 模拟信号) G 绿基色 (0~0.714V 模拟信号) B 蓝基色 ...

  7. FPGA实现VGA显示(五)——————配置ROM测试及图片显示(b)

    如何使用ISE生成ROMip显示彩色图片 这里设置宽度,这里深度设置设置的是9200,设置的时候进行简单计算. 例化可以直接得到,修改内部连线即可 ROM简单测试总结 前面显示代码其实是有问题的,因为 ...

  8. 树莓派摄像头在桌面不显示 | 树莓派VNC摄像头实时显示

    背景 以前连接树莓派一直用SSH连接,生成的图像结果也都是保存以后再看.导师说想看实时Demo,我想这用VNC用网线直接连接就显示了.教程:树莓派有线SSH连接电脑(PC开发+树莓派调试+管理文件) ...

  9. 【正点原子FPGA连载】第四十三章MT9V034摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  10. 【正点原子FPGA连载】第四十九章OV5640摄像头HDMI灰度显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

最新文章

  1. pipe 双管道 简易实现代码
  2. Anti-If: The missing patterns--转
  3. 【招聘(南京)】南京纳龙科技有限公司招高级.net开发工程师
  4. Trie树kmpAC自动机后缀数组Manacher
  5. linux中写脚本不能写中文,Linux系统中Sublime Text无法输入中文怎么办?
  6. shiro springboot 整合
  7. php条件运算符加法器,【加法笔记系列】JS 加法器模拟
  8. CCF CSP201909-2 小明种苹果(续)
  9. Durable NAND flash memory management
  10. 电子沙盘 数字沙盘 开发教程
  11. Excel Spearman相关系数
  12. linux中man命令的基本用法,linux中的man命令的详细解释
  13. Linux里解压zip报错和安装jdk遇到的问题,安装步骤
  14. 在阿里云买的域名,如何下载该域名下的域名证书?
  15. 中儒集团董事长朱宝先生一行到访亚信总部!
  16. 自学Java之day07_API的初识及使用
  17. 物联网智能家居项目总结(全)
  18. linux下无线网卡安装debian,Debian下安装无线网卡的驱动
  19. Go 整洁架构模版,建议收藏
  20. 复杂指令集和精简指令集

热门文章

  1. 4484: [Jsoi2015]最小表示(拓扑序+bitset维护连通性)
  2. [研一上]人脸属性迁移文献梳理(1)
  3. 热电阻温度计 电阻温度探测器 直接浸入式清洁传感器 精密RTD 美国Burns 胶囊式铂电阻温度检测器 迷你RTD整体热电偶套管 气温传感器 测温传感器 温度传感器 温度传感器生产厂家 温度变送器
  4. 静态分析之数据流分析与 SSA 入门 (二)
  5. 性能测试 性能测试实战(七)Jmeter分布式性能测试 influxDB Grafana Master Salve 主从配置 高并发性能测试 环境搭建 性能数据收集 性能数据可视化平台 搭建问题分析
  6. ueditor 前后端分离+图片上传
  7. Web与小程序AR技术原理
  8. 大流量下订单号生成方法
  9. ReadHub源码阅读笔记(二)dagger+MVP
  10. 服务器安装m.2固态硬盘,笔记本怎么安装M.2接口固态硬盘?笔记本M.2接口固态硬盘安装方法...