14复杂状态机

一、实现的功能
实现可乐机
能够投入5毛和1块的硬币
2.5元吐出可乐
3元的时候吐出可乐并且进行找零

二、实现
1、状态图
在这里插入图片描述在这里插入图片描述

2、波形图
在这里插入图片描述
3、rtl视图
在这里插入图片描述

4.程序
模块程序

module complex_fsm
(
    input   wire    sys_clk,
    input   wire    sys_rst_n,
    input   wire    pi_money_one,
    input   wire    pi_money_half,
    
    output  reg     po_cola,
    output  reg     po_money

);

wire    [1:0]   pi_money;
reg     [4:0]   state;

/* parameter   IDLE    = 5'b00001;
parameter   HALF    = 5'b00010;
parameter   ONE     = 5'b00100;
parameter   ONE_HALF= 5'b01000;
parameter   TWO     = 5'b10000; */


parameter   IDLE    = 5'b00001,
            HALF    = 5'b00010,
            ONE     = 5'b00100,
            ONE_HALF= 5'b01000,
            TWO     = 5'b10000;
            
assign  pi_money = {pi_money_one,pi_money_half};

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        state <= IDLE;
    else    case(state)
                IDLE:   if (pi_money == 2'b01)
                            state <= HALF;
                        else if (pi_money == 2'b10)
                            state <= ONE;
                        else
                            state <= IDLE;
                HALF:   if (pi_money == 2'b01)
                            state <= ONE;
                        else if (pi_money == 2'b10)
                            state <= ONE_HALF;
                        else
                            state <= HALF;
                ONE:    if (pi_money == 2'b01)
                            state <= ONE_HALF;
                        else if (pi_money == 2'b10)
                            state <= TWO;
                        else
                            state <= ONE;
                ONE_HALF: if (pi_money == 2'b01)
                            state <= TWO;
                        else if (pi_money == 2'b10)
                            state <= IDLE;
                        else
                            state <= ONE_HALF;
                TWO:    if (pi_money == 2'b01)
                            state <= IDLE;
                        else if (pi_money == 2'b10)
                            state <= IDLE;
                        else
                            state <= TWO;  
                default: state <= IDLE;
            endcase
            
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        po_cola <= 1'b0;
    else if (state == TWO)
        po_cola <= 1'b1;
    else
        po_cola <= 1'b0;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n ==1'b0)
        po_money <= 1'b0;
    else if((state == TWO)&&(pi_money == 2'b10))
        po_money <= 1'b1;
    else
        po_money <= 1'b0;
               
endmodule

其中下面两种方式是一样的,后面的方式比较简单
在这里插入图片描述

仿真程序

`timescale 1ns/1ns
module tb_complex_fsm ();

reg sys_clk;
reg sys_rst_n;
reg pi_money_one;
reg pi_money_half;
reg random_data_gen;

wire po_cola;
wire po_money;

always #10 sys_clk = ~sys_clk;

initial
    begin
        sys_clk = 1'b0;
        sys_rst_n <= 1'b0;
        #20
        sys_rst_n <= 1'b1;
    end
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        random_data_gen <= 1'b0;
    else
        random_data_gen <= {$random} %2;

always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        pi_money_half <= 1'b0;
    else
        pi_money_half <= random_data_gen;
        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        pi_money_one <= 1'b0;
    else
        pi_money_one <= ~random_data_gen;
        /*只有一个投币口,避免5毛和1块同时产生数据对其取反就避免了*/
        
initial
    begin
        $timeformat (-9,0,"ns",6);
        $monitor ("@time %t:pi_money_one=%b pi_money_half=%b pi_money=%b state=%b po_cola=%b po_money=%b",$time, pi_money_one, pi_money_half, pi_money, state, po_cola, po_money);
    end
/*连接出来,可以对状态机内部进行观察*/
wire [1:0] pi_money = complex_fsm_inst.pi_money;
wire [4:0] state = complex_fsm_inst.state;


complex_fsm complex_fsm_inst
(
    .sys_clk       (sys_clk      ) ,
    .sys_rst_n     (sys_rst_n    ) ,
    .pi_money_one  (pi_money_one ) ,
    .pi_money_half (pi_money_half) ,

    .po_cola       (po_cola      ) ,
    .po_money      (po_money     )

);     

endmodule  


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SoC(System on Chip)中的复杂状态机验证需要考虑到以下几个方面: 1. 状态机的建模:需要对SoC中的所有组件进行建模,并将这些组件之间的交互关系建模成状态机模型。需要考虑到SoC的复杂性和多样性,建模的过程需要对SoC的实际应用场景进行详细分析。 2. 设计测试用例:测试用例需要覆盖SoC的所有功能和交互情况,包括各种输入和输出,各种组件之间的数据传输和控制信号等。需要根据SoC的实际应用场景设计测试用例,以确保测试的全面性和有效性。 3. 执行测试用例:测试用例的执行需要使用仿真工具进行,通过对仿真结果的观察和分析,可以得出SoC的实际行为是否符合预期的状态机模型。 4. 验证测试结果:需要对测试结果进行验证,判断SoC的实际行为是否符合状态机模型。如果存在不符合状态机模型的情况,需要重新检查状态机模型,修正错误,重新设计测试用例进行测试。 5. 使用形式化验证方法:SoC中的状态机通常非常复杂,使用传统的测试方法难以覆盖所有的情况。因此,可以使用形式化验证方法,如模型检查和定理证明等,来证明SoC的状态机是否正确。 需要注意的是,SoC中的复杂状态机验证需要耗费大量的时间和资源,因此需要谨慎地选取验证方法和测试用例,以保证验证的有效性和可靠性。同时,需要结合实际应用场景进行验证,以确保SoC的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值