一些小项目:
基本UART;
基于IIC通信的EEPROM读写控制;
基于SPI通信的M25P16 FLASH读写控制;
基于单总线的温度预警(DS18B20);
SDRAM读写控制;
摄像头ov5640的实现。
1.串口通信协议的优缺点
单总线(优点:线路简单,硬件成本低,成本低,总线扩展维护方便)
1.同步或异步 看数据传输是否有时钟,同步,异步是否
2.全双工还是半双工? 查看数据总线,
3.传输速度:SPI_几十Mbps,i2c_3.4Mbps,UART_2Mbps,单总线_最慢
2.UART
通用异步收发器,全双工,异步通信
空闲位高1
起始位0:1位 数据位:8位(5.6.7.8.9) 奇偶校准位(0) :1位 停止位:1位 共11位
波特率:每秒传输二进制码的位数。115200下传输1bit计数(晶振)需要434次,传输1600次bit需要5208次
接收端代码实现:数据传输速率由比特率和波特率计数器确定;延迟一个接收数据的时间周期,设置接收开始的标志信号,判断何时接收数据,串数据,转换数据传输。
发送端代码实现:通过比特率和波特率计数器确定数据传输速率;设置发送开始的标志信号,判断何时开始发送,并传输数据busy防止数据错误。
奇偶校验:偶校验:数据中有奇数1,校验位为1;偶数1,校验位为0.
3.基于IIC通信的EEPROM读写控制
Inter-Interated Cireuit 集成电路总线,同步通信,半双工
协议层面如何开始收发数据:
在SCL高电平期,SDA从高到低跳转。 在SCL数据在低电平期间传输,数据采样在高电平一个SCL脉冲传输一位。完成数据位之后,就在脉冲9的时候由接收端反馈应答信号,0表示应答,1表示非应答。
IIC如何判断是否有响应或如何停止收发数据:
时钟高电平时,拉高SDA,如果数据总线在下一个时钟脉冲期SDA被拉低,SDA=0.响应并继续传输数据;如果数据总线SDA保持不变,发送停止位置,停止传输数据。
设计代码:
250分频系统时钟保证占50%,设计四位操作符和三段状态机(IDLE-START-WRITE(READ)-RACK(SACK)-STOP),限制时钟总线和数据总线,防止亚稳态,存储输入输出数据,然后设计总线输出数据来控制IIC是否通信。
EEPROM读写数据帧:
写:写控制字节的起始位置 写地址 数据 停止位
读:开始,写控制字节 读地址 读控制字节 数据 停止位
EEPROM读写控制代码:
Electrically Erasable Programmable Read-Only Memmory 可编程只读存储器
特点:断电后存储的数据不丢失
暂存读写输入输出的数据fifo中、三段状态机(IDLE-WR_REQ(RD_REQ)-WAIT_WR(WAIT_RD)-DONE),判断字节,读写字节不同,输出根据读写过程确定,设计TASK根据状态跳转条件,包装一个请求、四个命令和八个数据,读取地址并写下地址。
4.基于SPI协议的M25P16 FLASH单字节读写芯片
Serial Peripheral Interface
串行外设接口:全双工,同步通信,一主多从,四种模式,出厂设置不得修改。
mode 0 :CPOL=0,CPHA=0;SCL在低电平下,数据采样在第一个边缘,上升沿采样,下降沿发送;
mode 1 : CPOL=0,CPHA=1;SCL在低电平下,数据发送在第一边,采样下降,发送上升;
mode 2:CPOL=1,CPHA=0;SCL数据采集下,数据采集在第一个边缘,下降边缘采集,上升边缘发送;
mode 3:CPOL=1,CPHA=1;SCL在高电平下,数据发送在第一个边缘,上升边缘采集,下降边缘发送。
协议层面如何开始收发数据?\收发数据的过程:
SPI主机和从机都有串行移位寄存器,SPI只有主从模式、外设的写作操作和操作同步进行,写一个数据就会收到一个数据。MSB形式传输。
1.拉低对应Slave的信号线,表示与该设备通信;
2.主机通过发送SCLK告知从机接收或发送时钟信号(根据工作模式确定高低电平有效);
3.主机将要发送的数据写入数据缓存区Memory,缓存区通过移位寄存器通过MOSI信号线将字节一个接一个地传输给从机;同时从机MISO接口接收到的数据通过移位寄存器一一移动到接收缓存区;
4.从机器还通过串行移位寄存器中的内容MISO信号返回主机;同时;MOSI信号线接收主机发送的数据,从而交换两个移位寄存器中的内容。
代码设计:
状态机(IDLE-READY-TRANS),将需要传输的数据存储在串行移位寄存器中,通过请求信号控制准备传输的状态MISO或MOSI中非阻塞赋值数据字节。
FLASH读写过程:
控制字节长度的设计选择器,重用:在传输过程中计数。
读:七状态机:IDLE-读ID命令-读ID-读数据命令-读地址-读数据-读完,设计选择器来判断当前操作下的字节长度,命令,数据字节,ID、地址三字节,设置寄存器最多读1000次,延迟5次ms,在阅读过程中,将每个字节存储在输出寄存器中,串转并统一输出。
写:主五状态读写命令状态机:IDLE-从操作状态机-擦除指令-读取状态寄存器指令-页面编程指令;IDLE-发送命令-发送地址-数据-延迟。在设计过程中,第一次编写、擦除、读取状态寄存器指令和页面编程必须是命令。发送完写作命令后,延迟等待;发送擦除命令后,先发送地址,等待延迟再发送数据,发完PP命令结束后,发送地址后接收数据,数据传输等待延迟,设计选择器控制输出字节的长度,设计标识符flag在不同阶段存储数据和地址,设计传输请求标志,提醒主机准备发送数据。
5.SDRAM
由于同步动态随机存储,空间存储量大,读写速度快,价格相对便宜;SDRAM内部使用电容存储数据,需要不断刷新每个存储电容,以确保数据不丢失。
初始化-自动刷新-读-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-自动刷-写-写-写-写-写-写-写-写-写-写-写-写-自动刷-写-写-写-写-写-写-写-写-写-自动刷-写-写-写-写-写-写-自动刷-写-写-写-写-写-写-自动刷-写-写-写-写-写-写-写-自动刷-写-写-写-写-写-写-写-写-写-写-自动刷-写-写-写-写-写-写-写-写-写-写-写-自动刷-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-自动刷-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写-写
页面突然读写过程:
同时发送激活指令bank想要写入数据的总线输出bank地址,在地址总线输出写入数据的行地址);发送激活指令后需要等待一段时间,在此期间需要发送空指令;等待结束后发送\读指令,在bank想要写入数据的总线输出bank读取地址,输出地址总线\列首地址写入数据,列读写(写入数据总线输出SDRAM第一个数据),每个周期输入空指令,数据总线总是输出要输出的数据,所有数据传输后的下一个时钟周期输出紧急终止指令,结束紧急情况;发送所有预充电指令bank预充电,A10拉高即选全部bank,在此期间,还应发送空指令。
为什么要引入?FIFO模块?
首先fifo能解决多bit其次,存在数据跨时钟域同步的问题SDRAM操作冲突时,数据可以寄存fifo通过引入,防止数据被覆盖或丢失;SDRAM实际上,操作了fifo的操作,而fifo控制时间相对简单,可以大大简化操作。
SDRAM代码设计理念:
用户将写入SDRAM将数据存储到写作中fifo在写端,等待SDRAM响应写作请求后,从写作开始fifo中读数据作为数据源写入SDRAM;用户发起读请求,待SDRAM响应阅读请求,从SDRAM读取的数据写入读取fifo,用户侧通过avalon的master将读取映射接口fifo读出数据。因此,需要对两个双端口进行例化fifo模块分别用作读写模块;读写响应信号均为异步信号,需要拍摄下降边缘;不仅如此,还设置读写优先仲裁和操作标志,限制何时读写。
仲裁机制:每次写作fifo当模块中的用户数据量大于突发长度时,首先进行SDRAM写入操作;每次阅读fifo模块中数据量小于突发长度时,就进行SDRAM读取操作;
6.基于单总线的温度预警(DS18B20)
1-wire ==> DQ,半双工,异步通信
CRC校验
如何处理传感器中的负值:补码、取反加1可获得二进制,乘以精度获得实际温度
7.ov5640
原理过程:相机采集图像,逐帧处理图像,1280x720分辨率;一帧图片的第一个像素点作为包头,最后一个像素点作为包尾,将图片转换为包尾RGB数据,灰度化图片,RGB像素点二值化,然后通过sobel通过流水线算子消除梯度方向(边缘检测)的影响FIFO接收并作为缓存数据,在FPGA中通过IIC接口配置ov5640寄存器;调用PLLIP核生成时钟,设计行同步(40)和场同步(5)脉冲,从算子转换灰度数据SDRAM调出,转换为RGB格式,输出到显示屏。
高斯滤波:经过周围像素点加权求和后,原图像上的一些噪声点将被去除;
sobel:用于边缘检测,四级流水线设计,一级缓存3列,二级求和,三级计算x,y方向梯度绝对值,四级计算梯度。
二值化:0为黑色,255为白色。
为什么要在这里加一个?buffer,为了增强VGA增加信号路径延迟的驱动能力。