I was getting annoyed that I cannot find a non-obsolete Hex to 7-Segment decoder chip but plenty of BCD to 7-Segment decoders so I resorted to creating my own using an Atmel ATF16V8B PLD (Found on Digikey for C$1.38 ATF16V8B-15PU-ND).
Alternatively this can be achieved using a ROM (EPROM and EEPROM too) with the techniques on the “using ROM as combinational logic” page.
I chose this device because it is an actively stocked device on Digikey and is supported by the miniPro TL866 programmer.
I started doing the Boolean algebra and kept getting errors so I finally settled on using fields and tables.
Compiled JED file can be downloaded here: this can be burned directly into the chips without the need of having to compile it yourself.
(Aug 8 2020 update) There is now an active low output enable on pin 11.
Below is the WinCUPL source code, it is currently set to common Anode. For common Cathode, swap the tables and recompile.
Name 7segDecoder ; PartNo 00 ; Date 8/6/2020 ; Revision 02 ; Designer Peter Murray ; Company N/A ; Assembly None ; Location Right here ; Device g16v8 ; /* Hex to 7-segment LED display converter The default mode is common Anode, but you can swap the tables out below to make it common cathode +----\/----+ I0 | 1 20 | Vcc I1 | 2 19 | Segment A I2 | 3 18 | Segment B I3 | 4 17 | Segment C N/C | 5 16 | Segment D N/C | 6 15 | Segment E N/C | 7 14 | Segment F N/C | 8 13 | Segment G N/C | 9 12 | N/C GND | 10 11 | N/C +----------+ This is designed for the Atmel ATF16V8B (Digikey: ATF16V8B-15PU-ND ) This file is free for anyone to use for whatever reason, no warranty implied. (C)Peter Murray 2020 - 39k.ca updated to use pin 11 as active low output enable */ /* *************** INPUT PINS *********************/ PIN 1 = I0 ; /* */ PIN 2 = I1 ; /* */ PIN 3 = I2 ; /* */ PIN 4 = I3 ; /* */ /* *************** OUTPUT PINS ******************** */ PIN 19 = A; PIN 18 = B; PIN 17 = C; PIN 16 = D; PIN 15 = E; PIN 14 = F; PIN 13 = G; PIN 11 = !ENABLE; [A,B,C,D,E,F,G].oe = ENABLE; FIELD INPUT = [I0,I1,I2,I3]; /* Defines input array */ FIELD OUTPUT = [A,B,C,D,E,F,G]; /* Defines output array */ TABLE INPUT => OUTPUT { 'b'0000 => 'b'0000001; 'b'0001 => 'b'1001111; 'b'0010 => 'b'0010010; 'b'0011 => 'b'0000110; 'b'0100 => 'b'1001100; 'b'0101 => 'b'0100100; 'b'0110 => 'b'0100000; 'b'0111 => 'b'0001111; 'b'1000 => 'b'0000000; 'b'1001 => 'b'0001100; 'b'1010 => 'b'0001000; 'b'1011 => 'b'1100000; 'b'1100 => 'b'0110001; 'b'1101 => 'b'1000010; 'b'1110 => 'b'0110000; 'b'1111 => 'b'0111000; } /* Use this table for common cathode displays { 'b'0000 => 'b'1111110; 'b'0001 => 'b'0110000; 'b'0010 => 'b'1101101; 'b'0011 => 'b'1111001; 'b'0100 => 'b'0110011; 'b'0101 => 'b'1011011; 'b'0110 => 'b'1011111; 'b'0111 => 'b'1110000; 'b'1000 => 'b'1111111; 'b'1001 => 'b'1110011; 'b'1010 => 'b'1110111; 'b'1011 => 'b'0011111; 'b'1100 => 'b'1001110; 'b'1101 => 'b'0111101; 'b'1110 => 'b'1001111; 'b'1111 => 'b'1000111; } */