contents.gifindex.gif

Source File - BJACK

module BJACK
title 'BlackJack state machine controller'

" The design is used as a submodule in BJTOPX,
" oe pin is not supported and Ena is not needed
 
"Inputs
        Clk,ClkIN       pin;      "System clock
        GT16,LT22       pin;      "Score less than 17 and 22
        is_Ace          pin;        "Card is ace
        Restart         pin;        "Restart game
        CardIn,CardOut  pin;      "Card present switches
"        Ena             pin;

        Sensor          = [CardIn,CardOut];
        _In             = [  0   ,   1   ];
        InOut           = [  1   ,   1   ];
        Out             = [  1   ,   0   ];

"Outputs
        AddClk          pin;         "Adder clock
        Add10           pin;         "Input Mux control
        Sub10           pin;         "Input Mux control
        Q2,Q1,Q0        pin;
        Ace             pin;         "Ace Memory

        High,Low        = 1,0;
        H,L,C,X         = 1,0,.C.,.X.;  "test vector charactors

        AddClk                  istype 'com';
        Ace                     istype 'reg_d';
        Add10,Sub10,Q2,Q1,Q0    istype 'reg_d';

        Qstate          =  [Add10,Sub10,Q2,Q1,Q0];
        Clear           =  [  1  ,  1  , 1, 1, 1];
        ShowHit         =  [  1  ,  1  , 1, 1, 0];
        AddCard         =  [  1  ,  1  , 0, 0, 0];
        Add_10          =  [  0  ,  1  , 0, 0, 0];
        Wait            =  [  1  ,  1  , 0, 0, 1];
        Test_17         =  [  1  ,  1  , 0, 1, 0];
        Test_22         =  [  1  ,  1  , 0, 1, 1];
        ShowStand       =  [  1  ,  1  , 1, 0, 0];
        ShowBust        =  [  1  ,  1  , 1, 0, 1];
        Sub_10          =  [  1  ,  0  , 0, 0, 1];
        Zero            =  [  0  ,  0  , 0, 0, 0];

equations
        [Qstate,Ace].clk = Clk;
"        [Qstate,Ace].oe  = !Ena;
 
@page
@dcset
state_diagram Qstate

        State Clear:    AddClk    = !ClkIN;
                        Ace      := Low;
                        if (Restart==Low) then Clear else ShowHit;

        State ShowHit:  AddClk    = Low;
                        Ace      := Ace.fb;
                        if (CardIn==Low) then AddCard else ShowHit;

        State AddCard:  AddClk    = !ClkIN;
                        Ace      := Ace.fb;
                        if (is_Ace & !Ace.fb) then Add_10 else Wait;

        State Add_10:   AddClk    = !ClkIN;
                        Ace      := High;
                        goto      Wait;

        State Wait:     AddClk    = Low;
                        Ace      := Ace.fb;
                        if (CardOut==Low) then Test_17 else Wait;

        State Test_17:  AddClk    = Low;
                        Ace      := Ace.fb;
                        if !GT16 then ShowHit else Test_22;

        State Test_22:  AddClk    = Low;
                        Ace      := Ace.fb;
                        case     LT22           : ShowStand;
                                !LT22 & !Ace.fb : ShowBust;
                                !LT22 &  Ace.fb : Sub_10;
                        endcase;

        State Sub_10:   AddClk    = !ClkIN;
                        Ace      := Low;
                        goto      Test_17;

        State ShowBust: AddClk    = Low;
                        Ace      := Ace.fb;
                        if (Restart==Low) then Clear else ShowBust;

       State ShowStand: AddClk    = Low;
                        Ace      := Ace.fb;
                        if (Restart==Low) then Clear else ShowStand;

       State Zero:      goto Clear;

"@page
"test_vectors edited ...
end