在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4668|回复: 15

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

[复制链接]
发表于 2012-3-11 16:46:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
PC通过RS232发数据到FPGA,FPGA中的Rx模块将收到的数据写到RAM中,读到一定数目的数据后,就给Tx模块一个使能信号,Tx模块从RAM中读取同样数目的数据之后发给PC。

上板之后有时能从PC收到数据,有时就收不到。于是我把RAM对应的地址生成器的地址信号引到外设LED灯上面去,发现地址有时候就不会加到固定的数目去,确定是地址生成器的问题。(大概50%成功,50%失败)

但是这个地址生成器超级简单,我都不知道出错在哪里。后仿也是通过了的~囧。


后来我把RAM取消掉,收一个字节发一个字节,上板就是成功的。

还求大神们有没有遇到类似的问题呀??
发表于 2012-3-11 20:27:43 | 显示全部楼层
数据溢出
 楼主| 发表于 2012-3-12 11:04:50 | 显示全部楼层
回复 2# solarwafer


    哇版主你好!

你说的数据溢出是指地址溢出??还是???

我在调试的时候发的数据量就小于RAM的深度的,RS232的输入也是用寄存器同步了的~确实找不到问题出在哪了。
发表于 2012-3-12 12:28:19 | 显示全部楼层
地址生成器是什么东西,用一个寄存器累加不行吗?
 楼主| 发表于 2012-3-12 13:42:05 | 显示全部楼层
本帖最后由 larlyii 于 2012-3-12 13:43 编辑

回复 4# youngwager


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

    我的时钟是50MHz的,232串口速率57600
发表于 2012-3-12 15:24:00 | 显示全部楼层
没碰到过这样的问题,你可以发代码上来让大家看看的,应该没几行的吧,不过你仿真也通过了,肯定不是代码问题了。。。
 楼主| 发表于 2012-3-13 10:40:53 | 显示全部楼层
回复 6# youngwager






  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之类的,但我检查这几个信号也没有问题呀~囧~
发表于 2012-3-13 16:40:14 | 显示全部楼层
回复 7# larlyii


    额,自己再查吧。。。问一下,你已经确定问题是在写ram上吗?另外,我查了下rs232的标准速率没有57600的,(百度的,手头没有串口助手,不知道能不能配置成这个速率)。
 楼主| 发表于 2012-3-13 20:08:11 | 显示全部楼层
回复 8# youngwager


    我确定问题一定出在写RAM上,有2个根据:

1.因为我把地址信号线直接接到外设的LED上的,每次出错的时候观察LED就发现其没加到指定的值。
2.当我把RAM去掉,收取一个字节发一个字节的话,就100%成功。

RS232标准有57600的,我确定。

虽然问题还没解决,但还是谢谢你哈!
 楼主| 发表于 2012-4-5 18:26:26 | 显示全部楼层
这个问题终于解决了,原因是我想当然地认为MATLAB发送给FPGA的一帧数据是连续的(即字节与字节之间是连续的),即具有实时性,而在FPGA中也是以这种实时性为前提进行设计的,具体原因请参见我的博客http://blog.sina.com.cn/s/blog_6b597bfb0100ys5z.html(当然不是打广告哈,只是懒得描述了)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-8 20:53 , Processed in 0.047395 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表