微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > RS232读数据之后写到RAM中的地址生成器不稳定

RS232读数据之后写到RAM中的地址生成器不稳定

时间:10-02 整理:3721RD 点击:
PC通过RS232发数据到FPGA,FPGA中的Rx模块将收到的数据写到RAM中,读到一定数目的数据后,就给Tx模块一个使能信号,Tx模块从RAM中读取同样数目的数据之后发给PC。
上板之后有时能从PC收到数据,有时就收不到。于是我把RAM对应的地址生成器的地址信号引到外设LED灯上面去,发现地址有时候就不会加到固定的数目去,确定是地址生成器的问题。(大概50%成功,50%失败)
但是这个地址生成器超级简单,我都不知道出错在哪里。后仿也是通过了的~囧。

后来我把RAM取消掉,收一个字节发一个字节,上板就是成功的。
还求大神们有没有遇到类似的问题呀?

数据溢出



    哇小编你好!
你说的数据溢出是指地址溢出?还是?
我在调试的时候发的数据量就小于RAM的深度的,RS232的输入也是用寄存器同步了的~确实找不到问题出在哪了。

地址生成器是什么东西,用一个寄存器累加不行吗?



    地址生成器就是一个计数器模块,只不过里面多了一些if-else分支,带if-else分支结构的只要时钟不太快都没有问题吧?
    我的时钟是50MHz的,232串口速率57600

没碰到过这样的问题,你可以发代码上来让大家看看的,应该没几行的吧,不过你仿真也通过了,肯定不是代码问题了。



  1. always @ ( posedge Clk, negedge Rst_n ) begin
  2. if ( !Rst_n ) Info_Wr_Addr <= 13’d0; // Info_Wr_Addr表示RAM的写地址
  3. else if ( Bit_Cnt == 10 ) begin // 串口采用的1位起始位,8位数据位,1位停止位,共10位
  4. if ( First_Byte ) Info_Wr_Addr <= 13’d0; // First_Byte表示串口收到的第一个字节的标志信号,以便确定下一行的Info_Len,这个和通信协议有关,不必过多关注
  5. else if ( Info_Wr_Addr == Info_Len ) Info_Wr_Addr <= Info_Wr_Addr; // 如果地址加到Info_Len之后,就不再加了
  6. else Info_Wr_Addr <= Info_Wr_Addr + 1'b1; // 上面条件都不满足之后,地址才加1
  7. end
  8. else Info_Wr_Addr <= Info_Wr_Addr; // Bit_Cnt不等于10,即串口还没收到1个字节的数据时,地址保持不变
  9. end

复制代码


这个计数器已经这么简单了~我估计可能是控制这个计数器的控制信号的问题,比如Bit_Cnt、First_Byte、Info_Len之类的,但我检查这几个信号也没有问题呀~囧~



    额,自己再查吧。问一下,你已经确定问题是在写ram上吗?另外,我查了下rs232的标准速率没有57600的,(百度的,手头没有串口助手,不知道能不能配置成这个速率)。



    我确定问题一定出在写RAM上,有2个根据:
1.因为我把地址信号线直接接到外设的LED上的,每次出错的时候观察LED就发现其没加到指定的值。
2.当我把RAM去掉,收取一个字节发一个字节的话,就100%成功。
RS232标准有57600的,我确定。
虽然问题还没解决,但还是谢谢你哈!

这个问题终于解决了,原因是我想当然地认为MATLAB发送给FPGA的一帧数据是连续的(即字节与字节之间是连续的),即具有实时性,而在FPGA中也是以这种实时性为前提进行设计的,具体原因请参见我的博客http://blog.sina.com.cn/s/blog_6b597bfb0100ys5z.html(当然不是打广告哈,只是懒得描述了)。

看了blog,囧。
你的通讯协议规定了First_Byte,那也应该规定一个Last_Byte,或者载荷长度字段啊。



    呵呵,见笑了,通信协议里面规定了字段长度的,只是我认为MATLAB发数据的时候刚好发的是那么多,所以在FPGA设计中就没有好好利用这个协议,所以才出现了我之前描述的不稳定的情况。学习了。



    没有笑话的意思,呵呵。
实际上串口在面对操作系统的时候,经常会碰到这种问题。
接收数据时,数据间间隔会很久。
发送数据时,上位机可能来不及读缓存而导致溢出,丢失数据;也可能把两个包的数据都收到缓存里,区分不开。
所以单纯使用时间间隔,或者超时来判断数据的起始会有困难。
要定义包格式,甚至使用流控。



    哦,我还以为只有上位机发数据是非实时性的呢。原来读数据也有可能是非实时性的呀。
这让我想起之前的一个串口软件,叫串口猎人,在21ic下载的。当时用这个软件连续接收超过1MB的数据也没有出现错误。看来设计这种软件也是相当考验功底的呀,说不定也用了你提到的流控制等一系列保证稳定性的协议呢。

小编,我最近也在做这个,能否留下联系方式,一起学习..
我的UART接收部分有一些地方不懂,还得请教



    给你站内信了哈,大家可以一起学习

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top