欢迎来到彩壳资讯
彩壳资讯
当前位置:彩壳资讯 > 数码

一级、二级、三级状态机的区别

日期:2023-10-02 14:11

本文介绍了一级、二级、三级状态机的区别

1. 状态机

再给出状态机的示意图:

1.1. Moore型,输出只与状态寄存器

的输出状态有关

1.2.米粒类型。输出不仅与状态寄存器的输出状态有关,还与组合逻辑的输入有关

2.一级、二级、三级的区别

根据状态机的结构,状态机描述方法可分为:一级、二级、三级

1.1.一级配方

整个状态机被写入always模块中。在此模块中,描述了状态转换以及状态输入和输出。

1.2.两级式

使用两个always模块来描述状态机。

1.2.1.其中always模块使用同步时序来描述状态转换;

1.2.2.另一个always模块使用组合逻辑来确定状态转换条件,描述状态转换规则及其输出。请注意,组合逻辑输出必须使用阻塞分配。

1.3.三段式

基于两种always模块描述方法,使用了三个always模块。

1.3.1.一个always模块使用同步时序来描述状态转换;

1.3.2. An总是使用组合逻辑来确定状态转移条件并描述状态转移规则。注意组合逻辑输出必须使用阻塞赋值;

1.3.3.另一个always模块描述状态输出(可以通过组合电路或时序电路输出)。请注意,组合逻辑输出必须使用阻塞分配。

1.4.全面

可见,两级有限状态机与一级有限状态机的区别在于将顺序部分(状态转移)和组合部分(判断状态转移条件并产生输出)分开,写为两个always语句,即两个段落。有限状态机。如果将组合部分的判断状态转移条件和产生的输出分开写,那就是一个三级有限状态机。

3. 自动售货机,一级式

模块自动销售(
    输入时钟,
    输入rst_n,
    输入coin_one,
    输入coin_half,
     
    输出调节水,
    输出 reg coin_back
);
 
    参数内存零 = 3'b000;
    参数HALF = 3'b001;
    参数 ONE = 3'b010;
    参数 ONE_HALF = 3'b011;
    参数二 = 3'b100;
     
    //单级状态机
    reg[2:0]状态;
     
    总是@(posege clk,negedge rst_n)开始
        如果(!rst_n)
            开始
                状态<=零;
                水 <= 0;
                coin_back <= 0;
            结尾
        别的
            案例(状态)
                零 :
                        开始
                            水 <= 0;coin_back <= 0;
                            如果(硬币_一半)
                                状态 <= 一半;
                            否则如果(coin_one)
                                状态 <= 1;
                            别的
                                状态 <= 状态;
                        结尾
                一半 :
                        开始
                            水 <= 0;
                            coin_back <= 0;
                            如果(硬币_一半)
                                状态 <= 1;
                            否则如果(coin_one)
                                状态 <= ONE_HALF;
                            别的
                                状态 <= 状态;
                        结尾
                一 :
                        开始
                            水 <= 0;
                            coin_back <= 0;如果(硬币_一半)
                                状态 <= ONE_HALF;
                            否则如果(coin_one)
                                状态 <= 2;
                            别的
                                状态 <= 状态;
                        结尾
                一半 :
                            开始
                                如果(硬币_一半)
                                    开始
                                        状态 <= 2;
                                        水 <= 1'b0;
                                        coin_back <= 1'b0;
                                    结尾
                                否则如果(coin_one)
                                    开始
                                        状态<=零;
                                        水 <= 1'b1;
                                        coin_back <= 1'b0;结尾
                                别的
                                    开始
                                        状态 <= 状态;
                                        水 <= 1'b0;
                                        coin_back <= 1'b0;
                                    结尾
                            结尾
                二 :
                        开始
                            如果(硬币_一半)
                                    开始
                                        状态<=零;
                                        水 <= 1'b1;
                                        coin_back <= 1'b0;
                                    结尾
                            否则如果(coin_one)
                                    开始
                                        状态<=零;水 <= 1'b1;
                                        coin_back <= 1'b1;
                                    结尾
                            别的
                                    开始
                                        状态 <= 状态;
                                        水 <= 1'b0;
                                        coin_back <= 1'b0;
                                    结尾
                        结尾
                默认:
                            开始
                                状态<=零;
                                水 <= 1'b0;
                                coin_back <= 1'b0;
                            结尾
            端壳
    结尾
 
终端模块

4. 自动售货机,两段式

1.1.两阶段公式,写为

模块自动销售(
    输入时钟,输入rst_n,
    输入coin_one,
    输入coin_half,
     
    输出调节水,
    输出reg coin_back
);
 
    参数零=3'b000;
    参数HALF = 3'b001;
    参数 ONE = 3'b010;
    参数 ONE_HALF = 3'b011;
    参数二 = 3'b100;
 
//--------------------两阶段公式1 ok------------------------ - ---
    //两级状态机
    reg [2:0] c_status;
    reg [2:0] n_status;
     
    //状态转移
    总是@(posege clk,negedge rst_n)开始
        如果(!rst_n)
            c_status <= 0;
        别的
            c_status <= n_status;
    结尾
     
    //描述状态转换规则和输出
    总是@(posege clk,negedge rst_n)开始
        如果(!rst_n)
            开始
                n_status <= 0;
                水 <= 1'b0;
                coin_back <= 1'b0;
            结尾
        别的
            案例(c_status)
                零 :
                        开始水 <= 1'b0;
                            coin_back <= 1'b0;
                            如果(硬币_一半)
                                n_status <= 一半;
                            否则如果(coin_one)
                                n_status <= 1;
                            别的
                                n_status <= 0;
                        结尾
                一半 :
                        开始
                            水 <= 1'b0;
                            coin_back <= 1'b0;
                            如果(硬币_一半)
                                n_status <= 1;
                            否则如果(coin_one)
                                n_status <= ONE_HALF;
                            别的
                                n_status <= 一半;
                        结尾
                一 :
                        开始水 <= 1'b0;
                            coin_back <= 1'b0;
                            如果(硬币_一半)
                                n_status <= ONE_HALF;
                            否则如果(coin_one)
                                n_status <= 2;
                            别的
                                n_status <= 1;
                        结尾
                一半 :
                            开始
                                水 <= 1'b0;
                                coin_back <= 1'b0;
                                如果(硬币_一半)
                                        n_status <= 2;
                                否则如果(coin_one)
                                    开始
                                        n_status <= 0;
                                        水 <= 1'b1;coin_back <= 1'b0;
                                    结尾
                                别的
                                        n_status <= ONE_HALF;
                            结尾
                二 :
                        开始
                            水 <= 1'b0;
                            coin_back <= 1'b0;
                            如果(硬币_一半)
                                开始
                                    n_status <= 0;
                                    水 <= 1'b1;
                                    coin_back <= 1'b0;
                                结尾
                            否则如果(coin_one)
                                开始
                                    n_status <= 0;
                                    水 <= 1'b1;coin_back <= 1'b1;
                                结尾
                            别的
                                n_status <= 2;
                        结尾
                默认:
                            n_status <= 0;
            最终情况
    结尾
     
 
终端模块

1.2、两步式、Shaho 2

模块自动销售(
    输入时钟,
    输入rst_n,
    输入coin_one,
    输入coin_half,
     
    输出调节水,
    输出reg coin_back
);
 
    参数零=3'b000;
    参数HALF = 3'b001;
    参数 ONE = 3'b010;
    参数 ONE_HALF = 3'b011;
    参数二 = 3'b100;
 
//---------------------两阶段 2 ok--------------------- -----------------
 
    //两层机器
    reg[2:0]状态;//状态转移
    总是@(posege clk,negedge rst_n)开始
        如果(!rst_n)
            状态<=零;
        别的
            开始
                案例(状态)
                    零 :
                            开始
                                如果(硬币_一半)
                                    状态 <= 一半;
                                否则如果(coin_one)
                                    状态 <= 1;
                                别的
                                    状态<=零;
                            结尾
                    一半 :
                            开始
                                如果(硬币_一半)
                                    状态 <= 1;
                                否则如果(coin_one)
                                    状态 <= ONE_HALF;
                                别的
                                    状态 <= 一半;结尾
                    一 :
                            开始
                                如果(硬币_一半)
                                    状态 <= ONE_HALF;
                                否则如果(coin_one)
                                    状态 <= 2;
                                别的
                                    状态 <= 1;
                            结尾
                    一半 :
                                开始
                                    如果(硬币_一半)
                                            状态 <= 2;
                                    否则如果(coin_one)
                                        开始
                                            状态<=零;
                                        结尾
                                    别的状态 <= ONE_HALF;
                                结尾
                    二 :
                            开始
                                如果(硬币_一半)
                                    开始
                                        状态<=零;
                                    结尾
                                否则如果(coin_one)
                                    开始
                                        状态<=零;
                                    结尾
                                别的
                                    状态 <= 2;
                            结尾
                    默认:
                                状态<=零;
                端壳
            结尾
    结尾//输出逻辑
    总是@(posege clk,negedge rst_n)开始
        如果(!rst_n)
            开始
                水 <= 1'b1;
                coin_back <= 1'b0;
            结尾
        别的
            案例(状态)
                一半:
                            开始
                                如果(硬币_一)
                                    开始
                                        水 <= 1'b1;
                                        coin_back <= 1'b0;
                                    结尾
                                别的
                                    开始
                                        水 <= 1'b0;
                                        coin_back <= 1'b0;
                                    结尾
                            结尾
                二:
                            开始
                                如果(硬币_一半)
                                    开始水 <= 1'b1;
                                        coin_back <= 1'b0;
                                    结尾
                                否则如果(coin_one)
                                    开始
                                        水 <= 1'b1;
                                        coin_back <= 1'b1;
                                    结尾
                                别的
                                    开始
                                        水 <= 1'b0;
                                        coin_back <= 1'b0;
                                    结尾
                            结尾
                默认:
                            开始
                                水 <= 1'b0;
                                coin_back <= 1'b0;
                            结尾端壳
    结尾
 
终端模块

5. 自动售货机,三段式

模块自动销售(
    输入时钟,
    输入rst_n,
    输入coin_one,
    输入coin_half,
     
    输出调节水,
    输出reg coin_back
);
 
    参数零=3'b000;
    参数HALF = 3'b001;
    参数 ONE = 3'b010;
    参数 ONE_HALF = 3'b011;
    参数二 = 3'b100;
 
    //三级状态机
    reg [2:0] c_status;
    reg [2:0] n_status;
     
    //状态转移
    总是@(posege clk,negedge rst_n)开始
        如果(!rst_n)
            c_status <= 0;
        别的
            c_status <= n_status;
    结尾
     
    //状态转换规则和状态输出,组合逻辑输出只与输入相关
    //如果n_status = n_status,电路就会出错;
    总是@(*)开始
        案例(c_status)
            零 :
                    开始
                        如果(硬币_一半)
                            n_status = 一半;否则如果(coin_one)
                            n_状态=一;
                        别的
                            n_状态=零;
                    结尾
            一半 :
                    开始
                        如果(硬币_一半)
                            n_状态=一;
                        否则如果(coin_one)
                            n_status = ONE_HALF;
                        别的
                            n_status = 一半;
                    结尾
            一 :
                    开始
                        如果(硬币_一半)
                            n_status = ONE_HALF;
                        否则如果(coin_one)
                            n_状态=二;
                        别的
                            n_状态=一;
                    结尾
            一半 :
                        开始
                            如果(硬币_一半)n_状态=二;
                            否则如果(coin_one)
                                n_状态=零;
                            别的
                                n_status = ONE_HALF;
                        结尾
            二 :
                    开始
                        如果(硬币_一半)
                            n_状态=零;
                        否则如果(coin_one)
                            n_状态=零;
                        别的
                            n_状态=二;
                    结尾
            默认:
                        n_状态=零;
        端壳
    结尾
 
    总是@(posege clk,negedge rst_n)开始
        如果(!rst_n)
            开始
                水=1'b1;
                coin_back = 1'b0;
            结尾
        别的
            案例(c_status)一半:
                            开始
                                如果(硬币_一)
                                    开始
                                        水=1'b1;
                                        coin_back = 1'b0;
                                    结尾
                                别的
                                    开始
                                        水=1'b0;
                                        coin_back = 1'b0;
                                    结尾
                            结尾
                二:
                            开始
                                如果(硬币_一半)
                                    开始
                                        水=1'b1;
                                        coin_back = 1'b0;
                                    结尾
                                否则如果(coin_one)开始
                                        水=1'b1;
                                        coin_back = 1'b1;
                                    结尾
                                别的
                                    开始
                                        水=1'b0;
                                        coin_back = 1'b0;
                                    结尾
                            结尾
                默认:
                            开始
                                水=1'b0;
                                coin_back = 1'b0;
                            结尾
            端壳
    结尾
     
终端模块

六、仿真脚本

`timescale 1ns/1ps
 
模块auto_sell_tb;
 
    寄存器时钟;
    reg rst_n;
    reg coin_one;reg coin_half;
     
    电线水;
    电线 coin_back;
     
     
     
    初始开始
        时钟=0;
        rst_n = 0;
        硬币_一 = 0;
        硬币_半 = 0;
        #20;
        rst_n = 1;
        //延迟200us
        #10000
         
        //投2.5元
        coin_half = 1;
        #20;
        硬币_半 = 0;
        #20;
         
        硬币_一 = 1;
        #20;
        硬币_一 = 0;
        #20;
                 
        coin_half = 1;
        #20;
        硬币_半 = 0;
        #20;
                 
        coin_half = 1;
        #20;
        硬币_半 = 0;
        #20;
                 
        //延迟200us
        #10000
         
        //投3元
        coin_half = 1;
        #20;
        硬币_半 = 0;
        #20;
                 
        硬币_一 = 1;
        #20;
        硬币_一 = 0;
        #20;
                 
        coin_half = 1;
        #20;
        硬币_半 = 0;
        #20;硬币_一 = 1;
        #20;
        硬币_一 = 0;
        #20;
                 
        //延时200us
        #10000
        $停止;
    结尾
     
    自动销售 自动销售安装(
        .clk(时钟),
        .rst_n (rst_n),
        .coin_one (coin_one),
        .coin_half (coin_half),
     
        .水(水),
        .coin_back (coin_back)
    );
     
    总是 #10 clk = ~clk;
 
终端模块

7. 模拟结果

审稿编辑:唐子红
-->

关灯