FPGA串口收发

基于FPGA串口发送与接收
RS232协议的时序图如下
在这里插入图片描述
在这里可以看到,以低电平为开始的起始位,高电平为截止位,中间传输八位的数据。
传输的速率分为9600bps,19200bps与38400bps等,例如9600bps,系统时钟为1M用{(1/9600)x10^8}/2再减1,就可以得到9600的波特率。
在这里插入图片描述
这里只列出几种,当系统复位时默认为9600bps,因为最为常用。从时序图上看,每一位数据发送的时候都应该有一个周期的时钟信号,这里写一个时钟模块。
在这里插入图片描述每次开始传输数据,都让bps_clk有一个周期的高电平。
在这里插入图片描述
检测到bps_clk信号拉高的时候就让计数器加一,方便知道这是第几次传输数据。
在这里插入图片描述
根据上面给出的信号,判断是第几次传输,把不同的数据赋给串口发送端,最后加一个输出信号可以接到led表达串口的状态。
在这里插入图片描述
考虑到在接受要发送信号的过程中可能会出现中断等错误,加一个寄存器,在一开始的时候把要发送的信号寄存起来。
在这里插入图片描述
这样,串口发送模块就算基本实现了。
下面进行串口接受模块的编写
考虑到接受的时候会发生错误,所以在原来波特率的基础上再乘上16倍,所以只要把接受模块中的数除以16即可。
在这里插入图片描述
一样,在复位的时候,默认为9600bps。假如此时我们是从外界接受数据,就需要把外部的数据与内部的时钟同步,所以用两个寄存器实现,消除亚稳态。
在这里插入图片描述接受到外部的信号之后,需要把信号寄存,这样方便去判断是否有上升严或者是下降沿。
在这里插入图片描述
当前状态为0且前一个状态为1时为下降沿,
当前状态为1前一个状态为0时为上升沿,这里没有使用。同样需要计数器和时钟信号,与上面的代码相同。因为一共有10位数据,每一位数据采样十六次,所以有160次计数,每一位数据在刚开始和快结束时的状态都不稳定,所以只取中间的六次,每一次计数都让计数器进行加一,当到中间六次的时候,每一次都让数据位加上串口接收到的数据,如果大于3则认为是1,小于3则认为是0.
在这里插入图片描述
在这里插入图片描述
同样把数据寄存起来,当接收结束之后,付给输出。
在这里插入图片描述

发布了6 篇原创文章 · 获赞 4 · 访问量 491

猜你喜欢

转载自blog.csdn.net/qq_42013741/article/details/104442500