contents.gifindex.gif

MUXADD Source File

module MuxAdd
title '5-bit ripple adder with input multiplex'

        AddClk,Clr,Add10,Sub10,is_Ace   pin;
        V4,V3,V2,V1,V0                  pin;
        S4,S3,S2,S1,S0                  pin;
        C4,C3,C2,C1                     node;

        X,C,L,H   = .X., .C., 0, 1;

        Card      = [V4,V3,V2,V1,V0];
        Score     = [S4,S3,S2,S1,S0];
        CarryIn   = [C4,C3,C2,C1, 0];
        CarryOut  = [ X,C4,C3,C2,C1];
        ten       = [ 0, 1, 0, 1, 0];
        minus_ten = [ 1, 0, 1, 1, 0];

        S4,S3,S2,S1,S0 istype 'reg' ;

" Input Multiplexer
        Data     =  Add10 &  Sub10 & Card
                 # !Add10 &  Sub10 & ten
                 #  Add10 & !Sub10 & minus_ten;

equations
        Score   := Data $ Score $ CarryIn;

        CarryOut = Data & Score # (Data # Score) & CarryIn;

        Score.ar = !Clr;

        Score.c  = AddClk;

        is_Ace   = Card == 1;

trace
       ([AddClk,Clr,Add10,Sub10,Card] -> [Score,is_Ace,CarryOut])
test_vectors
       ([AddClk,Clr,Add10,Sub10,Card] -> [Score,is_Ace])
        [   L  , L ,  H  ,  H  ,  X ] -> [  0  ,   L  ]; "Clear
        [   C  , H ,  H  ,  H  ,  7 ] -> [  7  ,   L  ];
        [   C  , H ,  H  ,  H  , 10 ] -> [ 17  ,   L  ];
        [   L  , L ,  H  ,  H  ,  X ] -> [  0  ,   L  ]; "Clear
        [   C  , H ,  H  ,  H  ,  1 ] -> [  1  ,   H  ];
        [   C  , H ,  L  ,  H  ,  1 ] -> [ 11  ,   H  ]; "Add 10
        [   C  , H ,  H  ,  H  ,  4 ] -> [ 15  ,   L  ];
        [   C  , H ,  H  ,  H  ,  8 ] -> [ 23  ,   L  ];
        [   C  , H ,  H  ,  L  ,  8 ] -> [ 13  ,   L  ]; "Subtract 10
        [   C  , H ,  H  ,  H  ,  5 ] -> [ 18  ,   L  ];

end MuxAdd