最近做的一个项目需要把FPGA计算结果显示到电脑上,用到了uart串口。事情做完了,但我感觉我这辈子应该还会用到它,在此总结一下吧。代码由于涉及到项目肯定是不能发的,总结一下知识点还是可以的。
关于UART协议就不多说了,网上多的是,就下面这个维基上的图简单带过一下。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yN5YzMjhTZ3czN2EDM2kjNygDMxMWNwEGOkRWN4cTNw8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
我们要传的数据是中间的bit 0到bit 7的这8个数据,UART协议就是大伙约好了,让通信的线在没啥事的时候电平都是高,当要传输数据的时候,发送端module先发送一个周期的低电平,然后发送正经要传的8个数据,等传完后再把输出的电平拉回高。
接收端module怎么工作呢,他一旦看到电平从高变低了整整一个周期(我这里说的周期不是时钟频率那个周期,而是按波特率算出来的传一个数据位要花的大周期),就明白有活上门了,然后就吭哧吭哧开始接受数据,接受方法一般就是把数据拿过来放自己肚子里的寄存器存起来,接受完就完事了。
把说明再降智一点,电脑和FPGA之间怎么用这个UART串口协议呢?
1.我们在电脑的串口调试助手把数据敲进去,软件把数据配上开始位、结束位(有时候有校验位,我这没用到),通过数据线把包装完的10位数据发送给FPGA的接受端module。
2.接受端module接受完数据,把10位数中多余的开始位和结束位扒拉掉,然后把中间有效的8位数给DUT。
3.DUT做各种需要的计算操作,算完之后,把数据按照8位8位的格式交给FPGA的发送端module。
4.发送端module再把这些8位8位的数据按跟前面一样的方法,把这些8位数据包装成有开始位、结束位的10位数据,然后通过数据线把内容传给电脑。
5.这样我们在电脑调试助手上就可以看到FPGA计算后的处理结果了。
本来就想几句话带过的,结果叨逼叨了这么半天。
下面我们就按顺序来看,首先是FPGA接受端module的说明图片,画的比较随意,但应该都能看懂。
这个输入串口module的代码主体就三个部分。
1.设定时钟频率,波特率,设定的目的是要计算出我们传输一个bit需要多少ns的时长,这个时长在后面的状态机里用得上。
2.一个简单的状态机,状态机就是上图中间S_IDLE到S_DATA的那五个状态。开头和结尾两个状态只用来控制信号线,不占时长,中间三个状态就对应了开始位,中间传输8个数据,结束位这么三种状态。
3.一系列的时序逻辑来实现上图描述各个状态下的功能。
接下来是发送端module:
代码主体跟前面是类似的。
当然我们最后需要一个top module来把输入和输出串口统筹起来,这个部分就要根据不同的工程目的自己发挥了,这里就不谈了。