Created
June 8, 2026 03:58
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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