ARM读写FPGA时,运行一会儿ARM程序就死掉了,什么原因?

[复制链接]
4045|20
 楼主| jlgcumt 发表于 2013-2-28 16:46 | 显示全部楼层 |阅读模式
  1. module RDC_AD_V20(clk,rst_n,ARM9200_WR,ARM9200_RD,ARM9200_nCS2,ARM9200_nCS6,ARM9200_DATA,ARM9200_ADDR,
  2.                   sw,mcu_sclk,mcu_miso,mcu_mosi,mcu_npcs1,ad_rst,ad_sclk,ad_miso_a,ad_busy,ad_cs_n,
  3.                                                 ad_convsta,da_rst,da_mosi,da_sclk,da_cs_n);

  4. // 信号说明
  5. input clk;
  6. input rst_n;

  7. input ARM9200_WR;
  8. input ARM9200_RD;
  9. input ARM9200_nCS2;
  10. input ARM9200_nCS6;
  11. inout [15:0] ARM9200_DATA;
  12. input [15:0] ARM9200_ADDR;
  13. input [1:0] sw;       

  14. input  mcu_sclk;
  15. output mcu_miso;
  16. input  mcu_mosi;
  17. input  mcu_npcs1;

  18. output ad_rst;
  19. output ad_sclk;
  20. input  ad_miso_a;
  21. //input  ad_miso_b;
  22. input  ad_busy;
  23. output ad_cs_n;
  24. output ad_convsta;

  25. output da_rst;
  26. //input  da_miso;
  27. output da_mosi;
  28. output da_sclk;
  29. output da_cs_n;

  30. parameter DEVID = 4'h3;

  31. /////////////////////////////////////////////////////////////////
  32. reg  ad_convsta_r;
  33. reg  ad_rst_r;
  34. reg  ad_cs_n_r;
  35. reg  da_cs_n_r;
  36. reg  da_rst_r;
  37. reg  ad_en_r;
  38. reg  da_en_r;

  39. wire WR_CPLD,RD_CPLD,RD_DEVID;
  40. reg  [15:0] RD_DATA;

  41. assign ad_sclk = mcu_sclk;
  42. assign da_sclk = mcu_sclk;

  43. assign mcu_miso = ad_miso_a;
  44. assign da_mosi = mcu_mosi;

  45. //assign WR_CPLD = ((ARM9200_WR | ARM9200_nCS2)) && (ARM9200_ADDR[11:10] == sw[1:0]);
  46. //assign RD_CPLD = (~(ARM9200_RD | ARM9200_nCS2)) && (ARM9200_ADDR[11:10] == sw[1:0]);
  47. //
  48. //assign RD_DEVID = (~(ARM9200_RD | ARM9200_nCS6)) && (ARM9200_ADDR[11:10] == sw[1:0]);

  49. assign WR_CPLD = ((ARM9200_WR | ARM9200_nCS2)) ;
  50. assign RD_CPLD = (~(ARM9200_RD | ARM9200_nCS2)) ;
  51. assign RD_DEVID = (~(ARM9200_RD | ARM9200_nCS6)) ;

  52. assign ARM9200_DATA[15:0] = RD_CPLD ?  RD_DATA[15:0] : 16'hzzzz;



  53. assign ad_rst = ad_rst_r;
  54. assign ad_convsta = ad_convsta_r;
  55. //assign ad_cs_n = ad_en_r ? ad_cs_n_r : 1'b1;
  56. assign ad_cs_n = mcu_npcs1;

  57. assign da_cs_n = da_en_r ? da_cs_n_r : 1'b1;
  58. assign da_rst =  da_rst_r;


  59. // MCU读取数据
  60. always @(posedge clk or negedge rst_n)
  61. begin
  62.         if(!rst_n)
  63.                 RD_DATA[15:0] <= 16'hzzzz;
  64.         else
  65.                 begin
  66.                         if(RD_CPLD)
  67.                                 begin
  68.                                         if({ARM9200_ADDR[15:12],ARM9200_ADDR[7:0]} == 12'b101000000000)
  69.                                                 RD_DATA[15:0] <= {15'h0,ad_busy};                               
  70.                                 end
  71.                         else if(RD_DEVID)
  72.                                 begin
  73.                                         if({ARM9200_ADDR[15:12],ARM9200_ADDR[7:0]} == 12'b111100000000)
  74.                                                 begin
  75.                                                         RD_DATA[15:0] <= {12'h000,DEVID};
  76.                                                 end
  77.                                         else
  78.                                                 RD_DATA[15:0] <= 16'hzzzz;       
  79.                                 end
  80.                         else
  81.                                 RD_DATA[15:0] <= 16'hzzzz;               
  82.                 end
  83. end


  84. //MCU写数据
  85. always@( posedge WR_CPLD or negedge rst_n)
  86. begin
  87.         if(!rst_n)
  88.                 begin
  89.                         ad_rst_r <= 0;
  90.                         ad_convsta_r <= 1;

  91.                         ad_rst_r <= 0;
  92.                         ad_cs_n_r <= 0;
  93.                         da_cs_n_r <= 0;
  94.                         da_rst_r <= 1;
  95.                        
  96.                         ad_en_r <= 0;
  97.                         da_en_r <= 0;
  98.                 end       
  99.         else
  100.                 begin                                       
  101.                         case({ARM9200_ADDR[15:12],ARM9200_ADDR[7:0]})
  102. //AD部分                                  
  103.                                    //转换输出                          
  104.                                         12'b101100010000:        ad_convsta_r <= ARM9200_DATA[0];
  105. //                                   //片选
  106. //                                   12'b101100100000: ad_cs_n_r <= ARM9200_DATA[0];       
  107.                                         //复位
  108.                                         12'h101100110000: ad_rst_r <= ARM9200_DATA[0];       
  109. //DA部分
  110.                                         // 片选
  111.                                         12'b101101000000: da_cs_n_r <= ARM9200_DATA[0];
  112.                                         //复位
  113.                                         12'b101101010000: da_rst_r <= ARM9200_DATA[0];
  114.                                        
  115. //                                        // AD使能
  116. //                                        12'b101101100000: ad_en_r <= ARM9200_DATA[0];
  117.                                         // DA使能
  118.                                         12'b101101110000: da_en_r <= ARM9200_DATA[0];
  119.                                        
  120. //                                        default:                ;                       
  121.                                         endcase                       
  122.                                                        
  123.                 end
  124. end
  125.                                                   
  126.                                                   
  127. endmodule
 楼主| jlgcumt 发表于 2013-2-28 16:48 | 显示全部楼层
上面是FPGA代码,ARM是AT91RM9200,大伙谁碰到过这样的情况!,在读写FPGA的时候,ARM程序老是死掉(ARM的程序运行在外部的SDRAM里面)。
 楼主| jlgcumt 发表于 2013-2-28 21:24 | 显示全部楼层
问题的原因貌似已经找到,结贴了!
1003704680 发表于 2013-2-28 22:14 | 显示全部楼层
什么原因?是应该是arm的吧?
 楼主| jlgcumt 发表于 2013-2-28 22:41 | 显示全部楼层
FPGA的原因,ARM自己怎么可能把程序跑死掉呢,除非是跑飞了!
jlass 发表于 2013-3-1 10:00 | 显示全部楼层
FPGA把ARM搞死了

我来接点分
 楼主| jlgcumt 发表于 2013-3-1 11:57 | 显示全部楼层
本帖最后由 jlgcumt 于 2013-3-1 14:38 编辑

今天测试发现还是有问题,就是连续操作FPGA的时候就会死掉,如果操作一次,延时一段时间,再进行操作的时候暂时还没发现问题,(可能还有死的情况!),哎,快疯了!
jlass 发表于 2013-3-1 15:44 | 显示全部楼层
写的太快把FPGA的数据写坏了?

可以试试写完成后读一下标志位,确认操作成功了。
蓝色风暴@FPGA 发表于 2013-3-1 15:56 | 显示全部楼层
只要外部坏境正常,FPGA怎么可能死掉?
 楼主| jlgcumt 发表于 2013-3-1 17:59 | 显示全部楼层
貌似是ARM自己的问题,今天换了一块核心板,还没发现死机的问题,初步估计是ARM片子本身的问题或者是外挂Flash影响的,结贴散分了,可惜不能给自己分数:'(!
GoldSunMonkey 发表于 2013-3-4 16:16 | 显示全部楼层
jlgcumt 发表于 2013-3-1 17:59
貌似是ARM自己的问题,今天换了一块核心板,还没发现死机的问题,初步估计是ARM片子本身的问题或者是外挂Fl ...

我没赶上啊
GoldSunMonkey 发表于 2013-3-4 16:16 | 显示全部楼层
shang651 发表于 2013-3-4 17:08 | 显示全部楼层
GoldSunMonkey 发表于 2013-3-4 16:16

猴哥,别哭啊
qin552011373 发表于 2013-3-4 23:22 | 显示全部楼层
解决了么
GoldSunMonkey 发表于 2013-3-5 22:46 | 显示全部楼层
qin552011373 发表于 2013-3-4 23:22
解决了么

看看便知

评分

参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!

查看全部评分

FangTT 发表于 2013-3-6 22:58 | 显示全部楼层
GoldSunMonkey 发表于 2013-3-5 22:46
看看便知

哦,mark
GoldSunMonkey 发表于 2013-3-6 23:14 | 显示全部楼层
FangTT 发表于 2013-3-6 22:58
哦,mark

欢迎常来
 楼主| jlgcumt 发表于 2013-3-10 10:36 | 显示全部楼层
qin552011373 发表于 2013-3-4 23:22
解决了么

呵呵,解决了,有几块核心板上的电源的10uF的电容没焊,焊上就好了,哎,刚开始压根就没考虑到这,以为没啥事,结果找了一个礼拜才想试试焊上!
steven0419 发表于 2013-5-17 11:46 | 显示全部楼层
一般情况下能折腾超过3天以上的问题都是都是小错误,
steven0419 发表于 2013-5-17 11:46 | 显示全部楼层
一般情况折腾超过3天以上的问题都是都是小错误!哈哈!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:善攻者,动于九天之上,善守者,藏于九地之下!

183

主题

733

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部