ROM

ROMs are rather intuitive. Just implement multiple functions for each case; for each input combinations.

First I thought Figure 4.9 was a little confusing. The bit lines could be connected to both Vcc and Ground at once. As I found out, ground wins in this case, because there is something in electronics like high-impedance path and low-impedance path, and Ground is a low-impedance path.

PLA / PAL

I think the point of PLA and PAL, is that unlike ROM’s use of canonical SOP, PLA and PAL’s standard SOP omits variables, so it is less wasteful for implementation of sparse functions. For sparse functions you are only going to need only so much standard minterms, for multiple different functions, so just use several standard minterms, for multiple functions.

For example, for PLA’s standard SOP, a minterm like AC, instead of A_C_ with 4 cases of possible B and D combinations, would be used.

I was at first thinking: "AC covers more rows of the truth table, so surely it requires more logic?" But that's backwards. A term that covers more rows needs fewer inputs to the AND gate, because you're asserting fewer constraints. AC fires for any combination of B and D — precisely because you're not checking B or D at all.

Indeed, there are cases where the ROM/canonical SOP approach is better, and there are cases when PLA/PAL/standard SOP approach is better. The distinguishing factor is density of the functions.

4.1

4.3 ROM Logic

4.8 Multiplexers versus Demultiplexers

4.18 Regular Logic Implementation Methods