您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

【数字IC验证快速入门】9、Verilog RTL设计必会的有限状态机

导读:作者有幸在中国电子信息领域的排头兵院校“电子科技大学”攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思清华紫光联发科技等业界顶尖集成电路相关企业面授课程,对数字IC验证有了一些知识积累和学习心得。为帮助想入门前端IC验证的朋友,思忱一二后,特开此专栏,以期花最短的时间,走最少的弯路,学最多的IC验证技术知识。

文章目录

  • 一、自动售饮料机
    • 1.1、问题描述
    • 1.2、功能框图和接口定义
    • 1.3、状态转换图 - moore FSM
    • 1.4、状态转换图 - Mealy FSM
    • 1.5、
  • 参考

一、自动售饮料机

1.1、问题描述

设计一个自动售饮料机,设饮料售价2.5元,可使用5角和1元硬币,具有找零功能。

注:同一时刻只能投1元或者5角,不能两个同时投。

在这里插入图片描述

1.2、功能框图和接口定义

在这里插入图片描述

接口信号定义

  • clk:时钟输入
  • reset:系统复位信号
  • half:投入5角硬币
  • one:投入1元硬币
  • cout:找零信号
  • out:机器售出饮料

1.3、状态转换图 - moore FSM

:Moore FSM 特点:输出只与当前的状态有关系,与输入没有关系!

Moore FSM 的 RTL代码

module drink_status_moore(
    input   wire    clk,
    input   wire    reset,
    input   wire    half,
    input   wire    one,
    
    output  wire    out,
    output  wire    cout
);

parameter [2:0] S0 = 3'b000,
                S1 = 3'b001,            
                S2 = 3'b010,     
                S3 = 3'b011,     
                S4 = 3'b100,     
                S5 = 3'b101,     
                S6 = 3'b110,     

reg [2:0]   curr_state;
reg [2:0]   next_state;

//first segment:state transfer
always@(posedge clk , negedge reset) begin
    if(!reset)
        curr_state <= 50;
    else
        curr_state <= #1 next_state;
end

//second segment:transfer condition
always@(curr_state, half, one) begin
    case(curr_state)
        S0:begin
            if(half)        next_state = S1;
            else if(one)    next_state = S2;
            else            next_state = S0;
        end
        
        S1:begin
            if(half)        next_state = S2;
            else if(one)    next_state = S3;
            else            next_state = S1;
        end
        
        S2:begin
            if(half)        next_state = S3;
            else if(one)    next_state = S4;
            else            next_state = S2;
        end
        
        S3:begin
            if(half)        next_state = S4;
            else if(one)    next_state = S5;
            else            next_state = S3;
        end
        
        S4:begin
            if(half)        next_state = S5;
            else if(one)    next_state = S6;
            else            next_state = S4;
        end
        
        S5:begin
                            next_state = S0;
        end
        
        S6:begin
                            next_state = S0;
        end
        
        default:            next_state = S0;
    endcase
end


//third segment:state output
//moore type FSM
assign out = ((curr_state == S5) || (curr_state == S6)) ? 1 : 0;
assign cout = (curr_state == S6) ? 1 : 0;

endmodule

FSM 三段式写法:

  • 良好的编码风格
  • 逻辑综合
  • 可阅读星

1.4、状态转换图 - Mealy FSM

:Mealy FSM 特点:输出不仅与当前的状态有关系,与输入也有关系!

在这里插入图片描述

  • Mealy 只用了5种状态,但是输出控制会变复杂!

Mealy FSM 的 RTL代码

module drink_status_mealy(
    input   wire    clk,
    input   wire    reset,
    input   wire    half,
    input   wire    one,
    
    output  wire    out,
    output  wire    cout
);

parameter [2:0] S0 = 3'b000,
                S1 = 3'b001,            
                S2 = 3'b010,     
                S3 = 3'b011,     
                S4 = 3'b100,     
                S5 = 3'b101,     
                S6 = 3'b110,     

reg [2:0]   curr_state;
reg [2:0]   next_state;

//first segment:state transfer
always@(posedge clk , negedge reset) begin
    if(!reset)
        curr_state <= 50;
    else
        curr_state <= #1 next_state;
end

//second segment:transfer condition
always@(curr_state, half, one) begin
    case(curr_state)
        S0:begin
            if(half)        next_state = S1;
            else if(one)    next_state = S2;
            else            next_state = S0;
        end
        
        S1:begin
            if(half)        next_state = S2;
            else if(one)    next_state = S3;
            else            next_state = S1;
        end
        
        S2:begin
            if(half)        next_state = S3;
            else if(one)    next_state = S4;
            else            next_state = S2;
        end
        
        S3:begin
            if(half)        next_state = S4;
            else if(one)    next_state = S0;
            else            next_state = S3;
        end
        
        S4:begin
            if(half)        next_state = S0;
            else if(one)    next_state = S0;
            else            next_state = S4;
        end

        default:            next_state = S0;
    endcase
end


//third segment:state output
//mealy type FSM
assign out  = ((curr_state == S4) & (half | one)) ? 1 : 
              ((curr_state == S3) & (one)) ? 1 : 0;
assign cout = ((curr_state == S4) & (one)) ? 1 : 0;

endmodule

1.5、

  • FSM有限状态机的设计步骤
    • 接口定义
    • 状态定义和编码
    • 状态的转换图
    • 按照三段式编码风格实现RTL代码
  • 编写TestBench代码
  • 使用Questasim进行编译和仿真
  • 通过波形工具查看输入激励、状态信号和输出信号

常见面试题:有限状态机分类?

  • :Moore 型状态机:状态机的输出只与当前的状态有关
  • Mealy 型状态机:状态机的输出不仅与当前的状态有关,还与当前的输入有关

常见面试题:两种状态机区别?

  • :1、Moore状态机:在时钟脉冲的有限个门延时后,输出达到稳定。输出会在一个完整的时钟周期内保持稳定值,即使在该时钟内输入信号变化了,输出信号也不会变化。输入对输出的影响要到下一个时钟周期才能反映出来。把输入和输出分开,是Moore状态机的重要特征。
  • 2、Melay状态机:由于输出直接受到输入影响,而输入可以在时钟周期的任意时刻变化,这就使得输出状态比Moore状态的输出状态提前一个周期到达。输入信号的噪声可能会出现在输出信号上。
  • 3、对同一个电路,使用Moore状态机设计可能要比使用Mealy状态机多出一些状态。

参考

  • 《野火征途 Altera EP4CE10 - 状态机》

分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进