在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3903|回复: 6

大家来看看,关于FSM的一个问题!

[复制链接]
发表于 2006-9-13 00:10:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
  大家主要看看状态编码,功能不用管它!
  关于FSM中的状态编码one-hot,以前我是用写法一,以为这样就是one-hot了。后来看资料,发现资料上的是写法二,汗!
  可是我把写法一跟写法二拿到synplify8.2听综合后发现网表是一模一样的!!!这是怎么回事?大家发表一下自己的看法。
  第一种写法有些什么问题呢?是不是这样也是可以的?还是说这样不好,只不过,在这里syplify经过优化,使两种写法的结果一样了?
写法一:
  //3 always style
module ASM5(CLK, Rst_n, N, D, Dispense) ;
output Dispense ;
input  CLK ;
input  Rst_n ;
input  N ;
input  D ;

parameter Idle    = 4'b0001 ,
          State5  = 4'b0010 ,
          State10 = 4'b0100 ,
          State15 = 4'b1000 ;

reg Dispense ;
reg [3:0] cur_state, next_state ;

always @(posedge CLK or negedge Rst_n)
    if(!Rst_n)
        cur_state <= Idle ;
    else
        cur_state <= next_state ;
always @(cur_state or N or D)
begin
    case(cur_state)
        Idle:
            if(N)            
                next_state = State5 ;
            else if(D)
                next_state = State10 ;
            else
                next_state = Idle ;
        State5:
            if(N)
                next_state = State10 ;
            else if(D)
                next_state = State15 ;
            else
                next_state = State5 ;
        State10:
            if(N || D)
                next_state = State15 ;
            else
                next_state = State10 ;
        State15:
            next_state = Idle ;
        default:
            next_state = Idle ;
      endcase
   end

always @(posedge CLK or negedge Rst_n)
    if(!Rst_n)
        Dispense <= 1'b0 ;
    else if(cur_state == State15)
        Dispense <= 1'b1 ;
    else
        Dispense <= 1'b0 ;
endmodule
         
写法二:
  //3 always style
//state encoded by one-hot
module ASM4(CLK, Rst_n, N, D, Dispense) ;
output Dispense ;
input  CLK ;
input  Rst_n ;
input  N ;
input  D ;

parameter Idle    = 0 ,
          State5  = 1 ,
          State10 = 2 ,
          State15 = 3 ;

reg Dispense ;
reg [3:0] cur_state, next_state ;

always @(posedge CLK or negedge Rst_n)
    if(!Rst_n)
        cur_state <= 4'b0001 ;
    else
        cur_state <= next_state ;
always @(cur_state or N or D)
begin
    next_state = 4'b0 ;
    case(1'b1)
        cur_state[Idle]:
            if(N)            
                next_state[State5] = 1'b1 ;
            else if(D)
                next_state[State10] = 1'b1 ;
            else
                next_state[Idle] = 1'b1 ;
        cur_state[State5]:
            if(N)
                next_state[State10] = 1'b1 ;
            else if(D)
                next_state[State15] = 1'b1 ;
            else
                next_state[State5] = 1'b1 ;
        cur_state[State10]:
            if(N || D)
                next_state[State15] = 1'b1 ;
            else
                next_state[State10] = 1'b1 ;
        cur_state[State15]:
            next_state[Idle] = 1'b1 ;
        default:
            next_state[Idle] = 1'b1 ;
      endcase
   end

always @(posedge CLK or negedge Rst_n)
    if(!Rst_n)
        Dispense <= 1'b0 ;
    else if(cur_state[State15])
        Dispense <= 1'b1 ;
    else
        Dispense <= 1'b0 ;
endmodule
         
  

[ 本帖最后由 liyun022 于 2006-9-13 00:20 编辑 ]
发表于 2006-9-13 09:10:52 | 显示全部楼层
赫赫,看上去挺复杂的,
不过我觉得两种写法的思想是一样的,无非就是对state的single bit进行操作。
发表于 2006-9-13 14:03:33 | 显示全部楼层
意思是一样的!当综合结果有可能不一样,case(1)的综合结果与ifelse相同。我只在quartus上验证过。
发表于 2006-9-13 14:30:39 | 显示全部楼层
看看这篇论文 针对你的问题讲的很详细

有限状态机的Verilog设计与研究.pdf

247.65 KB, 下载次数: 40 , 下载积分: 资产 -2 信元, 下载支出 2 信元

有限状态机的Verilog设计与研究

发表于 2007-11-7 19:04:42 | 显示全部楼层
have a look
发表于 2016-8-10 16:02:12 | 显示全部楼层
thanks a lot
发表于 2016-8-11 01:23:53 | 显示全部楼层
回复 1# liyun022

两个是等价的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-5 16:26 , Processed in 0.041301 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表