Altera Code to Demultiplex HC12 Address and Data Busses, and to Generate Output Enable and Write Enable Control Lines


SUBDESIGN demux_oe_we
(
    EXP_ENn         :  INPUT;   % Expansion enabled when low %

    E               :  INPUT;   % E-Clock %
    R_W             :  INPUT;   % R/W Line %

    PA[7..0]        :  BIDIR;   % Address and Data (15-8) from HC12 %
    PB[7..0]        :  BIDIR;   % Address and Data (7-0) from HC12 %

    WEn             :  OUTPUT;  % Write Enable to memory %
    OEn             :  OUTPUT;  % Output Enable to memory %
    A[15..0]        :  OUTPUT;  % Demultiplexed address bits % 
)


VARIABLE
    demux[15..0]    :  DFF;    % Demuliplexed address internal %

BEGIN

% ***********************************************************************%
% Address decoding and demultiplexing                                    %
% Latch address on rising edge of E clock                                %
% ***********************************************************************%

    demux[15..8].d = PA[7..0];
    demux[7..0].d  = PB[7..0];
    demux[15..0].clk = E; 
    A[15..0] = demux[15..0].q;
    
% Enable writes when E high and R/W low %

    IF (EXP_ENn == GND) & (E == VCC) & (R_W == GND) THEN
        WEn = GND;
    ELSE
        WEn = VCC;
    END IF;

% Enable reads when E high and R/W high %

    IF (EXP_ENn == GND) & (E == VCC) & (R_W == VCC) THEN
        OEn = GND;
    ELSE
        OEn = VCC;
    END IF;

END;