串口通信的FPGA设计
注:主要为记录自己的学习过程。
一、主要功能
-
每隔1s PC向板子发送数据。
-
板子向PC回传数据。
二、分析
- 主要由四个模块构成,分别为:分频模块,发送模块,接收模块,顶层模块。
- 接收频率要是发送频率的两倍,这样可以确保可以数据全部接收到。
三、RTL
四、仿真、调试
- s_clk 与 r_clk 之间设置的是2倍关系,但仿真结果为1.5倍左右。
解决:通过观察 clk1 和 clk2 发现, clk1计数到2063,clk2 计数到1301,并不是两倍关系,将clk1改为计数到2603。 - start 一直为0。
解决:将波形缩小,观察cnt1s的值发现,在计数满9600时start 变为0(观察不仔细导致的问题) - cnt20一直为0。
解决:通过观察cnt20的波形发现为直线,不为数值,查看程序发现cnt20没有加位宽导致的。 - cnt1s计数没有问题,cnt10设置的计数0-9,仿真结果里计数到了15。
解决:通过观察程序发现,写的if else 语句关系有问题导致的。重新修改了一下。 - 通过观察仿真结果发现,txd有高阻态和x状态存在,结合程序和cnt1s,cnt10得出:只有在cnt10为1到9时,txd为x状态,此时为数据传输过程,当cnt为0时此时不能进行数据传输,txd为初始电平(高电平)。
- 通过串口调试助手测试后发现,有些数据传输正确,有些数据传输错误。
通过查看波形发现cnt10和cnt1s计数同步了,cnt10应该往后延时一个单位。
解决:通过将cnt10的值通过一个D触发器延时一个单位。
- 延时一个单位后,还是出现有数据传输错误的问题。
解决:通过查看了很久的程序和修改,最后将send模块中的case 语句里的default改为0解决(这里可能产生锁存器)
五、注意问题
- 在用串口调试助手时端口类型根据电脑的不同要选择不同的类型(我的为COM4)
- 数据的位宽要必须写,不能遗忘,这几次项目都有数据位宽没写导致的问题。