加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

FPGA状态机复位问题

(2015-05-18 10:17:14)
分类: FPGA

通常写状态机有一段式,两段式,三段式等写法,我比较喜欢两端式,但是在输出的时候加上同步输出来避免毛刺。状态机复位首先是对状态复位,但是否需要对状态的输出进行复位呢,以前以为不需要,因为对状态进行复位之后,状态输出不就立刻跟随状态进行转换相应输出了吗。事实上,并不都是这样,下面看一段代码:

process(rst_n,clk_50)
 variable cnt:natural:=0;
 begin
 if rst_n='0' then
       c_status<=s_idle;
       fifoin_wrreq<='0';                                                             -- 一开始没有
       fifoin_wrdata_r<=TO_UNSIGNED(0,64);                           -- 一开始没有
       fifoout_rdreq<='0';                                                            -- 一开始没有
 elsif rising_edge(clk_50) then
  case c_status is
  when s_idle    =>  -- if fifoin_wrfull='0' then
            if unsigned(fifoin_wrusedw)<=TO_UNSIGNED(100,8) then
             c_status<=s_wrfifoin;
            else
             c_status<=s_rdfifoout_wait;
            end if;
            fifoin_wrreq<='0';                                                             
            fifoin_wrdata_r<=TO_UNSIGNED(0,64);                          
            fifoout_rdreq<='0';                                            

 刚开始没有加这段代码的时候 输出总是有问题(见图1),复位之后第一个写给fifo的数总是不确定的,因为这个一段式状态机里面只对状态进行了复位,而没有对状态的输出进行复位,复位时rst_n一直为低电平,后面的状态转换就没有执行,所以输出并没有复位。

解决办法:

1、改成两段式或者三段式状态机,复位之后状态为s_idle状态,在另一个进程里面自然就会对输出进行复位。

2、在复位执行语句中加上对输出进行复位,如下代码即可。

解决后见图2

注:这张图看起来很别扭,是因为设计里面有多个时钟,采用主模块的时钟作为采样时钟,前端fifo缓冲和后端fifo缓冲的时钟较低导致的,不过不影响观察。     

       fifoin_wrreq<='0';                                                             -- 一开始没有
       fifoin_wrdata_r<=TO_UNSIGNED(0,64);                           -- 一开始没有
       fifoout_rdreq<='0';                                                            -- 一开始没有                   http://s12/mw690/001XeHfxzy6SmhlZjp92b&690
                                                       图1:复位调整前


http://s16/mw690/001XeHfxzy6SmgVjIBN4f&690
                                                  图2:复位调整后

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有