Skip to content

Instantly share code, notes, and snippets.

@kellertk
Created June 8, 2026 03:58
Show Gist options
  • Select an option

  • Save kellertk/6b69a8ca0c0100f25032112f42ebb3f3 to your computer and use it in GitHub Desktop.

Select an option

Save kellertk/6b69a8ca0c0100f25032112f42ebb3f3 to your computer and use it in GitHub Desktop.
A 16-bit to 7 segment data display, implemented in a ATF1504 CPLD. 4 digits, hexadecimal.
Name DATADISP;
Partno ATF1504AS;
Date 2026-06-07;
Revision 01;
Designer kellertk;
Company ;
Assembly Data Display;
Location U2;
Device f1504ispplcc44;
PROPERTY ATMEL { TDI_PULLUP = ON };
PROPERTY ATMEL { TMS_PULLUP = ON };
PROPERTY ATMEL { POWER_RESET = ON };
PROPERTY ATMEL { XOR_SYNTHESIS = ON };
/* Clock inputs */
Pin 2 = PHI2; /* GCLK1: system clock, latches the 16-bit word */
Pin 44 = MUXCLK; /* GCLK3: 555 timer, scans the four digits */
/* Inputs - the 16-bit word to display (IN0 = LSB). */
Pin 4 = IN0;
Pin 5 = IN1;
Pin 6 = IN2;
Pin 8 = IN3;
Pin 9 = IN4;
Pin 11 = IN5;
Pin 12 = IN6;
Pin 14 = IN7;
Pin 16 = IN8;
Pin 17 = IN9;
Pin 18 = IN10;
Pin 19 = IN11;
Pin 20 = IN12;
Pin 21 = IN13;
Pin 1 = IN14;
Pin 43 = IN15;
/* Outputs - 7-segment cathodes (common-cathode) */
Pin 24 = SEG_A;
Pin 25 = SEG_B;
Pin 26 = SEG_C;
Pin 27 = SEG_D;
Pin 28 = SEG_E;
Pin 29 = SEG_F;
Pin 31 = SEG_G;
/* Outputs - digit selects (drive low-side 2N7000) */
Pin 33 = DG0;
Pin 34 = DG1;
Pin 36 = DG2;
Pin 37 = DG3;
/* =========================================================================
* INTERNAL NODES
* ========================================================================= */
/* 16-bit bus snapshot register (clocked by PHI2) */
PINNODE = W0;
PINNODE = W1;
PINNODE = W2;
PINNODE = W3;
PINNODE = W4;
PINNODE = W5;
PINNODE = W6;
PINNODE = W7;
PINNODE = W8;
PINNODE = W9;
PINNODE = W10;
PINNODE = W11;
PINNODE = W12;
PINNODE = W13;
PINNODE = W14;
PINNODE = W15;
/* 2-bit digit-scan counter (clocked by MUXCLK) */
PINNODE = SEL0;
PINNODE = SEL1;
/* Muxed nibble (buried combinational nodes).
* Computed once and fed to all seven segment decoders; burying them
* prevents the nibble mux from being flattened into every segment
* equation, which would multiply product-term counts. */
PINNODE = N0;
PINNODE = N1;
PINNODE = N2;
PINNODE = N3;
/* =========================================================================
* BUS SNAPSHOT REGISTER
* ========================================================================= */
W0.D = IN0; W0.CK = PHI2;
W1.D = IN1; W1.CK = PHI2;
W2.D = IN2; W2.CK = PHI2;
W3.D = IN3; W3.CK = PHI2;
W4.D = IN4; W4.CK = PHI2;
W5.D = IN5; W5.CK = PHI2;
W6.D = IN6; W6.CK = PHI2;
W7.D = IN7; W7.CK = PHI2;
W8.D = IN8; W8.CK = PHI2;
W9.D = IN9; W9.CK = PHI2;
W10.D = IN10; W10.CK = PHI2;
W11.D = IN11; W11.CK = PHI2;
W12.D = IN12; W12.CK = PHI2;
W13.D = IN13; W13.CK = PHI2;
W14.D = IN14; W14.CK = PHI2;
W15.D = IN15; W15.CK = PHI2;
/* =========================================================================
* DIGIT-SCAN COUNTER
* ========================================================================= */
SEL0.D = !SEL0;
SEL1.D = SEL1 $ SEL0;
SEL0.CK = MUXCLK;
SEL1.CK = MUXCLK;
/* =========================================================================
* NIBBLE MULTIPLEXER
* ========================================================================= */
N0 = (!SEL1 & !SEL0 & W0) # (!SEL1 & SEL0 & W4)
# ( SEL1 & !SEL0 & W8) # ( SEL1 & SEL0 & W12);
N1 = (!SEL1 & !SEL0 & W1) # (!SEL1 & SEL0 & W5)
# ( SEL1 & !SEL0 & W9) # ( SEL1 & SEL0 & W13);
N2 = (!SEL1 & !SEL0 & W2) # (!SEL1 & SEL0 & W6)
# ( SEL1 & !SEL0 & W10) # ( SEL1 & SEL0 & W14);
N3 = (!SEL1 & !SEL0 & W3) # (!SEL1 & SEL0 & W7)
# ( SEL1 & !SEL0 & W11) # ( SEL1 & SEL0 & W15);
/* =========================================================================
* HEX 7-SEGMENT DECODER
*
* aaaa
* f b
* f b
* gggg
* e c
* e c
* dddd
* ========================================================================= */
FIELD nib = [N3,N2,N1,N0];
SEG_A = nib:[0,2,3,5,6,7,8,9,A,C,E,F];
SEG_B = nib:[0,1,2,3,4,7,8,9,A,D];
SEG_C = nib:[0,1,3,4,5,6,7,8,9,A,B,D];
SEG_D = nib:[0,2,3,5,6,8,9,B,C,D,E];
SEG_E = nib:[0,2,6,8,A,B,C,D,E,F];
SEG_F = nib:[0,4,5,6,8,9,A,B,C,E,F];
SEG_G = nib:[2,3,4,5,6,8,9,A,B,D,E,F];
/* =========================================================================
* DIGIT SELECTS
* ========================================================================= */
DG0 = !SEL1 & !SEL0;
DG1 = !SEL1 & SEL0;
DG2 = SEL1 & !SEL0;
DG3 = SEL1 & SEL0;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment