uart——我的第一个独立完成的fpga程序

之前总是抄人家的程序,感觉这样,不会有质的发展,还记得之前看的一篇怎么学FPGA的文章,上面写道,能独立完成串口收发程序,算是入门了,之前虽然独立写过,可那是eda课设的时候,用的还是low到不行的原理图设计,后来虽然搞过fir滤波器,毕竟是用的ip核,对写程序,没啥大的提高。这次从开始打算做到最后独立调试成功,前前后后,断断续续,大概用了一天半的时间吧。是在借鉴黑金的程序后完成的,所以程序里少不了黑金程序的影子,大体框架也差不多来自黑金。

完成程序的基础,是对串口通信协议的理解,之前总是感觉自己理解了,结果调试出来,总是出问题。比如,空闲状态下,rx,tx应为高电平,之前就是一直忽略了这句,rx还好,毕竟输入端,只需去判断其状态,电平不用刻意去拉高,也拉高不了,而tx就不一样了,需要手动去拉高的,这个一直是忘记拉高了。最开始的问题是,没有去滤波,直接在原始波特率下,来一个时钟边沿,就传输一位的数据,最后发现收发不一致,就以为是这里的问题【别处也有问题】,虽然在写testbench的时候,数据没问题【单独测试】,烧到板子上时,虽然能收能发,但是收发就是不一致,同一个数据,每次接收到的也不一样。参考了黑金、特权同学和小梅哥的串口程序后,发现他们都对其进行了滤波,便采用了黑金老师的方案,以16倍波特率作时钟,每次都在收发数据每个位的中间进行采样,结果发现,还是不行,便又开始看仿真波形,在观察rx的波形时,发现了如下问题:

也就是说,接收到的第一位数据dataout[0]为rx的起始位,回到了自己程序中很顺利的找到了问题,当计数到8,也就是第一个数据位时,接收到的位起始位0而不是第一个数据位。

经过改正后,波形终于恢复正常,但是1,烧到板子上时,发送,收发还是不一致。真让人头大,这个时候,又一次看了uart协议,发现了其中一句话,即空闲位:没有数据传输时线路上的电平状态。为逻辑1。 找到了症结,之前写串口发送程序时,一直忽略了这句话,一直没有管tx空闲时的电平状态,修改后,终于成功了。

总结:

1、testbench很重要,好多问题,都是通过看波形找到的。

2、虽然错误不是一起找到的,有时甚至会误判,但是,反复研读协议,观察波形,总能找到,总之就是不能放弃。写程序容易,难就难在后期调试中,总不能一蹴而就。

3、本次程序的主要问题有:

a、进行数据收发时没进行滤波

b、在接收数据的第一位搞成了数据的起始位

c、在发送数据时,空闲状态下没拉高电平

串口发送仿真波形:

串口接收仿真波形:

串口收发仿真波形:

RTL:

运行结果:

正确率还是蛮高的

代码下载地址:verilog—串口通信包括仿真_串口通信仿真文件-其它代码类资源-CSDN下载

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨狼007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值