搜索
bottom↓
回复: 15
打印 上一主题 下一主题

FPGA 一块代码有的执行有的不执行?

[复制链接]

出25入0汤圆

跳转到指定楼层
1
发表于 2022-1-17 11:14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用 altera EP3C16F484C8 的芯片,发现断电后再上电会有一定几率有问题,没有问题的板子怎么断电重启都正常(测试上千次),有问题的板子出现的概率较多,刚开始以为板子问题,但是经过时序分析,发现异常时,在一段代码中 后面的执行了前面的语句不执行。



本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出25入0汤圆

2
 楼主| 发表于 2022-1-17 11:17:26 | 只看该作者
下面的是正常时的时序图

本帖子中包含更多资源

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

x

出0入442汤圆

3
发表于 2022-1-17 11:28:17 来自手机 | 只看该作者
正常。彻查你代码。注意以下点务必100%确保:

状态机跳转,或case跳转,或if跳转,或?:条件执行等,任何条件语句中,不得出现任何异步信号。否则很容易出现竞争冒险造成状态失效。你这种很大概率是上面的if没有用同步信号,造成随机的异常现象。

至于部分执行也很容易理解,短的路径跑到了,长的路径没有跑到。

出0入29汤圆

4
发表于 2022-1-17 11:52:04 | 只看该作者
FPGA和MCU是不一样的
写FPGA程序的时候,首先要想到是在设计逻辑电路,是在设计硬件电路,他们的时序要理解是同步的,不是你把代码写在第一行,就先运行第一个时序
还要充分了解FPGA内部的各个逻辑单元(门)的工作逻辑和开关断时间,所以同样的程序,下载到不同型号的FPGA里面运行,结果都有可能不一样,有时温度也会有影响的

出25入0汤圆

5
 楼主| 发表于 2022-1-17 16:16:22 | 只看该作者
wye11083 发表于 2022-1-17 11:28
正常。彻查你代码。注意以下点务必100%确保:

状态机跳转,或case跳转,或if跳转,或?:条件执行等,任何 ...

您好,非常感谢您的指导。您说的if没有用同步信号是指?
我之前使用的时CASE ,发现有问题,改成if 问题仍然存在。
这个是 case的代码
  1.        
  2. case in_data_state is
  3.        
  4.                 when 0 =>       
  5.                   if(switch_in_buf/= switch_in)then
  6.                       switch_in_buf <=switch_in;
  7.                   end if;               
  8.                          
  9.                  if(inst_in_buf/= inst_in)then
  10.                      inst_in_buf <=inst_in;
  11.                 end if;
  12.                                          
  13.                 if(inst_in_buf ='0')then
  14.                                     if(pulse_state_buf /=pulse_state) then     
  15.                                               in_data_state<= 1;
  16.                                               pulse_state  <=pulse_state_buf;
  17.                                               pulse_test_buf <= NOT pulse_test_buf;
  18.                                               number_save<=3;
  19.                                               data_save(3)<=Count_get;
  20.                                               send_time<=0;
  21.                                          else
  22.                                              in_data_state<=0;
  23.                                           end if;
  24.                 else   
  25.                                          if(pulse_state2_buf /=pulse_state2) then
  26.                                                    pulse_state2  <=pulse_state2_buf;
  27.                                                     in_data_state<= 1;
  28.                                                     number_save<=0;
  29.                                                     data_save(0)<=Count_get2(7 downto 0)&Count_get2(15 downto 8)&conv_std_logic_vector(1, 8)&save_in(7 downto 0);
  30.                                                     data_save(1)<=ad_in(7 downto 0)&ad_in(15 downto 8)& conv_std_logic_vector(2, 8)&save_in(7 downto 0);
  31.                                                     data_save(2)<=ad_in(23 downto 16)&ad_in(31 downto 24)& conv_std_logic_vector(3, 8)&save_in(7 downto 0);
  32.                                                     data_save(3)<=ad_in(39 downto 32)&ad_in(47 downto 40)& conv_std_logic_vector(4, 8)&save_in(7 downto 0);

  33.                                                     send_time<=0;
  34.                                             else
  35.                                                   in_data_state<=0;
  36.                                             end if;
  37.                                                  
  38.                                          end if;
  39.                                          
  40.            when 1 =>
  41.                          send_time<=send_time+1;  
  42.                          if(send_time =1) then
  43.                               if f1_fi_wrusedw>=conv_std_logic_vector(2**AW-128,AW) then
  44.                               f1_wr_hfullbuf        <= act_on;
  45.                          else
  46.                                f1_wr_hfullbuf        <= act_off;
  47.                          end if;
  48.                                                   
  49.                          if(send_time >=2) then  
  50.                                 if(inst_in_buf ='1') then
  51.                                      if(switch_in_buf ='1')then
  52.                                            f1_wr_hfullbuf2<=act_off;
  53.                                      else
  54.                                            f1_wr_hfullbuf2<=act_on;
  55.                                     end if;
  56.                                  else
  57.                                    f1_wr_hfullbuf2<=act_off;
  58.                                 end if;
  59.                                f1_wr_hfull<=f1_wr_hfullbuf or f1_wr_hfullbuf2;
  60.                                  send_time<=0;
  61.                                  wr_clock<='1';   
  62.                                  in_data_state<=in_data_state + 1;--
  63.                         end if;
  64.                                                        
  65.            when 2 =>
  66.                   send_time<=send_time+1;        
  67.                   f1_fi_wrreq        <= act_off;
  68.                   if(send_time >=1) then
  69.                              if DATA_DIR_IN='0' and f1_wr_hfull=act_off then        --DATA_DIR_IN->0->EXT TO USB
  70.                               f1_fi_wrreq        <= act_on;
  71.                               f1_fi_din         <= data_save(number_save);
  72.                            end if;
  73.                            number_save<=number_save+1;               
  74.                           in_data_state<=in_data_state + 1;--
  75.                           send_time<=0;
  76.                 end if;
  77.                 when 3 =>--
  78.                         send_time<=send_time+1;     
  79.                          if(send_time >=1) then
  80.                                 if(number_save <4)then
  81.                                         in_data_state<=1;
  82.                                 else
  83.                                         in_data_state<=0;
  84.                                 end if;       
  85.                      
  86.                                 send_time<=0;
  87.                                  wr_clock<='0';
  88.                                 fifo_test_buf<= NOT fifo_test_buf;
  89.                          end if;
  90.                 when others =>
  91.                         in_data_state <= 0;
  92.         end case;
复制代码



下面是目前用的if
  1.   
  2.     if(in_data_state = 0) then
  3.          
  4.             if(switch_in_buf/= switch_in)then
  5.               switch_in_buf <=switch_in;
  6.        end if;               
  7.                          
  8.             if(inst_in_buf/= inst_in)then
  9.               inst_in_buf <=inst_in;
  10.                  end if;
  11.                                          
  12.                 if(inst_in_buf ='0')then
  13.                         if(pulse_state_buf /=pulse_state) then     
  14.                                 in_data_state<=1;
  15.             pulse_state  <=pulse_state_buf;
  16.                                 pulse_test_buf <= NOT pulse_test_buf;
  17.                                 number_save<=3;
  18.                                 data_save(3)<=Count_get;
  19.                            send_time<=0;
  20.             end if;
  21.                   end if;
  22.                 if(inst_in_buf ='1')then         
  23.                                 if(pulse_state2_buf /=pulse_state2) then
  24.                                          in_data_state<=1;
  25.                 pulse_state2  <=pulse_state2_buf;
  26.                                          
  27.                                           --fifo_test_buf<= NOT fifo_test_buf;
  28.                                           number_save<=0;
  29.                                           data_save(0)<=Count_get2(7 downto 0)&Count_get2(15 downto 8)&conv_std_logic_vector(1, 8)&save_in(7 downto 0);
  30.                                           data_save(1)<=ad_in(7 downto 0)&ad_in(15 downto 8)& conv_std_logic_vector(2, 8)&save_in(7 downto 0);
  31.                                           data_save(2)<=ad_in(23 downto 16)&ad_in(31 downto 24)& conv_std_logic_vector(3, 8)&save_in(7 downto 0);
  32.                                           data_save(3)<=ad_in(39 downto 32)&ad_in(47 downto 40)& conv_std_logic_vector(4, 8)&save_in(7 downto 0);
  33.                                        
  34.                                      send_time<=0;
  35.            end if;         
  36.               end if;
  37.    elsif(in_data_state = 1)then
  38.                         send_time<=send_time+1;  
  39.                         if(send_time =1) then
  40.                                                 --  if f1_fi_wrusedw>=conv_std_logic_vector(2**AW-8,AW) then
  41.                           if f1_fi_wrusedw>=conv_std_logic_vector(2**AW-128,AW) then
  42.                         f1_wr_hfullbuf        <= act_on;
  43.                 else
  44.                         f1_wr_hfullbuf        <= act_off;
  45.                 end if;
  46.                          end if;          
  47.                          
  48.                    if(send_time >=2) then  
  49.                                 if(inst_in_buf ='1') then
  50.                                         if(switch_in_buf ='1')then
  51.                                                 f1_wr_hfullbuf2<=act_off;
  52.                                         else
  53.                                                 f1_wr_hfullbuf2<=act_on;
  54.                                          end if;
  55.                                  else
  56.                                         f1_wr_hfullbuf2<=act_off;
  57.                                  end if;
  58.                                                  
  59.                                  f1_wr_hfull<=f1_wr_hfullbuf or f1_wr_hfullbuf2;
  60.                                  send_time<=0;
  61.                        wr_clock<='1';   
  62.                                  in_data_state<=in_data_state + 1;
  63.             end if;
  64.    elsif(in_data_state = 2)then
  65.                   send_time<=send_time+1;        
  66.                   f1_fi_wrreq        <= act_off;
  67.                   if(send_time >=1) then
  68.                              if DATA_DIR_IN='0' and f1_wr_hfull=act_off then        --DATA_DIR_IN->0->EXT TO USB
  69.                            f1_fi_wrreq        <= act_on;
  70.                                      f1_fi_din         <= data_save(number_save);
  71.                   end if;
  72.                           number_save<=number_save+1;       
  73.                           in_data_state<=in_data_state + 1;
  74.                           send_time<=0;
  75.                         end if;
  76.    elsif(in_data_state = 3)then
  77.                    send_time<=send_time+1;     
  78.                          if(send_time >=1) then
  79.                                 if(number_save <4)then
  80.                                    in_data_state<= 1;
  81.                                 else
  82.                                            in_data_state<=0;
  83.                                 end if;       
  84.                                 send_time<=0;
  85.                                  wr_clock<='0';
  86.                                 fifo_test_buf<= NOT fifo_test_buf;
  87.                          end if;
  88.    else
  89.           in_data_state<=0;
  90.         end if;
复制代码



出25入0汤圆

6
 楼主| 发表于 2022-1-17 16:21:46 | 只看该作者
sunrn123 发表于 2022-1-17 11:52
FPGA和MCU是不一样的
写FPGA程序的时候,首先要想到是在设计逻辑电路,是在设计硬件电路,他们的时序要理解 ...

感谢您的回复,您说的不是顺序执行我理解,不像单片机或者电脑顺序一行行的执行,通过仿真发现是这条语句没有得到执行         我觉得应该是 wye11083 这位大侠说的问题。

出0入442汤圆

7
发表于 2022-1-17 17:19:40 来自手机 | 只看该作者
lixiaoxu186 发表于 2022-1-17 16:16
您好,非常感谢您的指导。您说的if没有用同步信号是指?
我之前使用的时CASE ,发现有问题,改成if 问题仍 ...

你仔细查你的代码。if()之类里面不能用到异步信号,这个要你自己查关联信号了。条件/分支等地方使用异步信号会导致状态丢失,我前面已经说的很清楚了。我不怎么用vhdl,所以你只能先自己仔细分析代码。

出25入0汤圆

8
 楼主| 发表于 2022-1-18 11:54:32 | 只看该作者
wye11083 发表于 2022-1-17 17:19
你仔细查你的代码。if()之类里面不能用到异步信号,这个要你自己查关联信号了。条件/分支等地方使用异 ...

嗯 好的 谢谢您

出615入1076汤圆

9
发表于 2022-1-18 11:57:59 来自手机 | 只看该作者
sdc 約束通過沒?還有代碼對齊是最基本的。

出25入0汤圆

10
 楼主| 发表于 2022-1-18 13:20:51 | 只看该作者
dukelec 发表于 2022-1-18 11:57
sdc 約束通過沒?還有代碼對齊是最基本的。

您好感谢您的答复。代码是没有对齐 ,没有做约束, ,学习的比较浅,也上网收了,建议做约束。我再学习研究下,怎么做下约束。

出0入91汤圆

11
发表于 2022-1-18 13:51:44 | 只看该作者
编程思路一定要从C 语言中 调整过来   

出0入4汤圆

12
发表于 2022-1-18 14:11:44 来自手机 | 只看该作者
看一下生存的原理图 是不是被优化了。

出0入4汤圆

13
发表于 2022-1-18 17:28:31 | 只看该作者
是不是没有复位语句.  所有信号都加复位, 不要省.
test bench文件写的详细些. 就算比源代码长好几倍也是值得的.

出0入115汤圆

14
发表于 2022-1-19 11:10:55 | 只看该作者
楼主的代码 if else 这么多,建议摒弃这么多

出0入4汤圆

15
发表于 2022-1-19 13:16:47 | 只看该作者
仿真时把关键信号也添加进去呀, 如 inst_in_buf , pulse_state_buf ...

出0入0汤圆

16
发表于 2023-10-16 20:41:28 | 只看该作者
代码太多了,建议把状态机跳转逻辑和输出逻辑分开写。而且连时序还是组合都看不出来,这别人没法回答你。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 14:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表