前两篇文章为
fpga学习日记14,实现UART发送
http://bbs.ednchina.com/BLOG_ARTICLE_3014710.HTM
fpga学习日记22,代码阅读之实现UART
http://bbs.ednchina.com/BLOG_ARTICLE_3014817.HTM
本篇主要分析UART 的接收和发送以及signal tap 的一些知识
先看下上篇文章生成的uart RTL图形
首先时钟问题:
无论是UART通信还是IIC通信我们都需要在通信时钟的基础上倍频出来一个信号
用来在接收中捕捉 数据 在发送中获取数据(IIC可参考日记15)
然后就是起始信号和结束信号的捕捉 uart的开头可以采用滤波法排除干扰
IIC的开始信号很明显只要在数据的下降沿发现时钟是高电平即为开始信号
UART的开始信号就是从空闲的高电平变低 捕捉到下降沿切在短时间内没跳变即为开始信号
第二部分就是数据的接收和发送了
假如我们发送的每位数据需要500us那么我们需要一个250us的时钟来卡时间
扑捉到两位的中间开始改变数据 或在接受中捕捉每位数的中点来读取数据
接收数据:在发现起始信号之后 进入case语句依次接收N位数据(IIC接收后应答ack)
发送数据:起始信号发送完成后 进入case语句依次发送N位数据
第三部分就是要考虑数据缓存FIFO和标志位
比如发送完成标志
FIFO为空标志
接收到数据标志
总线忙等标志为编程提供方便
下面贴一个uart时序的例子 使用signal tap II捕捉的
signal tap II设置情况
捕捉以及深度
最后我们观察下最后这个图 uart接收时序收到的数据是0000 0001 低位在前
即收到的第一位有效数据应该为1
1,rx引脚信号的下降沿 为uart的起始信号 即时间1976所在列的下降沿,
2,此时收到的数据位数为num=0
3,上面的bps时钟接收时钟信号 明显可以看到是数据位时间单位的两倍 便于在数据位中间时刻获取信号有效值
4,在时间点1977--1978为uart收到的第一位有效数据
在下一个bps的高电平依次读取后面的每一位数据 即可 预留一位时间等待总线结束
5,发送的思想和接收是很类似的 开始和结束信号发送比较简单
发送时注意在两位数据时间的交叉点变化数据即可
文章评论(0条评论)
登录后参与讨论