Altera Code to Demultiplex HC12 Address and Data Busses, and to Select Odd and Even Memory Chips
SUBDESIGN demux_cs
(
EXP_ENn : INPUT; % Memory expansion enabled if low %
E : INPUT; % E-Clock %
R_W : INPUT; % R/W Line %
RESETn : INPUT; % Reset line %
LSTRBn : INPUT; % Let's us tell if 8-bit or 16-bit access %
WEn : OUTPUT; % Write Enable to memory %
OEn : OUTPUT; % Output Enable to memory %
CS_MEM_ODDn : OUTPUT; % Chip Select for odd addresses %
CS_MEM_EVENn : OUTPUT; % Chip Select for even addresses %
A[15..1] : OUTPUT; % Demultiplexed address bits %
)
VARIABLE
demux[15..0] : DFF; % Demuliplexed address internal %
CS_MEM : NODE; % Tell's when address in range of memory %
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..1] = demux[15..1].q; % Don't need LSB of address %
% 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;
% Access external memory when addresses in the range 0x1000 to 0x7fff %
IF (EXP_ENn==GND) & (E==VCC) &
((demux[15..0].q >= H"0000") & (demux[15..0].q <= H"7FFF")) THEN
CS_MEM = VCC;
ELSE
CS_MEM = GND;
END IF;
% Access even memory locations when address is even %
IF (CS_MEM == VCC) & (demux0.q == GND) THEN
CS_MEM_EVENn = GND;
ELSE
CS_MEM_EVENn = VCC;
END IF;
% Access odd memory locations on 16-bit access to even addresses or %
% eight-bit accesses to odd addresses %
IF (CS_MEM == VCC) & (LSTRBn == GND) THEN
CS_MEM_ODDn = GND;
ELSE
CS_MEM_ODDn = VCC;
END IF;
END;