搜索

[FPGA] OV7670摄像头显示(3)

[复制链接]
121|0
 楼主 | 2020-11-7 18:01 | 显示全部楼层 |阅读模式
1.4.4配置模块设计思路
该模块主要功能是将配置表中的数据读出,并对读出的数据进行解析,识别读写属性,根据读写属性,产生读写使能;识别寄存器地址和写数据,并将其分离。
由于配置表文件不可综合,因此无法通过例化获取,可以通过以下语句进行调用:
115059g7vdbcn5ip524aqi.jpg

该模块产生的读使能、写使能、寄存器地址和写数据,都会送给下游SCCB接口模块,而SCCB接口属于单总线接口。不能同时读写,因此,该模块在对配置表进行读取的时候,需要读取两次,先进行写,然后在进行读,该操作由计数器控制,如下图所示:
115100mck5bywyz28m1ud3.jpg

读写计数器rw_cnt:该计数器表示读写阶段,数第一个表示处于写数据阶段,数第二个表示处于读数据阶段。加一条件为(flag && rdy),表示按下配置开始按键,并且下游模块准备好的时候就加一;结束条件为数两个,只需要区分读阶段和写阶段,因此数两个即可,数完就清零。
待配置的寄存器共有164个,因此需要一个寄存器计数器来对它进行计数,如下图所示:
115100vd0k5owsztipcw9f.jpg

寄存器计数器reg_cnt:该计数器主要对需要配置的寄存器个数进行计数。加一条件问end_rw_cnt,由于一个寄存器需要读写两个阶段,所以为读写计数器的结束条件;结束条件为数164个,需要配置的寄存器共164个,数完就清零。
下面介绍一下该模块的其他信号设计思路:

配置指示信号flag:该信号初始状态为0,表示还没有开始配置;当接收到开始配置使能信号config_en的时候,变为1,表示开始进入配置状态;当配置完成之后,也就是寄存器计数器数完了,便退出配置状态,因此该信号从高变低的条件为end_reg_cnt
配置完成指示信号cmos_en:当该信号为高电平时,表示摄像头的寄存器已经经过最少一次配置了。初始状态为0,表示没有配置过;变1的条件为end_reg_cnt,也就是寄存器全部配置完一次之后,便置为高电平。

寄存器写数据wdata:初始状态为0,之后,直接取从配置表读出的add_wdata的低8位。

寄存器地址addr:初始状态位0,之后,直接取add_wdata的第8到第15位即可。

写使能wr_en:一个寄存器需要读和写两个阶段,先进行写,然后在读,add_wdata的第16位表示写属性。所以该信号从01的条件为(add_rw_cnt && rw_cnt==0 && add_wdata[16])

读使能rd_en:写之后,在进行读,add_wdata的第17位指示读属性,因此读使能拉高的条件位(add_rw_cnt && rw_cnt==1 && add_wdata[17])

1.4.5参考代码
  • assign              pwdn = 0;
  •     `include "ov7670_para.v"
  •     always  @(posedge clk or negedge rst_n)begin
  •         if(rst_n==1'b0)begin
  •             reg_cnt <= 0;
  •         end
  •         else if(add_reg_cnt)begin
  •             if(end_reg_cnt)
  •                 reg_cnt <= 0;
  •             else
  •                 reg_cnt <= reg_cnt + 1;
  •         end
  •     end
  •     assign add_reg_cnt = end_rw_cnt;
  •     assign end_reg_cnt = add_reg_cnt && reg_cnt==REG_NUM-1;
  •     always  @(posedge clk or negedge rst_n)begin
  •         if(rst_n==1'b0)begin
  •             rw_cnt <= 0;
  •         end
  •         else if(add_rw_cnt) begin
  •             if(end_rw_cnt)
  •                 rw_cnt <= 0;
  •             else
  •                 rw_cnt <= rw_cnt + 1;
  •         end
  •     end
  •     assign  add_rw_cnt = flag && rdy;
  •     assign  end_rw_cnt = add_rw_cnt && rw_cnt==RW_NUM-1;
  •     always  @(posedge clk or negedge rst_n)begin
  •         if(rst_n==1'b0)begin
  •             flag <= 1'b0;
  •         end
  •         else if(config_en)begin
  •             flag <= 1'b1;
  •         end
  •         else if(end_reg_cnt)begin
  •             flag <= 1'b0;
  •         end
  •     end
  •     always  @(posedge clk or negedge rst_n)begin
  •         if(rst_n==1'b0)begin
  •             cmos_en <= 1'b0;
  •         end
  •         else if(end_reg_cnt)begin
  •             cmos_en <= 1'b1;
  •         end
  •     end
  •     always  @(posedge clk or negedge rst_n)begin
  •         if(rst_n==1'b0)begin
  •             wdata <= 8'b0;
  •         end
  •         else begin
  •             wdata <= add_wdata[7:0];
  •         end
  •     end
  •     always  @(posedge clk or negedge rst_n)begin
  •         if(rst_n==1'b0)begin
  •             addr <= 8'b0;
  •         end
  •         else begin
  •             addr <= add_wdata[15:8];
  •         end
  •     end
  •     always  @(posedge clk or negedge rst_n)begin
  •         if(rst_n==1'b0)begin
  •             wr_en <= 1'b0;
  •         end
  •         else if(add_rw_cnt && rw_cnt==0 && add_wdata[16])begin
  •             wr_en <= 1'b1;
  •         end
  •         else begin
  •             wr_en <= 1'b0;
  •         end
  •     end
  •     always  @(posedge clk or negedge rst_n)begin
  •         if(rst_n==1'b0)begin
  •             rd_en <= 1'b0;
  •         end
  •         else if(add_rw_cnt && rw_cnt==1 && add_wdata[17])begin
  •             rd_en <= 1'b1;
  •         end
  •         else begin
  •             rd_en <= 1'b0;
  •         end
  •     end

[color=rgb(51, 102, 153) !important]复制代码




1.5 SCCB接口模块设计


1.5.1接口信号
  
信号名
  
I/O
位宽
定义
clk
I
1
工作时钟 25M
rst_n
I
1
系统复位信号,低电平有效
wren
I
1
写使能
rden
I
1
读使能
Sub_addr
I
8
寄存器地址
rdata
O
8
读寄存器数据
rdata_vld
O
1
读寄存器数据有效指示信号
Wdata
I
8
写寄存器数据
rdy
O
1
准备好接收指示信号
Sio_c
O
1
SCCB接口时钟信号
Sio_d_r
I
1
SCCB接口读数据线
en_sio_d_w
O
1
三态门使能信号
Sio_d_w
O
1
SCCB接口写数据线

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

在线客服 快速回复 返回顶部 返回列表