FPGA project : simple fsm

module simple_fsm (
    input           wire        sys_clk     ,
    input           wire        sys_rst_n   ,
    input           wire        pi_money    ,

    output          reg         po_cola
);
    // define signal
    // fsm
    reg             [02:00]     CS  ;
    reg             [02:00]     NS  ;
    localparam  IDLE = 3'b001       ,
                ONE  = 3'b010       ,
                TWO  = 3'b100       ;
    // CS 
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            CS <= IDLE ;
        end else begin
            CS <= NS ;
        end
    end
    // NS 
    always @(*) begin
        case (CS)
            IDLE : begin
                if(pi_money) begin
                    NS = ONE ;
                end else begin
                    NS = IDLE ;
                end
            end
            ONE  : begin
                if(pi_money) begin
                    NS = TWO ;
                end else begin
                    NS = ONE ;
                end
            end
            TWO  : begin
                if(pi_money) begin
                    NS = IDLE ;
                end else begin
                    NS = TWO ;
                end
            end
            default: NS = IDLE ;
        endcase
    end
    // state transition condations are too simple , so ignal
    // po_cola
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            po_cola <= 0 ;
        end else begin
            if(CS == TWO && pi_money) begin
                po_cola <= 1 ;
            end else begin
                po_cola <= 0 ;
            end
        end
    end
endmodule
`timescale 1ns/1ns
module test();
    reg                       sys_clk     ;
    reg                       sys_rst_n   ;
    reg                       pi_money    ;

    wire                      po_cola     ;

// Instantiation
simple_fsm simple_fsm_insert (
    .sys_clk                ( sys_clk   ) ,
    .sys_rst_n              ( sys_rst_n ) ,
    .pi_money               ( pi_money  ) ,

    .po_cola                ( po_cola   )
);
    parameter CYCLE = 20 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b1 ;
        pi_money  <= 1'b0 ;
        #( 30 )           ;
        sys_rst_n <= 1'b0 ;
        #( CYCLE * 5 )    ;
        #( 10 )           ;
        sys_rst_n <= 1'b1 ;

        #(CYCLE * 30 )    ;
        pi_money  <= 1'b1 ;
        #(CYCLE)          ;
        pi_money  <= 1'b0 ;

        #(CYCLE * 30 )    ;
        pi_money  <= 1'b1 ;
        #(CYCLE)          ;
        pi_money  <= 1'b0 ;

        #(CYCLE * 30 )    ;
        pi_money  <= 1'b1 ;
        #(CYCLE)          ;
        pi_money  <= 1'b0 ;
        
        #( CYCLE * 100  ) ;
        $stop             ;
    end


    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;


endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值