【精品博文】PC与FPGA通信 | MATLAB的非实时性对FPGA设计的考验

赢一个双肩背包

有多难?

戳一下试试看!

→_→

长摁识别

最近做一个东西,需要在PC端用MATLAB通过RS232串口按帧发数据到FPGA。每帧N个字节。MATLAB中只需要调用对应的串口函数,让发N个字节就行了。FPGA将收到的串口数据依次存到RAM中,接收完一个帧之后再进行后续的操作。

由于是拿RAM而不是FIFO作缓冲,因此需要做一个地址生成器。这个地址信号在收到新的一帧的时候必须初始化为0。在这里,我的针对初始化的FPGA设计犯了一个严重的错误。我让FPGA去捕获串口电平,如果连续捕获到10比特串口周期的1,就认为上一帧已经发送完毕,下一次接收到的数据就是属于下一帧的,RAM地址应该初始化为0。但上板之后却发现,FPGA有时能捕获到完整的一帧,有时却不能。后面用signaltap抓数据,发现在一帧数据的中间某段,会莫名其妙地捕获到10个比特串口周期的1,于是RAM的地址初始化为0,相当于把前面的数据覆盖掉了,而且本身这一帧的数据个数也不够了。

于是,费劲心思地去找地址信号以及相关信号的设计问题,找不到呀!后来,终于发现,我这样对地址信号的初始化设计是要有一个前提的,就是MATLAB发串口数据时必须连续地发,即字节之间是不能有停顿的,这就要求MATLAB具有实时性。但在windows这样一个多任务操作系统中,是不可能保证实时性的,就算在任务管理器中把MATLAB进程优先级设置为最高的实时(下图),也达不到实时(因为我试过,在设置为实时之后,FPGA还是会出现上一段中描述的问题)(另外,在Linux下会不会有这样的问题我没试过,不过我猜还是会有问题吧,毕竟它也是一个多任务的操作系统)。

找到问题之后,那FPGA设计部分的修改一下就完成了。在地址还没加到最大值之前,就算连续捕获到10个比特串口周期的1,地址也不复位了0,上板,通过!

其实这种修改方法也是不严谨的。真正我觉得严谨的方法应当是:增加一个计数器,用来计当前收到的数据的字节数。只要字节数达到最大值N,那么再接收到下一个字节的串口数据时地址就复位为0,当然该计数器也应当复位为0,开始下一帧的计数。就算不是PC这种多任务程序和FPGA通信,而只是板间的芯片间的通信(比如2块FPGA之间的通信),也最好这样设计。因为虽然2块FPGA都可以自己设计以保证实时性,但通信本身的数据就有可能是断断续续的。如果非要按帧去实时地发送数据,还要做一个缓冲器以及防止中间某些我们都不易想到的问题,不值得。当时只是时间紧张,也懒得再这样修改了,马马虎虎交差。为自己在科研中的不严谨鄙视自己!嘻嘻~

(0)

相关推荐