打印

调试中的几个问题

[复制链接]
1997|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
iampeter|  楼主 | 2011-7-10 09:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前期主要做算法,现在到了编程阶段,发现自己编程的水平还有待提高,程序

里面还有很多bug,下面说几个现象:

1.状态机赋值的问题
现象:
对于状态机赋值的问题一直都有疑问,比如信号a,我在状态s1中赋值1后,在

之后的状态中不处理,得到的结果就是a=1保持了一个周期;如果在接下来的s2

中继续赋值1,a会一直保持1不掉下来。
问题:
理论上一个信号给它赋值之后没有操作应该一直保持,假设它不会一直保持,

那为什么两个状态机连续赋值后,a会一直保持1不掉下来。

2.FPGA实现不一致的问题
现象:
我真不太愿意把我写的代码给大家看,不好意思了!
process(clk,reg_rbw,rst)
begin
if(rst='0')then
     cic_dec_rate <= "000000000000";
elsif rising_edge(clk)then
   case reg_rbw is
        when "0110" =>                                       
             cic_dec_rate <= "111110100000";                     
                  fir_sel <="01";
        when "0111" =>                                       
                 cic_dec_rate <= "011111010000";                  
                  fir_sel <= "00";
        when "1000" =>                                       
                 cic_dec_rate <= "000110010000";                  
                  fir_sel <= "01";
        when "1001" =>                                       
                 cic_dec_rate <= "000011001000";                  
                  fir_sel <="00";
        when "1010" =>                                       
                 cic_dec_rate <= "000000101000";               
                  fir_sel <= "01";
        when "1011"=>                                       
                  cic_dec_rate <= "000000010100";              
                  fir_sel <= "00";
        when others =>
                  cic_dec_rate <= "000000000000";
    end case;
end if;
end process;
基本都是对信号的赋值,综合过后分别使用两个不同的chipscope文件,调试时

cic_dec_rate信号出现了差异,一个各个信号赋值都很正常,一个在

cic_dec_rate信号的某一位出现了周期的跳变,比如cic_dec_rate(5)='1';结

果cic_dec_rate(5)变成了一个周期变化的信号,像时钟那样,结果是所有与

cic_dec_rate相关的信号都出现了这种周期性,导致结果错误。调试时经常会

发现这种问题,发现某个信号本来应该是固定值的,结果使用chipscope看都在

某一位变成了周期信号,导致结果周期的跳变。

相关帖子

沙发
anqier1| | 2011-7-10 13:38 | 只看该作者
我也不太清楚

使用特权

评论回复
板凳
anqier1| | 2011-7-10 13:38 | 只看该作者
帮你定下

使用特权

评论回复
地板
钻研的鱼| | 2011-7-10 15:10 | 只看该作者
process(clk,reg_rbw,rst)写法有问题,敏感变量只要有clk和rst就可以了
对fir_sel的赋值,注意在when others 是没有的,它会保存最后一次的值

使用特权

评论回复
5
dan_xb| | 2011-7-11 10:05 | 只看该作者
1. 状态机本来就是赋值以后保持不变的,不会说你等几个周期不管它,值就变化了

2. 对VHDL不熟,但是总觉得你写的有点怪,尽量不要用异步复位吧,你的敏感变量应该只有 rising_edge(clk) 才对
  还有,你的状态转移在哪里?

使用特权

评论回复
6
GoldSunMonkey| | 2011-7-11 10:45 | 只看该作者
1,状态机写的太差,尽量用同步的。when others应该让他跳到初始态。
2.敏感列表不正确,不应该有reg_rbw
3.解释问题没有其他变量辅助,我们无法分析。希望贴图:)

使用特权

评论回复
7
AutoESL| | 2011-7-11 15:25 | 只看该作者
第一个问题是不是因为阻塞赋值的原因? 所以只保持了一个周期?

使用特权

评论回复
8
AutoESL| | 2011-7-11 15:28 | 只看该作者
既然算法做好了,应该是C吧? 直接综合成RTL就可以了, 几分钟搞定.

使用特权

评论回复
9
GoldSunMonkey| | 2011-7-11 16:30 | 只看该作者
:L  这是VHDL,没有阻塞赋值~~;P

使用特权

评论回复
10
AutoESL| | 2011-7-11 17:01 | 只看该作者
那就是组合逻辑?

使用特权

评论回复
11
SuperX-man| | 2011-7-11 17:37 | 只看该作者
本帖最后由 SuperX-man 于 2011-7-11 17:41 编辑

这种情况,好像会发生在ISE无法识别出状态机的情况下发生.

不知道楼主的状态机写成什么样,如果ISE在综合的时候能识别出状态机的话,在综合报告中会有列出来.

LZ可以看看是否识别为状态机了.另外ISE中也提供状态机的范本写法.可以参考

使用特权

评论回复
12
GoldSunMonkey| | 2011-7-11 19:59 | 只看该作者
我就觉得他的代码不是状态机:)

使用特权

评论回复
13
GoldSunMonkey| | 2011-7-11 19:59 | 只看该作者
10# AutoESL 变得太快~;P

使用特权

评论回复
14
jayy| | 2011-7-11 21:25 | 只看该作者
:L

使用特权

评论回复
15
jayy| | 2011-7-11 21:25 | 只看该作者
确实有点快

使用特权

评论回复
16
GoldSunMonkey| | 2011-7-12 14:57 | 只看该作者
;P

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

138

帖子

1

粉丝