打印

用快时钟边沿触发的状态机,检测另一个边沿触发的慢信号

[复制链接]
2147|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mengyu20|  楼主 | 2012-5-9 09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用一个快时钟的边沿触发一个状态机,检测另一个慢信号的边沿来计数,比如计数到10的时候,状态机从1状态跳到2状态。像这样有两个沿触发的状态机写的思路是什么呢?谢谢各位指导哈

process(rst,bclk)
begin

if(rst='1')then

pr_state<=idle;

elsif(rising_edge(bclk))then

pr_state<=nx_state;

end if;
end process;

process(pr_state)
     case pr_state is

when idle=>
                   ***(*&*(&)&*)
               when one=>
                   if(rising_edge(信号A))then
                        nx_state<=two;
                   else
                       nx_state<=three;  
                when two=>
                 *(&&(0-

     end case;
end process;

这个程序是不能综合的,其中明显的错误   if(rising_edge(信号A))then 只是想解释一下我刚才的想法。对于只能通过判断 信号A 的边沿这种情况,在状态机里怎么处理?    如果有两个这样的边沿  (信号A, 信号B )。处理方法是不是相同的?

相关帖子

沙发
ji7423| | 2012-5-9 10:36 | 只看该作者
帮顶下。

使用特权

评论回复
板凳
GoldSunMonkey| | 2012-5-9 10:41 | 只看该作者
case
when
when
endcase
里面不能使用检测沿的语句。

不知道您的时钟速率差多少?
如果接近的话,那这个代码还是不好写。

使用特权

评论回复
地板
mengyu20|  楼主 | 2012-5-9 11:01 | 只看该作者
To 3L:
  我知道这个里面不能写边沿检测的语句,我是需要在状态机里等待 【信号A】的沿,然后进入下一个状态(由ONE——> TWO)。这个【信号A】的沿可以用另一process来写,那么就需要往状态机里传入一个 已获取了【信号A】边沿的标志 flag=‘1’;在flag=‘1’时我进入 TWO状态,这个时候我需要可以继续得到【信号A】边沿的标志 flag,也就是说在进入TWO状态后,我的flag应该清0,但是这就出现多重驱动的问题。

时钟速率差20倍左右。

使用特权

评论回复
5
GoldSunMonkey| | 2012-5-9 11:23 | 只看该作者
那你这个比较好解决。
如果设一个进程Process,
用高速时钟进行采样低速时钟。
设两个变量ab,
if rising_edge(Hclk)
   a=Lclk;
   b=a;
end if

然后判断条件里面,使用ab,
IF a=0 and b=1
就是上升沿
IF a=0 and b=1
就是下降沿。

如果害怕亚稳态,可以多打两拍。

使用特权

评论回复
6
bityoung| | 2012-5-9 17:11 | 只看该作者
猴哥真牛

使用特权

评论回复
7
GoldSunMonkey| | 2012-5-9 17:16 | 只看该作者
:lol

使用特权

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

本版积分规则

0

主题

17

帖子

0

粉丝