cpld,串口调试分享和疑问
本帖最后由 leicai05 于 2014-12-29 15:16 编辑用epm240调试串口记录
用黑金开发板的串口调试程序,调试串口收发程序,过程就是用PC发送数据到cpld,然后cpld接收后保存到fifo,然后在回送给pc(通讯方式是9600波特率,1个起始位,8个数据位,一个校验位和一个停止位)。
黑金板的程序中fifo的深度设置的是16个字节,emp240没那么多资源,只使用了8个字节深度。我想,因为是边收边发,所有只要有一两个fifo也就足够正常收发了。因为收发的速度是一样的嘛。
但是在调节的过程中发现,pc调试助手发送少量的数据时(200个左右),没错误,但是发送超过400多个就会在后面部分出现乱码。但是如果把停止位改成两位,就收发正常了。我特意用示波器检查了我发送的波形,和pc下发来的波形,也是正确的。
后来分析cpld的发送时序
case(i)
4'd0://起始位
if(BPS_CLK)begin i<=i+1'b1; rTX <= 1'b0; end
4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8://数据位
if(BPS_CLK)begin i<=i+1'b1; rTX <= TX_Data; end
4'd9://校验
if(BPS_CLK)begin i<=i+1'b1; rTX <= 1'b1; end
4'd10://停止位
if(BPS_CLK)begin i<=i+1'b1; rTX <= 1'b1; end
4'd11:
if(BPS_CLK) begin i<=i+1'b1; isDone <= 1'b1; end
4'd12:
begin i<=4'd0; isDone <= 1'b0; end
endcase
我想在case11的时候不需要等待if(BPS_CLK)了,所有把这里改成了
4'd11:
begin i<=i+1'b1; isDone <= 1'b1; end
修改完后确实好了(可以发送大量数据了)。我的结论是这里的时序写的不严谨,导致发送时间长了导致的,但是黑金开发板的程序不应该犯这样的错误吧,又分析了下时序,确实时序是没问题的,收发都是9600的时钟产生的,那是什么问题了?
幸好调试的时候我有一个led灯,当fifo数据保存满的时候就把led点亮。再测试回到之前有问题的程序,果然发送较多的数据的时候,发现led亮了。原来是数据保存满了,rxpin的数据丢失了。所有才发送有故障的。
可是为什么会数据满了,难道是fifo的保存速度要快于读取速度?我现在只有这个结论了,不知道各位大神是否认可?
菜鸟分析,不对的地方希望指出。
附带工程文件
赶脚没那么头大,应该是程序部严谨导致的结果。 在在为这些事儿发愁呢,及时雨呀,非常感谢! 正学习呢,感谢。 11应该在时钟下降沿 {:smile:} 正学习,看看
页:
[1]