代码编织梦想

1.读写控制框架

这里既包括了读,也包括了写,不过在这一讲我们只分析写iic
在这里插入图片描述

2.前言

通过看 AT24C64的芯片手册,知道 AT24C64的最大时钟scl为400K,这里我们不妨用250K

3.写iic状态转移图

在这里插入图片描述

信号看不懂,看了4之后再回过头来看3即可

4.信号说明

1.sys_clk:FPGA时钟,50M
2.sys_rst_n:复位信号
3.i2c_clk(1M):,因为我们系统(FPGA)的时钟为50M,所以需要我们对时钟进行分频得到250K的时钟,但是如果我们直接从50M分频道400K,那么分频计数器的值会很大,所以我们不妨以一个1M时钟i2c_clk作为过渡,用来控制与i2c有关信号的操作,如果生成250k的时钟,我们只需把ic_clk再4分频即可
4.r_cnt_clk:由50M时钟生成1M时钟的计数器
在这里插入图片描述

1.i2c_clk(1M):上面已经描述过了
2.sys_rst_n:复位信号
3.wr_en: 表示开始一次写,当wr_en为高时延迟一段时间i2c_start会拉高,当我们写的字节数满足要求时,同时i2c_end信号为低,wr_en拉低,其实这个信号现在不用多考虑,在i2c_wr+data模块我们会仔细讲解
4.i2c_start:开启一次I2C读写,(是读还是写,看wr_en和rd_en哪个拉高了)
5.addr_num:因为我们说过某些IIC设备的存储地址是2个字节的,有些是1个字节的,所以我们为了模块的适用性,增加addr_num端口,当addr_num为高电平时,表示iic设备的存储地址是2个字节的,所以我们写存储的地址的时候需要分两次写,先发送高8位,再发送低8位
6.state:我们从i2c的发送时序中可以看出,用状态机的方式编写代码是非常合适的方式
7.cnt_i2c_clk_en:当i2c_start信号为高时候,拉高;拉低条件看时序图
8.cnt_i2c_clk:因为每个状态的跳变的最小单位其实应该是scl时钟(250k),但是我们这里用i2c_clk(1M)作为控制时钟,因为i2_clk的时钟频率是scl时钟的4倍,所以状态的跳变的最小单位应该是4个i2c_clk的周期.所以我们需要一个计时器cnt_i2c_clk去计数这4个时钟周期,同时需要一个计数器使能信号cnt_i2c_clk_en,当cnt_i2c_clk_en为高的时候cnt_i2c_clk才开始计数,且计数的周期是4,即计到3清0,如果cnt_i2c_clk_en为低也清0.
9.cnt_bit:因为当我们发送设备地址的时候,需要发送7个bit的地址+读/写标志位,那我们怎么知道我们发了7个bit地址和读写标志位,就需要cnt_bit来计数
10.i2c_end:表示一次读/写结束,维持一个i2c_clk周期的高电平
11.i2c_scl(250k):读写iic设备的时钟,这里设置为250k.用cnt_i2c_clk计数器就可以实现i2c_clk的四分频,得到i2c_scl(250k)。注意i2c_scl默认状态下是高电平,只有cnt_i2c_clk_en为高时,表示开始读写i2c设备,才会开始跳变,当state在stop状态时拉高
在这里插入图片描述

12.i2c_sda_reg:即代表了i2c_sda的输出,因为iic的i2c_sda这个端口即可以做输出,也可以做输入,是inout类型的,我们一般用assign语句来赋值如assign i2c_sda = =(sda_en== 1)? i2c_sda_reg:z,当我们不控制该管脚时把该信号设为高阻态.所以我们还需要一个信号来标志i2c_sda信号是否受我们控制,以及一个信号i2c_sda_reg表示i2c_sda的输出,当i2c_sda当作输入的时候,我们把i2c_sda_reg拉高
注意:(1)这里我们eeprom的地址为1010011 (2)sda在scl低电平的时候变化,高电平的时候保持(3)读写控制位为 0 时,表示主机要对从机进行数据写入操作;读写控制位为 1 时,表示主机要对从机进行数据读出操作
13.sda_en:当sda_en为高的把i2c_sd_reg赋值给i2c_reg,当sda_en为高的时候,i2c_reg赋值为高阻态
14.i2c_sda:就是iic的数据线输出管脚
15.i2c_in:就是把ic2_sda寄存一下,用来提取ack信号,因为响应信号ack是我们状态机状态调转的条件
16.ack:就是从iic数据线i2c_sda提取的响应信号
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43254508/article/details/129629421

fpga蜂鸣器播放音乐-爱代码爱编程

  最近做EDA课设,看到自己的买的板子上有蜂鸣器,所以就打算做一个FPGA控制蜂鸣器播放音乐。   这里我使用的板子是睿智助学的FPGA开发板,板子上的芯片是EP4CE6E22C8,如果是你使用的是其他开发板或者是自己做的