From 4014513685535ba564d662d6638ead9cfa04bdd3 Mon Sep 17 00:00:00 2001 From: derek mcquay Date: Sun, 10 Apr 2016 09:22:51 -0700 Subject: [PATCH] adding ecen 320 final project --- ecen320/README.txt | 48 + ecen320/Spartan3EMaster.ucf | 228 ++ ecen320/rx_decoder/Rx.bit | Bin 0 -> 283872 bytes ecen320/rx_decoder/Spartan3EMaster.ucf | 231 ++ ecen320/rx_decoder/charGen.vhd | 76 + ecen320/rx_decoder/charGen_top.vhd | 241 ++ ecen320/rx_decoder/char_mem.vhd | 341 +++ ecen320/rx_decoder/font_rom.vhd | 2215 ++++++++++++++++++ ecen320/rx_decoder/rx.vhd | 179 ++ ecen320/rx_decoder/seven_segment_display.vhd | 78 + ecen320/rx_decoder/vga_timing.vhd | 78 + ecen320/tx_encoder/Spartan3EMaster.ucf | 228 ++ ecen320/tx_encoder/Tx.bit | Bin 0 -> 283877 bytes ecen320/tx_encoder/charGen.vhd | 76 + ecen320/tx_encoder/charGen_toplevel.vhd | 228 ++ ecen320/tx_encoder/char_mem.vhd | 341 +++ ecen320/tx_encoder/debounce.vhd | 58 + ecen320/tx_encoder/font_rom.vhd | 2215 ++++++++++++++++++ ecen320/tx_encoder/ps2_keyboard.vhd | 108 + ecen320/tx_encoder/ps2_keyboard_to_ascii.vhd | 319 +++ ecen320/tx_encoder/seven_segment_display.vhd | 78 + ecen320/tx_encoder/tx.vhd | 207 ++ ecen320/tx_encoder/tx_top.vhd | 104 + ecen320/tx_encoder/vga_timing.vhd | 83 + 24 files changed, 7760 insertions(+) create mode 100644 ecen320/README.txt create mode 100644 ecen320/Spartan3EMaster.ucf create mode 100644 ecen320/rx_decoder/Rx.bit create mode 100644 ecen320/rx_decoder/Spartan3EMaster.ucf create mode 100644 ecen320/rx_decoder/charGen.vhd create mode 100644 ecen320/rx_decoder/charGen_top.vhd create mode 100644 ecen320/rx_decoder/char_mem.vhd create mode 100644 ecen320/rx_decoder/font_rom.vhd create mode 100644 ecen320/rx_decoder/rx.vhd create mode 100644 ecen320/rx_decoder/seven_segment_display.vhd create mode 100644 ecen320/rx_decoder/vga_timing.vhd create mode 100644 ecen320/tx_encoder/Spartan3EMaster.ucf create mode 100644 ecen320/tx_encoder/Tx.bit create mode 100644 ecen320/tx_encoder/charGen.vhd create mode 100644 ecen320/tx_encoder/charGen_toplevel.vhd create mode 100644 ecen320/tx_encoder/char_mem.vhd create mode 100644 ecen320/tx_encoder/debounce.vhd create mode 100644 ecen320/tx_encoder/font_rom.vhd create mode 100644 ecen320/tx_encoder/ps2_keyboard.vhd create mode 100644 ecen320/tx_encoder/ps2_keyboard_to_ascii.vhd create mode 100644 ecen320/tx_encoder/seven_segment_display.vhd create mode 100644 ecen320/tx_encoder/tx.vhd create mode 100644 ecen320/tx_encoder/tx_top.vhd create mode 100644 ecen320/tx_encoder/vga_timing.vhd diff --git a/ecen320/README.txt b/ecen320/README.txt new file mode 100644 index 0000000..1625df5 --- /dev/null +++ b/ecen320/README.txt @@ -0,0 +1,48 @@ +AUTHORS: + Aaron Norris + Derek McQuay +COURSE: + ECEN 320 + Winter 2014 + Dr. Mike Wirthlin + Brigham Young University +SUMMARY: + This is a color based encryption/decryption program that sends its data + over UART +INSTRUCTIONS: + Hardware: + Nexys 2 FPGA (2) + Serial Cable (1) + Serial Null Modem (1) + Computer (1) + ps2 Keyboard (1) + Vga monitor & cable (2) + Running: + Load rx onto one board, and plug in the ps2 keyboard. + Load tx onto the other board. + Connect the two boards with the null modem and the serial cable. + You can now send messages between the boards. + As long as background color is the same on the two screens, the + message will appear on both. + When the colors mismatch, gibberish will print. + Move the switches to select colors. +FUTURE WORK: + Remove the jitter on the tx. After hours of work, we can't get the + display quite right. + Load an image into the memory, and read it pixel by pixel using one + pixel for one character. This way both sides need an identical + picture to send and recieve. Use switch 8 to indicate this option. + Write it so each board does both rx and tx. Select by button? +PROJECT BUILD OPTIONS: + Normal synthsis +PROJECT SIZE: + + RX: + 188 Slices used (2%) + approx 3366 lines of code (some identical to tx) + + TX: + 373 Slices used (8%) + approx 4006 lines of code (some identical to rx) + This is larger because of the ps2 code for the keyboard. + diff --git a/ecen320/Spartan3EMaster.ucf b/ecen320/Spartan3EMaster.ucf new file mode 100644 index 0000000..9168151 --- /dev/null +++ b/ecen320/Spartan3EMaster.ucf @@ -0,0 +1,228 @@ +# This file is a general .ucf for Nexys2 rev A board +# To use it in a project: +# - remove or comment the lines corresponding to unused pins +# - rename the used signals according to the project + + +## clock pin for Nexys 2 Board +NET "clk" LOC = "B8"; # Bank = 0, Pin name = IP_L13P_0/GCLK8, Type = GCLK, Sch name = GCLK0 +##NET "clk1" LOC = "U9"; # Bank = 2, Pin name = IO_L13P_2/D4/GCLK14, Type = DUAL/GCLK, Sch name = GCLK1 +# +## Leds +NET "Led<0>" LOC = "J14"; # Bank = 1, Pin name = IO_L14N_1/A3/RHCLK7, Type = RHCLK/DUAL, Sch name = JD10/LD0 +NET "Led<1>" LOC = "J15"; # Bank = 1, Pin name = IO_L14P_1/A4/RHCLK6, Type = RHCLK/DUAL, Sch name = JD9/LD1 +NET "Led<2>" LOC = "K15"; # Bank = 1, Pin name = IO_L12P_1/A8/RHCLK2, Type = RHCLK/DUAL, Sch name = JD8/LD2 +NET "Led<3>" LOC = "K14"; # Bank = 1, Pin name = IO_L12N_1/A7/RHCLK3/TRDY1, Type = RHCLK/DUAL, Sch name = JD7/LD3 +#NET "Led<4>" LOC = "E17"; # Bank = 1, Pin name = IO, Type = I/O, Sch name = LD4 +#NET "Led<5>" LOC = "P15"; # Bank = 1, Pin name = IO, Type = I/O, Sch name = LD5 +#NET "Led<6>" LOC = "F4"; # Bank = 3, Pin name = IO, Type = I/O, Sch name = LD6 +#NET "Led<7>" LOC = "R4"; # Bank = 3, Pin name = IO/VREF_3, Type = VREF, Sch name = LD7 + +## Switches +#NET "sw<0>" LOC = "G18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW0 +#NET "sw<1>" LOC = "H18"; # Bank = 1, Pin name = IP/VREF_1, Type = VREF, Sch name = SW1 +#NET "sw<2>" LOC = "K18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW2 +#NET "sw<3>" LOC = "K17"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW3 +#NET "sw<4>" LOC = "L14"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW4 +#NET "sw<5>" LOC = "L13"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW5 +#NET "sw<6>" LOC = "N17"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW6 +#NET "sw<7>" LOC = "R17"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW7 + +## Buttons +#NET "btn<0>" LOC = "B18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = BTN0 +#NET "btn<1>" LOC = "D18"; # Bank = 1, Pin name = IP/VREF_1, Type = VREF, Sch name = BTN1 +#NET "btn<2>" LOC = "E18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = BTN2 +#NET "btn<3>" LOC = "H13"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = BTN3 + +## 7 segment display +#NET "seg<0>" LOC = "L18"; # Bank = 1, Pin name = IO_L10P_1, Type = I/O, Sch name = CA +#NET "seg<1>" LOC = "F18"; # Bank = 1, Pin name = IO_L19P_1, Type = I/O, Sch name = CB +#NET "seg<2>" LOC = "D17"; # Bank = 1, Pin name = IO_L23P_1/HDC, Type = DUAL, Sch name = CC +#NET "seg<3>" LOC = "D16"; # Bank = 1, Pin name = IO_L23N_1/LDC0, Type = DUAL, Sch name = CD +#NET "seg<4>" LOC = "G14"; # Bank = 1, Pin name = IO_L20P_1, Type = I/O, Sch name = CE +#NET "seg<5>" LOC = "J17"; # Bank = 1, Pin name = IO_L13P_1/A6/RHCLK4/IRDY1, Type = RHCLK/DUAL, Sch name = CF +#NET "seg<6>" LOC = "H14"; # Bank = 1, Pin name = IO_L17P_1, Type = I/O, Sch name = CG +#NET "dp" LOC = "C17"; # Bank = 1, Pin name = IO_L24N_1/LDC2, Type = DUAL, Sch name = DP + +#NET "an<0>" LOC = "F17"; # Bank = 1, Pin name = IO_L19N_1, Type = I/O, Sch name = AN0 +#NET "an<1>" LOC = "H17"; # Bank = 1, Pin name = IO_L16N_1/A0, Type = DUAL, Sch name = AN1 +#NET "an<2>" LOC = "C18"; # Bank = 1, Pin name = IO_L24P_1/LDC1, Type = DUAL, Sch name = AN2 +#NET "an<3>" LOC = "F15"; # Bank = 1, Pin name = IO_L21P_1, Type = I/O, Sch name = AN3 + +## VGA Connector +#NET "vgaRed<1>" LOC = "R9"; # Bank = 2, Pin name = IO/D5, Type = DUAL, Sch name = RED0 +#NET "vgaRed<2>" LOC = "T8"; # Bank = 2, Pin name = IO_L10N_2, Type = I/O, Sch name = RED1 +#NET "vgaRed<3>" LOC = "R8"; # Bank = 2, Pin name = IO_L10P_2, Type = I/O, Sch name = RED2 +#NET "vgaGreen<1>" LOC = "N8"; # Bank = 2, Pin name = IO_L09N_2, Type = I/O, Sch name = GRN0 +#NET "vgaGreen<2>" LOC = "P8"; # Bank = 2, Pin name = IO_L09P_2, Type = I/O, Sch name = GRN1 +#NET "vgaGreen<3>" LOC = "P6"; # Bank = 2, Pin name = IO_L05N_2, Type = I/O, Sch name = GRN2 +#NET "vgaBlue<2>" LOC = "U5"; # Bank = 2, Pin name = IO/VREF_2, Type = VREF, Sch name = BLU1 +#NET "vgaBlue<3>" LOC = "U4"; # Bank = 2, Pin name = IO_L03P_2/DOUT/BUSY, Type = DUAL, Sch name = BLU2 + +#NET "Hsync" LOC = "T4"; # Bank = 2, Pin name = IO_L03N_2/MOSI/CSI_B, Type = DUAL, Sch name = HSYNC +#NET "Vsync" LOC = "U3"; # Bank = 2, Pin name = IO_L01P_2/CSO_B, Type = DUAL, Sch name = VSYNC + +## RS232 connector +#NET "RsRx" LOC = "U6"; # Bank = 2, Pin name = IP, Type = INPUT, Sch name = RS-RX +#NET "RsTx" LOC = "P9"; # Bank = 2, Pin name = IO, Type = I/O, Sch name = RS-TX + +## PS/2 connector +#NET "PS2C" LOC = "R12"; # Bank = 2, Pin name = IO_L20N_2, Type = I/O, Sch name = PS2C +#NET "PS2D" LOC = "P11"; # Bank = 2, Pin name = IO_L18P_2, Type = I/O, Sch name = PS2D + +## onBoard Cellular RAM and StrataFlash +#NET "MemOE" LOC = "T2"; # Bank = 3, Pin name = IO_L24P_3, Type = I/O, Sch name = OE +#NET "MemWR" LOC = "N7"; # Bank = 2, Pin name = IO_L07P_2, Type = I/O, Sch name = WE + +#NET "RamAdv" LOC = "J4"; # Bank = 3, Pin name = IO_L11N_3/LHCLK1, Type = LHCLK, Sch name = MT-ADV +#NET "RamCS" LOC = "R6"; # Bank = 2, Pin name = IO_L05P_2, Type = I/O, Sch name = MT-CE +#NET "RamClk" LOC = "H5"; # Bank = 3, Pin name = IO_L08N_3, Type = I/O, Sch name = MT-CLK +#NET "RamCRE" LOC = "P7"; # Bank = 2, Pin name = IO_L07N_2, Type = I/O, Sch name = MT-CRE +#NET "RamLB" LOC = "K5"; # Bank = 3, Pin name = IO_L14N_3/LHCLK7, Type = LHCLK, Sch name = MT-LB +#NET "RamUB" LOC = "K4"; # Bank = 3, Pin name = IO_L13N_3/LHCLK5, Type = LHCLK, Sch name = MT-UB +#NET "RamWait" LOC = "F5"; # Bank = 3, Pin name = IP, Type = INPUT, Sch name = MT-WAIT + +#NET "FlashRp" LOC = "T5"; # Bank = 2, Pin name = IO_L04N_2, Type = I/O, Sch name = RP# +#NET "FlashCS" LOC = "R5"; # Bank = 2, Pin name = IO_L04P_2, Type = I/O, Sch name = ST-CE +#NET "FlashStSts" LOC = "D3"; # Bank = 3, Pin name = IP, Type = INPUT, Sch name = ST-STS + +#NET "MemAdr<1>" LOC = "J1"; # Bank = 3, Pin name = IO_L12P_3/LHCLK2, Type = LHCLK, Sch name = ADR1 +#NET "MemAdr<2>" LOC = "J2"; # Bank = 3, Pin name = IO_L12N_3/LHCLK3/IRDY2, Type = LHCLK, Sch name = ADR2 +#NET "MemAdr<3>" LOC = "H4"; # Bank = 3, Pin name = IO_L09P_3, Type = I/O, Sch name = ADR3 +#NET "MemAdr<4>" LOC = "H1"; # Bank = 3, Pin name = IO_L10N_3, Type = I/O, Sch name = ADR4 +#NET "MemAdr<5>" LOC = "H2"; # Bank = 3, Pin name = IO_L10P_3, Type = I/O, Sch name = ADR5 +#NET "MemAdr<6>" LOC = "J5"; # Bank = 3, Pin name = IO_L11P_3/LHCLK0, Type = LHCLK, Sch name = ADR6 +#NET "MemAdr<7>" LOC = "H3"; # Bank = 3, Pin name = IO_L09N_3, Type = I/O, Sch name = ADR7 +#NET "MemAdr<8>" LOC = "H6"; # Bank = 3, Pin name = IO_L08P_3, Type = I/O, Sch name = ADR8 +#NET "MemAdr<9>" LOC = "F1"; # Bank = 3, Pin name = IO_L05P_3, Type = I/O, Sch name = ADR9 +#NET "MemAdr<10>" LOC = "G3"; # Bank = 3, Pin name = IO_L06P_3, Type = I/O, Sch name = ADR10 +#NET "MemAdr<11>" LOC = "G6"; # Bank = 3, Pin name = IO_L07P_3, Type = I/O, Sch name = ADR11 +#NET "MemAdr<12>" LOC = "G5"; # Bank = 3, Pin name = IO_L07N_3, Type = I/O, Sch name = ADR12 +#NET "MemAdr<13>" LOC = "G4"; # Bank = 3, Pin name = IO_L06N_3/VREF_3, Type = VREF, Sch name = ADR13 +#NET "MemAdr<14>" LOC = "F2"; # Bank = 3, Pin name = IO_L05N_3, Type = I/O, Sch name = ADR14 +#NET "MemAdr<15>" LOC = "E1"; # Bank = 3, Pin name = IO_L03N_3, Type = I/O, Sch name = ADR15 +#NET "MemAdr<16>" LOC = "M5"; # Bank = 3, Pin name = IO_L19P_3, Type = I/O, Sch name = ADR16 +#NET "MemAdr<17>" LOC = "E2"; # Bank = 3, Pin name = IO_L03P_3, Type = I/O, Sch name = ADR17 +#NET "MemAdr<18>" LOC = "C2"; # Bank = 3, Pin name = IO_L01N_3, Type = I/O, Sch name = ADR18 +#NET "MemAdr<19>" LOC = "C1"; # Bank = 3, Pin name = IO_L01P_3, Type = I/O, Sch name = ADR19 +#NET "MemAdr<20>" LOC = "D2"; # Bank = 3, Pin name = IO_L02N_3/VREF_3, Type = VREF, Sch name = ADR20 +#NET "MemAdr<21>" LOC = "K3"; # Bank = 3, Pin name = IO_L13P_3/LHCLK4/TRDY2, Type = LHCLK, Sch name = ADR21 +#NET "MemAdr<22>" LOC = "D1"; # Bank = 3, Pin name = IO_L02P_3, Type = I/O, Sch name = ADR22 +#NET "MemAdr<23>" LOC = "K6"; # Bank = 3, Pin name = IO_L14P_3/LHCLK6, Type = LHCLK, Sch name = ADR23 + +#NET "MemDB<0>" LOC = "L1"; # Bank = 3, Pin name = IO_L15P_3, Type = I/O, Sch name = DB0 +#NET "MemDB<1>" LOC = "L4"; # Bank = 3, Pin name = IO_L16N_3, Type = I/O, Sch name = DB1 +#NET "MemDB<2>" LOC = "L6"; # Bank = 3, Pin name = IO_L17P_3, Type = I/O, Sch name = DB2 +#NET "MemDB<3>" LOC = "M4"; # Bank = 3, Pin name = IO_L18P_3, Type = I/O, Sch name = DB3 +#NET "MemDB<4>" LOC = "N5"; # Bank = 3, Pin name = IO_L20N_3, Type = I/O, Sch name = DB4 +#NET "MemDB<5>" LOC = "P1"; # Bank = 3, Pin name = IO_L21N_3, Type = I/O, Sch name = DB5 +#NET "MemDB<6>" LOC = "P2"; # Bank = 3, Pin name = IO_L21P_3, Type = I/O, Sch name = DB6 +#NET "MemDB<7>" LOC = "R2"; # Bank = 3, Pin name = IO_L23N_3, Type = I/O, Sch name = DB7 +#NET "MemDB<8>" LOC = "L3"; # Bank = 3, Pin name = IO_L16P_3, Type = I/O, Sch name = DB8 +#NET "MemDB<9>" LOC = "L5"; # Bank = 3, Pin name = IO_L17N_3/VREF_3, Type = VREF, Sch name = DB9 +#NET "MemDB<10>" LOC = "M3"; # Bank = 3, Pin name = IO_L18N_3, Type = I/O, Sch name = DB10 +#NET "MemDB<11>" LOC = "M6"; # Bank = 3, Pin name = IO_L19N_3, Type = I/O, Sch name = DB11 +#NET "MemDB<12>" LOC = "L2"; # Bank = 3, Pin name = IO_L15N_3, Type = I/O, Sch name = DB12 +#NET "MemDB<13>" LOC = "N4"; # Bank = 3, Pin name = IO_L20P_3, Type = I/O, Sch name = DB13 +#NET "MemDB<14>" LOC = "R3"; # Bank = 3, Pin name = IO_L23P_3, Type = I/O, Sch name = DB14 +#NET "MemDB<15>" LOC = "T1"; # Bank = 3, Pin name = IO_L24N_3, Type = I/O, Sch name = DB15 + +## FX2 connector +#NET "PIO<0>" LOC = "B4"; # Bank = 0, Pin name = IO_L24N_0, Type = I/O, Sch name = R-IO1 +#NET "PIO<1>" LOC = "A4"; # Bank = 0, Pin name = IO_L24P_0, Type = I/O, Sch name = R-IO2 +#NET "PIO<2>" LOC = "C3"; # Bank = 0, Pin name = IO_L25P_0, Type = I/O, Sch name = R-IO3 +#NET "PIO<3>" LOC = "C4"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO4 +#NET "PIO<4>" LOC = "B6"; # Bank = 0, Pin name = IO_L20P_0, Type = I/O, Sch name = R-IO5 +#NET "PIO<5>" LOC = "D5"; # Bank = 0, Pin name = IO_L23N_0/VREF_0, Type = VREF, Sch name = R-IO6 +#NET "PIO<6>" LOC = "C5"; # Bank = 0, Pin name = IO_L23P_0, Type = I/O, Sch name = R-IO7 +#NET "PIO<7>" LOC = "F7"; # Bank = 0, Pin name = IO_L19P_0, Type = I/O, Sch name = R-IO8 +#NET "PIO<8>" LOC = "E7"; # Bank = 0, Pin name = IO_L19N_0/VREF_0, Type = VREF, Sch name = R-IO9 +#NET "PIO<9>" LOC = "A6"; # Bank = 0, Pin name = IO_L20N_0, Type = I/O, Sch name = R-IO10 +#NET "PIO<10>" LOC = "C7"; # Bank = 0, Pin name = IO_L18P_0, Type = I/O, Sch name = R-IO11 +#NET "PIO<11>" LOC = "F8"; # Bank = 0, Pin name = IO_L17N_0, Type = I/O, Sch name = R-IO12 +#NET "PIO<12>" LOC = "D7"; # Bank = 0, Pin name = IO_L18N_0/VREF_0, Type = VREF, Sch name = R-IO13 +#NET "PIO<13>" LOC = "E8"; # Bank = 0, Pin name = IO_L17P_0, Type = I/O, Sch name = R-IO14 +#NET "PIO<14>" LOC = "E9"; # Bank = 0, Pin name = IO_L15P_0, Type = I/O, Sch name = R-IO15 +#NET "PIO<15>" LOC = "C9"; # Bank = 0, Pin name = IO_L14P_0/GCLK10, Type = GCLK, Sch name = R-IO16 +#NET "PIO<16>" LOC = "A8"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO17 +#NET "PIO<17>" LOC = "G9"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO18 +#NET "PIO<18>" LOC = "F9"; # Bank = 0, Pin name = IO_L15N_0, Type = I/O, Sch name = R-IO19 +#NET "PIO<19>" LOC = "D10"; # Bank = 0, Pin name = IO_L11P_0/GCLK4, Type = GCLK, Sch name = R-IO20 +#NET "PIO<20>" LOC = "A10"; # Bank = 0, Pin name = IO_L12N_0/GCLK7, Type = GCLK, Sch name = R-IO21 +#NET "PIO<21>" LOC = "B10"; # Bank = 0, Pin name = IO_L12P_0/GCLK6, Type = GCLK, Sch name = R-IO22 +#NET "PIO<22>" LOC = "A11"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO23 +#NET "PIO<23>" LOC = "D11"; # Bank = 0, Pin name = IO_L09N_0, Type = I/O, Sch name = R-IO24 +#NET "PIO<24>" LOC = "E10"; # Bank = 0, Pin name = IO_L11N_0/GCLK5, Type = GCLK, Sch name = R-IO25 +#NET "PIO<25>" LOC = "B11"; # Bank = 0, Pin name = IO/VREF_0, Type = VREF, Sch name = R-IO26 +#NET "PIO<26>" LOC = "C11"; # Bank = 0, Pin name = IO_L09P_0, Type = I/O, Sch name = R-IO27 +#NET "PIO<27>" LOC = "E11"; # Bank = 0, Pin name = IO_L08P_0, Type = I/O, Sch name = R-IO28 +#NET "PIO<28>" LOC = "F11"; # Bank = 0, Pin name = IO_L08N_0, Type = I/O, Sch name = R-IO29 +#NET "PIO<29>" LOC = "E12"; # Bank = 0, Pin name = IO_L06N_0, Type = I/O, Sch name = R-IO30 +#NET "PIO<30>" LOC = "F12"; # Bank = 0, Pin name = IO_L06P_0, Type = I/O, Sch name = R-IO31 +#NET "PIO<31>" LOC = "A13"; # Bank = 0, Pin name = IO_L05P_0, Type = I/O, Sch name = R-IO32 +#NET "PIO<32>" LOC = "B13"; # Bank = 0, Pin name = IO_L05N_0/VREF_0, Type = VREF, Sch name = R-IO33 +#NET "PIO<33>" LOC = "E13"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO34 +#NET "PIO<34>" LOC = "A14"; # Bank = 0, Pin name = IO_L04N_0, Type = I/O, Sch name = R-IO35 +#NET "PIO<35>" LOC = "C14"; # Bank = 0, Pin name = IO_L03N_0/VREF_0, Type = VREF, Sch name = R-IO36 +#NET "PIO<36>" LOC = "D14"; # Bank = 0, Pin name = IO_L03P_0, Type = I/O, Sch name = R-IO37 +#NET "PIO<37>" LOC = "B14"; # Bank = 0, Pin name = IO_L04P_0, Type = I/O, Sch name = R-IO38 +#NET "PIO<38>" LOC = "A16"; # Bank = 0, Pin name = IO_L01N_0, Type = I/O, Sch name = R-IO39 +#NET "PIO<39>" LOC = "B16"; # Bank = 0, Pin name = IO_L01P_0, Type = I/O, Sch name = R-IO40 + +## 12 pin connectors +#NET "JA<0>" LOC = "L15"; # Bank = 1, Pin name = IO_L09N_1/A11, Type = DUAL, Sch name = JA1 +#NET "JA<1>" LOC = "K12"; # Bank = 1, Pin name = IO_L11N_1/A9/RHCLK1, Type = RHCLK/DUAL, Sch name = JA2 +#NET "JA<2>" LOC = "L17"; # Bank = 1, Pin name = IO_L10N_1/VREF_1, Type = VREF, Sch name = JA3 +#NET "JA<3>" LOC = "M15"; # Bank = 1, Pin name = IO_L07P_1, Type = I/O, Sch name = JA4 +#NET "JA<4>" LOC = "K13"; # Bank = 1, Pin name = IO_L11P_1/A10/RHCLK0, Type = RHCLK/DUAL, Sch name = JA7 +#NET "JA<5>" LOC = "L16"; # Bank = 1, Pin name = IO_L09P_1/A12, Type = DUAL, Sch name = JA8 +#NET "JA<6>" LOC = "M14"; # Bank = 1, Pin name = IO_L05P_1, Type = I/O, Sch name = JA9 +#NET "JA<7>" LOC = "M16"; # Bank = 1, Pin name = IO_L07N_1, Type = I/O, Sch name = JA10 +#NET "JB<0>" LOC = "M13"; # Bank = 1, Pin name = IO_L05N_1/VREF_1, Type = VREF, Sch name = JB1 +#NET "JB<1>" LOC = "R18"; # Bank = 1, Pin name = IO_L02P_1/A14, Type = DUAL, Sch name = JB2 +#NET "JB<2>" LOC = "R15"; # Bank = 1, Pin name = IO_L03P_1, Type = I/O, Sch name = JB3 +#NET "JB<3>" LOC = "T17"; # Bank = 1, Pin name = IO_L01N_1/A15, Type = DUAL, Sch name = JB4 +#NET "JB<4>" LOC = "P17"; # Bank = 1, Pin name = IO_L06P_1, Type = I/O, Sch name = JB7 +#NET "JB<5>" LOC = "R16"; # Bank = 1, Pin name = IO_L03N_1/VREF_1, Type = VREF, Sch name = JB8 +#NET "JB<6>" LOC = "T18"; # Bank = 1, Pin name = IO_L02N_1/A13, Type = DUAL, Sch name = JB9 +#NET "JB<7>" LOC = "U18"; # Bank = 1, Pin name = IO_L01P_1/A16, Type = DUAL, Sch name = JB10 +#NET "JC<0>" LOC = "G15"; # Bank = 1, Pin name = IO_L18P_1, Type = I/O, Sch name = JC1 +#NET "JC<1>" LOC = "J16"; # Bank = 1, Pin name = IO_L13N_1/A5/RHCLK5, Type = RHCLK/DUAL, Sch name = JC2 +#NET "JC<2>" LOC = "G13"; # Bank = 1, Pin name = IO_L20N_1, Type = I/O, Sch name = JC3 +#NET "JC<3>" LOC = "H16"; # Bank = 1, Pin name = IO_L16P_1, Type = I/O, Sch name = JC4 +#NET "JC<4>" LOC = "H15"; # Bank = 1, Pin name = IO_L17N_1, Type = I/O, Sch name = JC7 +#NET "JC<5>" LOC = "F14"; # Bank = 1, Pin name = IO_L21N_1, Type = I/O, Sch name = JC8 +#NET "JC<6>" LOC = "G16"; # Bank = 1, Pin name = IO_L18N_1, Type = I/O, Sch name = JC9 +#NET "JC<7>" LOC = "J12"; # Bank = 1, Pin name = IO_L15P_1/A2, Type = DUAL, Sch name = JC10 +#NET "JD<0>" LOC = "J13"; # Bank = 1, Pin name = IO_L15N_1/A1, Type = DUAL, Sch name = JD1 +#NET "JD<1>" LOC = "M18"; # Bank = 1, Pin name = IO_L08N_1, Type = I/O, Sch name = JD2 +#NET "JD<2>" LOC = "N18"; # Bank = 1, Pin name = IO_L08P_1, Type = I/O, Sch name = JD3 +#NET "JD<3>" LOC = "P18"; # Bank = 1, Pin name = IO_L06N_1, Type = I/O, Sch name = JD4 + +## onBoard USB controller +#NET "EppAstb" LOC = "V14"; # Bank = 2, Pin name = IP_L23P_2, Type = INPUT, Sch name = U-FLAGA +#NET "EppDstb" LOC = "U14"; # Bank = 2, Pin name = IP_L23N_2, Type = INPUT, Sch name = U-FLAGB +#NET "UsbFlag" LOC = "V16"; # Bank = 2, Pin name = IP, Type = INPUT, Sch name = U-FLAGC +#NET "EppWait" LOC = "N9"; # Bank = 2, Pin name = IO_L12P_2/D7/GCLK12, Type = DUAL/GCLK, Sch name = U-SLRD +#NET "EppDB<0>" LOC = "R14"; # Bank = 2, Pin name = IO_L24N_2/A20, Type = DUAL, Sch name = U-FD0 +#NET "EppDB<1>" LOC = "R13"; # Bank = 2, Pin name = IO_L22N_2/A22, Type = DUAL, Sch name = U-FD1 +#NET "EppDB<2>" LOC = "P13"; # Bank = 2, Pin name = IO_L22P_2/A23, Type = DUAL, Sch name = U-FD2 +#NET "EppDB<3>" LOC = "T12"; # Bank = 2, Pin name = IO_L20P_2, Type = I/O, Sch name = U-FD3 +#NET "EppDB<4>" LOC = "N11"; # Bank = 2, Pin name = IO_L18N_2, Type = I/O, Sch name = U-FD4 +#NET "EppDB<5>" LOC = "R11"; # Bank = 2, Pin name = IO, Type = I/O, Sch name = U-FD5 +#NET "EppDB<6>" LOC = "P10"; # Bank = 2, Pin name = IO_L15N_2/D1/GCLK3, Type = DUAL/GCLK, Sch name = U-FD6 +#NET "EppDB<7>" LOC = "R10"; # Bank = 2, Pin name = IO_L15P_2/D2/GCLK2, Type = DUAL/GCLK, Sch name = U-FD7 + +#NET "UsbClk" LOC = "T15"; # Bank = 2, Pin name = IO/VREF_2, Type = VREF, Sch name = U-IFCLK + +#NET "UsbOE" LOC = "V15"; # Bank = 2, Pin name = IO_L25P_2/VS2/A19, Type = DUAL, Sch name = U-SLOE +#NET "UsbWR" LOC = "V9"; # Bank = 2, Pin name = IO_L13N_2/D3/GCLK15, Type = DUAL/GCLK, Sch name = U-SWLR +#NET "UsbPktEnd" LOC = "V12"; # Bank = 2, Pin name = IO_L19P_2, Type = I/O, Sch name = U-PKTEND + +#NET "UsbDir" LOC = "T16"; # Bank = 2, Pin name = IO_L26P_2/VS0/A17, Type = DUAL, Sch name = U-SLCS +#NET "UsbMode" LOC = "U15"; # Bank = 2, Pin name = IO_L25N_2/VS1/A18, Type = DUAL, Sch name = U-INT0# + +#NET "UsbAdr<0>" LOC = "T14"; # Bank = 2, Pin name = IO_L24P_2/A21, Type = DUAL, Sch name = U-FIFOAD0 +#NET "UsbAdr<1>" LOC = "V13"; # Bank = 2, Pin name = IO_L19N_2/VREF_2, Type = VREF, Sch name = U-FIFOAD1 + +##NET "UsbRdy" LOC = "U13"; # Bank = 2, Pin name = IP, Type = INPUT, Sch name = U-RDY diff --git a/ecen320/rx_decoder/Rx.bit b/ecen320/rx_decoder/Rx.bit new file mode 100644 index 0000000000000000000000000000000000000000..ef1ac0a785e9c6a863b04f52b843792a34c2e73c GIT binary patch literal 283872 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 P9LBHsB~9NP_Rs$Z*-JI~ literal 0 HcmV?d00001 diff --git a/ecen320/rx_decoder/Spartan3EMaster.ucf b/ecen320/rx_decoder/Spartan3EMaster.ucf new file mode 100644 index 0000000..f56fe51 --- /dev/null +++ b/ecen320/rx_decoder/Spartan3EMaster.ucf @@ -0,0 +1,231 @@ +# This file is a general .ucf for Nexys2 rev A board +# To use it in a project: +# - remove or comment the lines corresponding to unused pins +# - rename the used signals according to the project + + +## clock pin for Nexys 2 Board +NET "clk" LOC = "B8"; # Bank = 0, Pin name = IP_L13P_0/GCLK8, Type = GCLK, Sch name = GCLK0 +#NET "clk" TNM_NET = "clk"; +#TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %; + +##NET "clk1" LOC = "U9"; # Bank = 2, Pin name = IO_L13P_2/D4/GCLK14, Type = DUAL/GCLK, Sch name = GCLK1 +# +## Leds +#NET "Led<0>" LOC = "J14"; # Bank = 1, Pin name = IO_L14N_1/A3/RHCLK7, Type = RHCLK/DUAL, Sch name = JD10/LD0 +#NET "Led<1>" LOC = "J15"; # Bank = 1, Pin name = IO_L14P_1/A4/RHCLK6, Type = RHCLK/DUAL, Sch name = JD9/LD1 +#NET "Led<2>" LOC = "K15"; # Bank = 1, Pin name = IO_L12P_1/A8/RHCLK2, Type = RHCLK/DUAL, Sch name = JD8/LD2 +#NET "Led<3>" LOC = "K14"; # Bank = 1, Pin name = IO_L12N_1/A7/RHCLK3/TRDY1, Type = RHCLK/DUAL, Sch name = JD7/LD3 +#NET "Led<4>" LOC = "E17"; # Bank = 1, Pin name = IO, Type = I/O, Sch name = LD4 +#NET "Led<5>" LOC = "P15"; # Bank = 1, Pin name = IO, Type = I/O, Sch name = LD5 +#NET "Led<6>" LOC = "F4"; # Bank = 3, Pin name = IO, Type = I/O, Sch name = LD6 +#NET "Led<7>" LOC = "R4"; # Bank = 3, Pin name = IO/VREF_3, Type = VREF, Sch name = LD7 + +## Switches +NET "sw<0>" LOC = "G18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW0 +NET "sw<1>" LOC = "H18"; # Bank = 1, Pin name = IP/VREF_1, Type = VREF, Sch name = SW1 +NET "sw<2>" LOC = "K18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW2 +NET "sw<3>" LOC = "K17"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW3 +NET "sw<4>" LOC = "L14"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW4 +NET "sw<5>" LOC = "L13"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW5 +NET "sw<6>" LOC = "N17"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW6 +NET "sw<7>" LOC = "R17"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW7 + +## Buttons +NET "btn<0>" LOC = "B18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = BTN0 +NET "btn<1>" LOC = "D18"; # Bank = 1, Pin name = IP/VREF_1, Type = VREF, Sch name = BTN1 +NET "btn<2>" LOC = "E18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = BTN2 +NET "btn<3>" LOC = "H13"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = BTN3 + +## 7 segment display +NET "seg<0>" LOC = "L18"; # Bank = 1, Pin name = IO_L10P_1, Type = I/O, Sch name = CA +NET "seg<1>" LOC = "F18"; # Bank = 1, Pin name = IO_L19P_1, Type = I/O, Sch name = CB +NET "seg<2>" LOC = "D17"; # Bank = 1, Pin name = IO_L23P_1/HDC, Type = DUAL, Sch name = CC +NET "seg<3>" LOC = "D16"; # Bank = 1, Pin name = IO_L23N_1/LDC0, Type = DUAL, Sch name = CD +NET "seg<4>" LOC = "G14"; # Bank = 1, Pin name = IO_L20P_1, Type = I/O, Sch name = CE +NET "seg<5>" LOC = "J17"; # Bank = 1, Pin name = IO_L13P_1/A6/RHCLK4/IRDY1, Type = RHCLK/DUAL, Sch name = CF +NET "seg<6>" LOC = "H14"; # Bank = 1, Pin name = IO_L17P_1, Type = I/O, Sch name = CG +NET "dp" LOC = "C17"; # Bank = 1, Pin name = IO_L24N_1/LDC2, Type = DUAL, Sch name = DP + +NET "an<0>" LOC = "F17"; # Bank = 1, Pin name = IO_L19N_1, Type = I/O, Sch name = AN0 +NET "an<1>" LOC = "H17"; # Bank = 1, Pin name = IO_L16N_1/A0, Type = DUAL, Sch name = AN1 +NET "an<2>" LOC = "C18"; # Bank = 1, Pin name = IO_L24P_1/LDC1, Type = DUAL, Sch name = AN2 +NET "an<3>" LOC = "F15"; # Bank = 1, Pin name = IO_L21P_1, Type = I/O, Sch name = AN3 + +## VGA Connector +NET "rgb<7>" LOC = "R9"; # Bank = 2, Pin name = IO/D5, Type = DUAL, Sch name = RED0 +NET "rgb<6>" LOC = "T8"; # Bank = 2, Pin name = IO_L10N_2, Type = I/O, Sch name = RED1 +NET "rgb<5>" LOC = "R8"; # Bank = 2, Pin name = IO_L10P_2, Type = I/O, Sch name = RED2 +NET "rgb<4>" LOC = "N8"; # Bank = 2, Pin name = IO_L09N_2, Type = I/O, Sch name = GRN0 +NET "rgb<3>" LOC = "P8"; # Bank = 2, Pin name = IO_L09P_2, Type = I/O, Sch name = GRN1 +NET "rgb<2>" LOC = "P6"; # Bank = 2, Pin name = IO_L05N_2, Type = I/O, Sch name = GRN2 +NET "rgb<1>" LOC = "U5"; # Bank = 2, Pin name = IO/VREF_2, Type = VREF, Sch name = BLU1 +NET "rgb<0>" LOC = "U4"; # Bank = 2, Pin name = IO_L03P_2/DOUT/BUSY, Type = DUAL, Sch name = BLU2 + +NET "hs_out" LOC = "T4"; # Bank = 2, Pin name = IO_L03N_2/MOSI/CSI_B, Type = DUAL, Sch name = HSYNC +NET "vs_out" LOC = "U3"; # Bank = 2, Pin name = IO_L01P_2/CSO_B, Type = DUAL, Sch name = VSYNC + +## RS232 connector +NET "rx_in" LOC = "U6"; # Bank = 2, Pin name = IP, Type = INPUT, Sch name = RS-RX +#NET "RsTx" LOC = "P9"; # Bank = 2, Pin name = IO, Type = I/O, Sch name = RS-TX + +## PS/2 connector +#NET "PS2C" LOC = "R12"; # Bank = 2, Pin name = IO_L20N_2, Type = I/O, Sch name = PS2C +#NET "PS2D" LOC = "P11"; # Bank = 2, Pin name = IO_L18P_2, Type = I/O, Sch name = PS2D + +## onBoard Cellular RAM and StrataFlash +#NET "MemOE" LOC = "T2"; # Bank = 3, Pin name = IO_L24P_3, Type = I/O, Sch name = OE +#NET "MemWR" LOC = "N7"; # Bank = 2, Pin name = IO_L07P_2, Type = I/O, Sch name = WE + +#NET "RamAdv" LOC = "J4"; # Bank = 3, Pin name = IO_L11N_3/LHCLK1, Type = LHCLK, Sch name = MT-ADV +#NET "RamCS" LOC = "R6"; # Bank = 2, Pin name = IO_L05P_2, Type = I/O, Sch name = MT-CE +#NET "RamClk" LOC = "H5"; # Bank = 3, Pin name = IO_L08N_3, Type = I/O, Sch name = MT-CLK +#NET "RamCRE" LOC = "P7"; # Bank = 2, Pin name = IO_L07N_2, Type = I/O, Sch name = MT-CRE +#NET "RamLB" LOC = "K5"; # Bank = 3, Pin name = IO_L14N_3/LHCLK7, Type = LHCLK, Sch name = MT-LB +#NET "RamUB" LOC = "K4"; # Bank = 3, Pin name = IO_L13N_3/LHCLK5, Type = LHCLK, Sch name = MT-UB +#NET "RamWait" LOC = "F5"; # Bank = 3, Pin name = IP, Type = INPUT, Sch name = MT-WAIT + +#NET "FlashRp" LOC = "T5"; # Bank = 2, Pin name = IO_L04N_2, Type = I/O, Sch name = RP# +#NET "FlashCS" LOC = "R5"; # Bank = 2, Pin name = IO_L04P_2, Type = I/O, Sch name = ST-CE +#NET "FlashStSts" LOC = "D3"; # Bank = 3, Pin name = IP, Type = INPUT, Sch name = ST-STS + +#NET "MemAdr<1>" LOC = "J1"; # Bank = 3, Pin name = IO_L12P_3/LHCLK2, Type = LHCLK, Sch name = ADR1 +#NET "MemAdr<2>" LOC = "J2"; # Bank = 3, Pin name = IO_L12N_3/LHCLK3/IRDY2, Type = LHCLK, Sch name = ADR2 +#NET "MemAdr<3>" LOC = "H4"; # Bank = 3, Pin name = IO_L09P_3, Type = I/O, Sch name = ADR3 +#NET "MemAdr<4>" LOC = "H1"; # Bank = 3, Pin name = IO_L10N_3, Type = I/O, Sch name = ADR4 +#NET "MemAdr<5>" LOC = "H2"; # Bank = 3, Pin name = IO_L10P_3, Type = I/O, Sch name = ADR5 +#NET "MemAdr<6>" LOC = "J5"; # Bank = 3, Pin name = IO_L11P_3/LHCLK0, Type = LHCLK, Sch name = ADR6 +#NET "MemAdr<7>" LOC = "H3"; # Bank = 3, Pin name = IO_L09N_3, Type = I/O, Sch name = ADR7 +#NET "MemAdr<8>" LOC = "H6"; # Bank = 3, Pin name = IO_L08P_3, Type = I/O, Sch name = ADR8 +#NET "MemAdr<9>" LOC = "F1"; # Bank = 3, Pin name = IO_L05P_3, Type = I/O, Sch name = ADR9 +#NET "MemAdr<10>" LOC = "G3"; # Bank = 3, Pin name = IO_L06P_3, Type = I/O, Sch name = ADR10 +#NET "MemAdr<11>" LOC = "G6"; # Bank = 3, Pin name = IO_L07P_3, Type = I/O, Sch name = ADR11 +#NET "MemAdr<12>" LOC = "G5"; # Bank = 3, Pin name = IO_L07N_3, Type = I/O, Sch name = ADR12 +#NET "MemAdr<13>" LOC = "G4"; # Bank = 3, Pin name = IO_L06N_3/VREF_3, Type = VREF, Sch name = ADR13 +#NET "MemAdr<14>" LOC = "F2"; # Bank = 3, Pin name = IO_L05N_3, Type = I/O, Sch name = ADR14 +#NET "MemAdr<15>" LOC = "E1"; # Bank = 3, Pin name = IO_L03N_3, Type = I/O, Sch name = ADR15 +#NET "MemAdr<16>" LOC = "M5"; # Bank = 3, Pin name = IO_L19P_3, Type = I/O, Sch name = ADR16 +#NET "MemAdr<17>" LOC = "E2"; # Bank = 3, Pin name = IO_L03P_3, Type = I/O, Sch name = ADR17 +#NET "MemAdr<18>" LOC = "C2"; # Bank = 3, Pin name = IO_L01N_3, Type = I/O, Sch name = ADR18 +#NET "MemAdr<19>" LOC = "C1"; # Bank = 3, Pin name = IO_L01P_3, Type = I/O, Sch name = ADR19 +#NET "MemAdr<20>" LOC = "D2"; # Bank = 3, Pin name = IO_L02N_3/VREF_3, Type = VREF, Sch name = ADR20 +#NET "MemAdr<21>" LOC = "K3"; # Bank = 3, Pin name = IO_L13P_3/LHCLK4/TRDY2, Type = LHCLK, Sch name = ADR21 +#NET "MemAdr<22>" LOC = "D1"; # Bank = 3, Pin name = IO_L02P_3, Type = I/O, Sch name = ADR22 +#NET "MemAdr<23>" LOC = "K6"; # Bank = 3, Pin name = IO_L14P_3/LHCLK6, Type = LHCLK, Sch name = ADR23 + +#NET "MemDB<0>" LOC = "L1"; # Bank = 3, Pin name = IO_L15P_3, Type = I/O, Sch name = DB0 +#NET "MemDB<1>" LOC = "L4"; # Bank = 3, Pin name = IO_L16N_3, Type = I/O, Sch name = DB1 +#NET "MemDB<2>" LOC = "L6"; # Bank = 3, Pin name = IO_L17P_3, Type = I/O, Sch name = DB2 +#NET "MemDB<3>" LOC = "M4"; # Bank = 3, Pin name = IO_L18P_3, Type = I/O, Sch name = DB3 +#NET "MemDB<4>" LOC = "N5"; # Bank = 3, Pin name = IO_L20N_3, Type = I/O, Sch name = DB4 +#NET "MemDB<5>" LOC = "P1"; # Bank = 3, Pin name = IO_L21N_3, Type = I/O, Sch name = DB5 +#NET "MemDB<6>" LOC = "P2"; # Bank = 3, Pin name = IO_L21P_3, Type = I/O, Sch name = DB6 +#NET "MemDB<7>" LOC = "R2"; # Bank = 3, Pin name = IO_L23N_3, Type = I/O, Sch name = DB7 +#NET "MemDB<8>" LOC = "L3"; # Bank = 3, Pin name = IO_L16P_3, Type = I/O, Sch name = DB8 +#NET "MemDB<9>" LOC = "L5"; # Bank = 3, Pin name = IO_L17N_3/VREF_3, Type = VREF, Sch name = DB9 +#NET "MemDB<10>" LOC = "M3"; # Bank = 3, Pin name = IO_L18N_3, Type = I/O, Sch name = DB10 +#NET "MemDB<11>" LOC = "M6"; # Bank = 3, Pin name = IO_L19N_3, Type = I/O, Sch name = DB11 +#NET "MemDB<12>" LOC = "L2"; # Bank = 3, Pin name = IO_L15N_3, Type = I/O, Sch name = DB12 +#NET "MemDB<13>" LOC = "N4"; # Bank = 3, Pin name = IO_L20P_3, Type = I/O, Sch name = DB13 +#NET "MemDB<14>" LOC = "R3"; # Bank = 3, Pin name = IO_L23P_3, Type = I/O, Sch name = DB14 +#NET "MemDB<15>" LOC = "T1"; # Bank = 3, Pin name = IO_L24N_3, Type = I/O, Sch name = DB15 + +## FX2 connector +#NET "PIO<0>" LOC = "B4"; # Bank = 0, Pin name = IO_L24N_0, Type = I/O, Sch name = R-IO1 +#NET "PIO<1>" LOC = "A4"; # Bank = 0, Pin name = IO_L24P_0, Type = I/O, Sch name = R-IO2 +#NET "PIO<2>" LOC = "C3"; # Bank = 0, Pin name = IO_L25P_0, Type = I/O, Sch name = R-IO3 +#NET "PIO<3>" LOC = "C4"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO4 +#NET "PIO<4>" LOC = "B6"; # Bank = 0, Pin name = IO_L20P_0, Type = I/O, Sch name = R-IO5 +#NET "PIO<5>" LOC = "D5"; # Bank = 0, Pin name = IO_L23N_0/VREF_0, Type = VREF, Sch name = R-IO6 +#NET "PIO<6>" LOC = "C5"; # Bank = 0, Pin name = IO_L23P_0, Type = I/O, Sch name = R-IO7 +#NET "PIO<7>" LOC = "F7"; # Bank = 0, Pin name = IO_L19P_0, Type = I/O, Sch name = R-IO8 +#NET "PIO<8>" LOC = "E7"; # Bank = 0, Pin name = IO_L19N_0/VREF_0, Type = VREF, Sch name = R-IO9 +#NET "PIO<9>" LOC = "A6"; # Bank = 0, Pin name = IO_L20N_0, Type = I/O, Sch name = R-IO10 +#NET "PIO<10>" LOC = "C7"; # Bank = 0, Pin name = IO_L18P_0, Type = I/O, Sch name = R-IO11 +#NET "PIO<11>" LOC = "F8"; # Bank = 0, Pin name = IO_L17N_0, Type = I/O, Sch name = R-IO12 +#NET "PIO<12>" LOC = "D7"; # Bank = 0, Pin name = IO_L18N_0/VREF_0, Type = VREF, Sch name = R-IO13 +#NET "PIO<13>" LOC = "E8"; # Bank = 0, Pin name = IO_L17P_0, Type = I/O, Sch name = R-IO14 +#NET "PIO<14>" LOC = "E9"; # Bank = 0, Pin name = IO_L15P_0, Type = I/O, Sch name = R-IO15 +#NET "PIO<15>" LOC = "C9"; # Bank = 0, Pin name = IO_L14P_0/GCLK10, Type = GCLK, Sch name = R-IO16 +#NET "PIO<16>" LOC = "A8"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO17 +#NET "PIO<17>" LOC = "G9"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO18 +#NET "PIO<18>" LOC = "F9"; # Bank = 0, Pin name = IO_L15N_0, Type = I/O, Sch name = R-IO19 +#NET "PIO<19>" LOC = "D10"; # Bank = 0, Pin name = IO_L11P_0/GCLK4, Type = GCLK, Sch name = R-IO20 +#NET "PIO<20>" LOC = "A10"; # Bank = 0, Pin name = IO_L12N_0/GCLK7, Type = GCLK, Sch name = R-IO21 +#NET "PIO<21>" LOC = "B10"; # Bank = 0, Pin name = IO_L12P_0/GCLK6, Type = GCLK, Sch name = R-IO22 +#NET "PIO<22>" LOC = "A11"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO23 +#NET "PIO<23>" LOC = "D11"; # Bank = 0, Pin name = IO_L09N_0, Type = I/O, Sch name = R-IO24 +#NET "PIO<24>" LOC = "E10"; # Bank = 0, Pin name = IO_L11N_0/GCLK5, Type = GCLK, Sch name = R-IO25 +#NET "PIO<25>" LOC = "B11"; # Bank = 0, Pin name = IO/VREF_0, Type = VREF, Sch name = R-IO26 +#NET "PIO<26>" LOC = "C11"; # Bank = 0, Pin name = IO_L09P_0, Type = I/O, Sch name = R-IO27 +#NET "PIO<27>" LOC = "E11"; # Bank = 0, Pin name = IO_L08P_0, Type = I/O, Sch name = R-IO28 +#NET "PIO<28>" LOC = "F11"; # Bank = 0, Pin name = IO_L08N_0, Type = I/O, Sch name = R-IO29 +#NET "PIO<29>" LOC = "E12"; # Bank = 0, Pin name = IO_L06N_0, Type = I/O, Sch name = R-IO30 +#NET "PIO<30>" LOC = "F12"; # Bank = 0, Pin name = IO_L06P_0, Type = I/O, Sch name = R-IO31 +#NET "PIO<31>" LOC = "A13"; # Bank = 0, Pin name = IO_L05P_0, Type = I/O, Sch name = R-IO32 +#NET "PIO<32>" LOC = "B13"; # Bank = 0, Pin name = IO_L05N_0/VREF_0, Type = VREF, Sch name = R-IO33 +#NET "PIO<33>" LOC = "E13"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO34 +#NET "PIO<34>" LOC = "A14"; # Bank = 0, Pin name = IO_L04N_0, Type = I/O, Sch name = R-IO35 +#NET "PIO<35>" LOC = "C14"; # Bank = 0, Pin name = IO_L03N_0/VREF_0, Type = VREF, Sch name = R-IO36 +#NET "PIO<36>" LOC = "D14"; # Bank = 0, Pin name = IO_L03P_0, Type = I/O, Sch name = R-IO37 +#NET "PIO<37>" LOC = "B14"; # Bank = 0, Pin name = IO_L04P_0, Type = I/O, Sch name = R-IO38 +#NET "PIO<38>" LOC = "A16"; # Bank = 0, Pin name = IO_L01N_0, Type = I/O, Sch name = R-IO39 +#NET "PIO<39>" LOC = "B16"; # Bank = 0, Pin name = IO_L01P_0, Type = I/O, Sch name = R-IO40 + +## 12 pin connectors +#NET "JA<0>" LOC = "L15"; # Bank = 1, Pin name = IO_L09N_1/A11, Type = DUAL, Sch name = JA1 +#NET "JA<1>" LOC = "K12"; # Bank = 1, Pin name = IO_L11N_1/A9/RHCLK1, Type = RHCLK/DUAL, Sch name = JA2 +#NET "JA<2>" LOC = "L17"; # Bank = 1, Pin name = IO_L10N_1/VREF_1, Type = VREF, Sch name = JA3 +#NET "JA<3>" LOC = "M15"; # Bank = 1, Pin name = IO_L07P_1, Type = I/O, Sch name = JA4 +#NET "JA<4>" LOC = "K13"; # Bank = 1, Pin name = IO_L11P_1/A10/RHCLK0, Type = RHCLK/DUAL, Sch name = JA7 +#NET "JA<5>" LOC = "L16"; # Bank = 1, Pin name = IO_L09P_1/A12, Type = DUAL, Sch name = JA8 +#NET "JA<6>" LOC = "M14"; # Bank = 1, Pin name = IO_L05P_1, Type = I/O, Sch name = JA9 +#NET "JA<7>" LOC = "M16"; # Bank = 1, Pin name = IO_L07N_1, Type = I/O, Sch name = JA10 +#NET "JB<0>" LOC = "M13"; # Bank = 1, Pin name = IO_L05N_1/VREF_1, Type = VREF, Sch name = JB1 +#NET "JB<1>" LOC = "R18"; # Bank = 1, Pin name = IO_L02P_1/A14, Type = DUAL, Sch name = JB2 +#NET "JB<2>" LOC = "R15"; # Bank = 1, Pin name = IO_L03P_1, Type = I/O, Sch name = JB3 +#NET "JB<3>" LOC = "T17"; # Bank = 1, Pin name = IO_L01N_1/A15, Type = DUAL, Sch name = JB4 +#NET "JB<4>" LOC = "P17"; # Bank = 1, Pin name = IO_L06P_1, Type = I/O, Sch name = JB7 +#NET "JB<5>" LOC = "R16"; # Bank = 1, Pin name = IO_L03N_1/VREF_1, Type = VREF, Sch name = JB8 +#NET "JB<6>" LOC = "T18"; # Bank = 1, Pin name = IO_L02N_1/A13, Type = DUAL, Sch name = JB9 +#NET "JB<7>" LOC = "U18"; # Bank = 1, Pin name = IO_L01P_1/A16, Type = DUAL, Sch name = JB10 +#NET "JC<0>" LOC = "G15"; # Bank = 1, Pin name = IO_L18P_1, Type = I/O, Sch name = JC1 +#NET "JC<1>" LOC = "J16"; # Bank = 1, Pin name = IO_L13N_1/A5/RHCLK5, Type = RHCLK/DUAL, Sch name = JC2 +#NET "JC<2>" LOC = "G13"; # Bank = 1, Pin name = IO_L20N_1, Type = I/O, Sch name = JC3 +#NET "JC<3>" LOC = "H16"; # Bank = 1, Pin name = IO_L16P_1, Type = I/O, Sch name = JC4 +#NET "JC<4>" LOC = "H15"; # Bank = 1, Pin name = IO_L17N_1, Type = I/O, Sch name = JC7 +#NET "JC<5>" LOC = "F14"; # Bank = 1, Pin name = IO_L21N_1, Type = I/O, Sch name = JC8 +#NET "JC<6>" LOC = "G16"; # Bank = 1, Pin name = IO_L18N_1, Type = I/O, Sch name = JC9 +#NET "JC<7>" LOC = "J12"; # Bank = 1, Pin name = IO_L15P_1/A2, Type = DUAL, Sch name = JC10 +#NET "JD<0>" LOC = "J13"; # Bank = 1, Pin name = IO_L15N_1/A1, Type = DUAL, Sch name = JD1 +#NET "JD<1>" LOC = "M18"; # Bank = 1, Pin name = IO_L08N_1, Type = I/O, Sch name = JD2 +#NET "JD<2>" LOC = "N18"; # Bank = 1, Pin name = IO_L08P_1, Type = I/O, Sch name = JD3 +#NET "JD<3>" LOC = "P18"; # Bank = 1, Pin name = IO_L06N_1, Type = I/O, Sch name = JD4 + +## onBoard USB controller +#NET "EppAstb" LOC = "V14"; # Bank = 2, Pin name = IP_L23P_2, Type = INPUT, Sch name = U-FLAGA +#NET "EppDstb" LOC = "U14"; # Bank = 2, Pin name = IP_L23N_2, Type = INPUT, Sch name = U-FLAGB +#NET "UsbFlag" LOC = "V16"; # Bank = 2, Pin name = IP, Type = INPUT, Sch name = U-FLAGC +#NET "EppWait" LOC = "N9"; # Bank = 2, Pin name = IO_L12P_2/D7/GCLK12, Type = DUAL/GCLK, Sch name = U-SLRD +#NET "EppDB<0>" LOC = "R14"; # Bank = 2, Pin name = IO_L24N_2/A20, Type = DUAL, Sch name = U-FD0 +#NET "EppDB<1>" LOC = "R13"; # Bank = 2, Pin name = IO_L22N_2/A22, Type = DUAL, Sch name = U-FD1 +#NET "EppDB<2>" LOC = "P13"; # Bank = 2, Pin name = IO_L22P_2/A23, Type = DUAL, Sch name = U-FD2 +#NET "EppDB<3>" LOC = "T12"; # Bank = 2, Pin name = IO_L20P_2, Type = I/O, Sch name = U-FD3 +#NET "EppDB<4>" LOC = "N11"; # Bank = 2, Pin name = IO_L18N_2, Type = I/O, Sch name = U-FD4 +#NET "EppDB<5>" LOC = "R11"; # Bank = 2, Pin name = IO, Type = I/O, Sch name = U-FD5 +#NET "EppDB<6>" LOC = "P10"; # Bank = 2, Pin name = IO_L15N_2/D1/GCLK3, Type = DUAL/GCLK, Sch name = U-FD6 +#NET "EppDB<7>" LOC = "R10"; # Bank = 2, Pin name = IO_L15P_2/D2/GCLK2, Type = DUAL/GCLK, Sch name = U-FD7 + +#NET "UsbClk" LOC = "T15"; # Bank = 2, Pin name = IO/VREF_2, Type = VREF, Sch name = U-IFCLK + +#NET "UsbOE" LOC = "V15"; # Bank = 2, Pin name = IO_L25P_2/VS2/A19, Type = DUAL, Sch name = U-SLOE +#NET "UsbWR" LOC = "V9"; # Bank = 2, Pin name = IO_L13N_2/D3/GCLK15, Type = DUAL/GCLK, Sch name = U-SWLR +#NET "UsbPktEnd" LOC = "V12"; # Bank = 2, Pin name = IO_L19P_2, Type = I/O, Sch name = U-PKTEND + +#NET "UsbDir" LOC = "T16"; # Bank = 2, Pin name = IO_L26P_2/VS0/A17, Type = DUAL, Sch name = U-SLCS +#NET "UsbMode" LOC = "U15"; # Bank = 2, Pin name = IO_L25N_2/VS1/A18, Type = DUAL, Sch name = U-INT0# + +#NET "UsbAdr<0>" LOC = "T14"; # Bank = 2, Pin name = IO_L24P_2/A21, Type = DUAL, Sch name = U-FIFOAD0 +#NET "UsbAdr<1>" LOC = "V13"; # Bank = 2, Pin name = IO_L19N_2/VREF_2, Type = VREF, Sch name = U-FIFOAD1 + +##NET "UsbRdy" LOC = "U13"; # Bank = 2, Pin name = IP, Type = INPUT, Sch name = U-RDY diff --git a/ecen320/rx_decoder/charGen.vhd b/ecen320/rx_decoder/charGen.vhd new file mode 100644 index 0000000..9169e63 --- /dev/null +++ b/ecen320/rx_decoder/charGen.vhd @@ -0,0 +1,76 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity charGen is + port( + clk: in std_logic; + char_we: in std_logic; + char_value: in std_logic_vector(7 downto 0); + char_addr: in std_logic_vector(11 downto 0); + pixel_x, pixel_y: in std_logic_vector(9 downto 0); + pixel_out: out std_logic + ); +end charGen; + +architecture charGen_arch of charGen is + + component char_mem + port( + clk: in std_logic; + char_read_addr : in std_logic_vector(11 downto 0); + char_write_addr: in std_logic_vector(11 downto 0); + char_we : in std_logic; + char_write_value : in std_logic_vector(7 downto 0); + char_read_value : out std_logic_vector(7 downto 0) + ); + end component; + + component font_rom + port( + clk: in std_logic; + addr: in std_logic_vector(10 downto 0); + data: out std_logic_vector(7 downto 0) + ); + end component; + + signal rom_addr: std_logic_vector(10 downto 0); + signal ram_read_addr: std_logic_vector(11 downto 0); + signal ram_value: std_logic_vector(7 downto 0); + signal myselect: std_logic_vector(2 downto 0); + signal temp1: std_logic_vector(2 downto 0); + signal rom_dataout: std_logic_vector(7 downto 0); + + begin + myram: char_mem + port map(clk=>clk, char_read_addr=>ram_read_addr, char_write_addr=>char_addr, char_we=>char_we, char_write_value=>char_value, char_read_value=>ram_value + ); + myrom: font_rom + port map(clk=>clk, addr=>rom_addr, data=>rom_dataout + ); + + process(clk) + begin + if(rising_edge(clk)) then + temp1 <= pixel_x(2 downto 0); + myselect <= temp1; + end if; + end process; + + + with myselect select + pixel_out <= rom_dataout(7) when "000", + rom_dataout(6) when "001", + rom_dataout(5) when "010", + rom_dataout(4) when "011", + rom_dataout(3) when "100", + rom_dataout(2) when "101", + rom_dataout(1) when "110", + rom_dataout(0) when others; + + + ram_read_addr <= pixel_y(8 downto 4) & pixel_x(9 downto 3); + + rom_addr <= ram_value(6 downto 0) & pixel_y(3 downto 0); + +end charGen_arch; \ No newline at end of file diff --git a/ecen320/rx_decoder/charGen_top.vhd b/ecen320/rx_decoder/charGen_top.vhd new file mode 100644 index 0000000..edb3655 --- /dev/null +++ b/ecen320/rx_decoder/charGen_top.vhd @@ -0,0 +1,241 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity charGen_top is + port( + clk: in std_logic; + rgb: out std_logic_vector(7 downto 0); + hs_out, vs_out: out std_logic; + sw: in std_logic_vector(7 downto 0); + seg : out std_logic_vector(6 downto 0); + an : out std_logic_vector(3 downto 0) := "1100"; + dp : out std_logic; + rx_in : in std_logic; + btn: in std_logic_vector(3 downto 0) + ); +end charGen_top; + +architecture top_charGen of charGen_top is + + component charGen + port( + clk: in std_logic; + char_we: in std_logic; + char_value: in std_logic_vector(7 downto 0); + char_addr: in std_logic_vector(11 downto 0); + pixel_x, pixel_y: in std_logic_vector(9 downto 0); + pixel_out: out std_logic + ); + end component; + + component vga_timing is + port( + clk, rst: in std_logic; + HS, VS: out std_logic; + pixel_x, pixel_y: out std_logic_vector(9 downto 0); + last_column, last_row: out std_logic; + blank: out std_logic + ); + end component; + + component seven_segment_display + generic( + COUNTER_BITS: natural := 15 + ); + port( + clk: in std_logic; + data_in: in std_logic_vector(15 downto 0); + dp_in: in std_logic_Vector(3 downto 0); + blank: in std_logic_vector(3 downto 0); + seg : out std_logic_vector(6 downto 0); + dp : out std_logic; + an : out std_logic_vector(3 downto 0) + ); + end component; + + component rx + port( + clk: in std_logic; + rst: in std_logic; + data_out: out std_logic_vector(7 downto 0); + data_strobe: out std_logic; + rx_in: in std_logic; + rx_busy:out std_logic + ); + end component; + + signal temp_x,temp_y: std_logic_vector(9 downto 0); + signal hs,vs: std_logic; + signal temp_hs,temp_vs: std_logic := '0'; + signal reset: std_logic := '0'; + signal dp_in: std_logic_vector(3 downto 0) := "0000"; + signal blank4: std_logic_vector(3 downto 0) := (others=>'0'); + signal data_in: std_logic_vector(15 downto 0) := (others=>'0'); + signal pixel_out: std_logic; + signal count: natural := 0; + signal count_next: natural; + signal count_en: std_logic; + signal char_we: std_logic; + signal row_position, column_position: natural := 0; + signal row_next, column_next: natural; + signal row_en: std_logic; + signal char_write_addr: std_logic_vector(11 downto 0) := (others=>'0'); + signal blank: std_logic := '0'; + signal font_color: std_logic_vector(7 downto 0) := (others=>'0'); + signal back_color: std_logic_vector(7 downto 0) := (others=>'0'); + + + -------rx top signals + signal reset1: std_logic := '0'; + signal data_out2: std_logic_vector(7 downto 0) := (others=>'0'); + signal data_strobe: std_logic; + signal reg_left,reg_right: std_logic_vector(7 downto 0) := (others=>'0'); + signal reg_right_temp: std_logic_vector(7 downto 0); + signal delay_data1, delay_data2: std_logic; + signal temp: std_logic_vector(15 downto 0) := (others=>'0'); + signal decrypt: std_logic_vector(15 downto 0) := (others=>'0'); + + signal go: std_logic := '0'; + + begin + bottom_level: vga_timing + port map(clk=>clk, rst=>reset, pixel_x=>temp_x, pixel_y=>temp_y, blank=>blank, + HS=>hs, VS=>vs, last_column=>open, last_row=>open + ); + + bottom_charGen: charGen + port map(clk=>clk, char_we=>char_we, char_value=>reg_right, char_addr=>char_write_addr, pixel_x=>temp_x, pixel_y=>temp_y, pixel_out=>pixel_out + ); + +-- bottom_segment: seven_segment_display +-- generic map(COUNTER_BITS=>15) +-- port map(clk=>clk, an=>an, seg=>seg, dp=>dp, blank=>blank4, +-- data_in=>data_in, dp_in=>dp_in +-- ); + --- this is from rx_Top----- + bottom_segment: seven_segment_display + generic map(COUNTER_BITS=>15) + port map(clk=>clk, an=>an, seg=>seg, dp=>dp, blank=>blank4, + data_in=>temp, dp_in=>dp_in + ); + + + + bottom_rx: rx + port map(clk=>clk, rst=>reset1, data_out=>data_out2, + data_strobe=>data_strobe, rx_in=>delay_data2, rx_busy=>open + ); + ------------rx top code------------------------- + --temp <= (reg_left & reg_right); + + process(clk) + begin + if(rising_edge(clk)) then + delay_data1 <= rx_in; + delay_data2 <= delay_data1; + if(data_strobe='1') then + reg_left <= reg_right; + reg_right <= std_logic_vector(unsigned(data_out2) - unsigned(sw)); + end if; + end if; + end process; + + ------------end of rx top code----------------- + + + ---------------***********************************----------------------------- + -- to do decryption you need to make temp signal and take reg_right + -- and do the subtraction and pipe that temp signal into char_gen line 104 + ---------------***********************************----------------------------- + --reg_right_temp <= reg_right; + decrypt <= std_logic_vector(std_logic_vector(unsigned(reg_left) - unsigned(sw)) & std_logic_vector(unsigned(reg_right) - unsigned(sw))); + temp <= decrypt; + --data_in <= "00000000" & temp; + data_in <= temp; + + -- delaying counter + process(clk) + begin + if(rising_edge(clk)) then + count <= count_next; + end if; + end process; + count_next <= 0 when count=4000000 else + count + 1; + count_en <= '1' when count=4000000 else + '0'; + + -- row_position, column_position logic + + row_next <= row_position+1 when row_position < 30 else + 0; + column_next <= column_position+1 when column_position < 79 else + 0; + row_en <= '1' when column_position = 79 else + '0'; + char_write_addr <= std_logic_vector(to_unsigned(row_position,5)) & std_logic_vector(to_unsigned(column_position,7)); + + + font_color <= sw(7 downto 0); + back_color <= not sw(7 downto 0); + + -- color logic + rgb <= std_logic_vector(font_color) when pixel_out='1' else + std_logic_vector(back_color) when blank = '0' else + "00000000"; + + char_we <= '1' when count_en='1' and go = '1' else + '0'; + + process(clk) + begin + if(rising_edge(clk)) then + if(data_strobe = '1') then + go <='1'; + end if; + if(char_we = '1') then + go <='0'; + end if; + end if; + end process; + + -- button logic + process(clk,btn,count_en,go) + begin + if(rising_edge(clk)) then + if (btn(3)='1') then + reset <= '1'; + column_position <= 0; + row_position <= 0; + elsif (go = '1') then + if(count_en='1') then + reset <= '0'; + column_position <= column_next; + if(row_en='1') then + row_position <= row_next; + -- font_color <= font_color+1; + if(row_position=0) then + --back_color <= back_color+1; + end if; + end if; + + end if; + else + reset <= '0'; + end if; + end if; + end process; + + -- making delays for HS, VS + process(clk,hs,vs) + begin + if(rising_edge(clk)) then + temp_hs <= hs; + temp_vs <= vs; + hs_out <= temp_hs; + vs_out <= temp_vs; + end if; + end process; + +end top_charGen; \ No newline at end of file diff --git a/ecen320/rx_decoder/char_mem.vhd b/ecen320/rx_decoder/char_mem.vhd new file mode 100644 index 0000000..679e345 --- /dev/null +++ b/ecen320/rx_decoder/char_mem.vhd @@ -0,0 +1,341 @@ +-- VGA Character Memory +-- +-- This memory can store 128x32 characters where each character is +-- 8 bits. The memory is dual ported providing a port +-- to read the characters and a port to write the characters. +-- +-- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity char_mem is + port( + clk: in std_logic; + char_read_addr : in std_logic_vector(11 downto 0); + char_write_addr: in std_logic_vector(11 downto 0); + char_we : in std_logic; + char_write_value : in std_logic_vector(7 downto 0); + char_read_value : out std_logic_vector(7 downto 0) + ); +end char_mem; + +architecture arch of char_mem is + + constant CHAR_RAM_ADDR_WIDTH: integer := 12; -- 2^7 X 2^5 + constant CHAR_RAM_WIDTH: integer := 8; -- 8 bits per character + type char_ram_type is array (0 to 2**CHAR_RAM_ADDR_WIDTH-1) + of std_logic_vector(CHAR_RAM_WIDTH-1 downto 0); + signal read_a : std_logic_vector(11 downto 0); + + -- character memory signal + signal char_ram : char_ram_type := ( + + -- Initial Value of character memory + + -- Line 0 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 1 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 2 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 3 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 4 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 5 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 6 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 7 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 8 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 9 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 10 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 11 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 12 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 13 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 14 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 15 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 16 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 17 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 18 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 19 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 20 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 21 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 22 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 23 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 24 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 25 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 26 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 27 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 28 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 29 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"52",--End of visible characters + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 30 + X"59",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"52",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"52", + -- Line 31 + X"60",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"52",X"52" + ); +begin + + -- character memory concurrent statement + process(clk) + begin + if (clk'event and clk='1') then + if (char_we = '1') then + char_ram(to_integer(unsigned(char_write_addr))) <= char_write_value; + end if; + read_a <= char_read_addr; + end if; + end process; + char_read_value <= char_ram(to_integer(unsigned(read_a))); + +end arch; + diff --git a/ecen320/rx_decoder/font_rom.vhd b/ecen320/rx_decoder/font_rom.vhd new file mode 100644 index 0000000..6f70575 --- /dev/null +++ b/ecen320/rx_decoder/font_rom.vhd @@ -0,0 +1,2215 @@ +-- Listing 13.1 +-- ROM with synchonous read (inferring Block RAM) +-- character ROM +-- - 8-by-16 (8-by-2^4) font +-- - 128 (2^7) characters +-- - ROM size: 512-by-8 (2^11-by-8) bits +-- 16K bits: 1 BRAM + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +entity font_rom is + port( + clk: in std_logic; + addr: in std_logic_vector(10 downto 0); + data: out std_logic_vector(7 downto 0) + ); +end font_rom; + +architecture arch of font_rom is + constant ADDR_WIDTH: integer:=11; + constant DATA_WIDTH: integer:=8; + signal addr_reg: std_logic_vector(ADDR_WIDTH-1 downto 0); + type rom_type is array (0 to 2**ADDR_WIDTH-1) + of std_logic_vector(DATA_WIDTH-1 downto 0); + -- ROM definition + constant ROM: rom_type:=( -- 2^11-by-8 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x01 + "00000000", -- 0 + "00000000", -- 1 + "01111110", -- 2 ****** + "10000001", -- 3 * * + "10100101", -- 4 * * * * + "10000001", -- 5 * * + "10000001", -- 6 * * + "10111101", -- 7 * **** * + "10011001", -- 8 * ** * + "10000001", -- 9 * * + "10000001", -- a * * + "01111110", -- b ****** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x02 + "00000000", -- 0 + "00000000", -- 1 + "01111110", -- 2 ****** + "11111111", -- 3 ******** + "11011011", -- 4 ** ** ** + "11111111", -- 5 ******** + "11111111", -- 6 ******** + "11000011", -- 7 ** ** + "11100111", -- 8 *** *** + "11111111", -- 9 ******** + "11111111", -- a ******** + "01111110", -- b ****** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x03 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "01101100", -- 4 ** ** + "11111110", -- 5 ******* + "11111110", -- 6 ******* + "11111110", -- 7 ******* + "11111110", -- 8 ******* + "01111100", -- 9 ***** + "00111000", -- a *** + "00010000", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x04 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00010000", -- 4 * + "00111000", -- 5 *** + "01111100", -- 6 ***** + "11111110", -- 7 ******* + "01111100", -- 8 ***** + "00111000", -- 9 *** + "00010000", -- a * + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x05 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00011000", -- 3 ** + "00111100", -- 4 **** + "00111100", -- 5 **** + "11100111", -- 6 *** *** + "11100111", -- 7 *** *** + "11100111", -- 8 *** *** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x06 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00011000", -- 3 ** + "00111100", -- 4 **** + "01111110", -- 5 ****** + "11111111", -- 6 ******** + "11111111", -- 7 ******** + "01111110", -- 8 ****** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x07 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00011000", -- 6 ** + "00111100", -- 7 **** + "00111100", -- 8 **** + "00011000", -- 9 ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x08 + "11111111", -- 0 ******** + "11111111", -- 1 ******** + "11111111", -- 2 ******** + "11111111", -- 3 ******** + "11111111", -- 4 ******** + "11111111", -- 5 ******** + "11100111", -- 6 *** *** + "11000011", -- 7 ** ** + "11000011", -- 8 ** ** + "11100111", -- 9 *** *** + "11111111", -- a ******** + "11111111", -- b ******** + "11111111", -- c ******** + "11111111", -- d ******** + "11111111", -- e ******** + "11111111", -- f ******** + -- code x09 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00111100", -- 5 **** + "01100110", -- 6 ** ** + "01000010", -- 7 * * + "01000010", -- 8 * * + "01100110", -- 9 ** ** + "00111100", -- a **** + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0a + "11111111", -- 0 ******** + "11111111", -- 1 ******** + "11111111", -- 2 ******** + "11111111", -- 3 ******** + "11111111", -- 4 ******** + "11000011", -- 5 ** ** + "10011001", -- 6 * ** * + "10111101", -- 7 * **** * + "10111101", -- 8 * **** * + "10011001", -- 9 * ** * + "11000011", -- a ** ** + "11111111", -- b ******** + "11111111", -- c ******** + "11111111", -- d ******** + "11111111", -- e ******** + "11111111", -- f ******** + -- code x0b + "00000000", -- 0 + "00000000", -- 1 + "00011110", -- 2 **** + "00001110", -- 3 *** + "00011010", -- 4 ** * + "00110010", -- 5 ** * + "01111000", -- 6 **** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01111000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0c + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01100110", -- 6 ** ** + "00111100", -- 7 **** + "00011000", -- 8 ** + "01111110", -- 9 ****** + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0d + "00000000", -- 0 + "00000000", -- 1 + "00111111", -- 2 ****** + "00110011", -- 3 ** ** + "00111111", -- 4 ****** + "00110000", -- 5 ** + "00110000", -- 6 ** + "00110000", -- 7 ** + "00110000", -- 8 ** + "01110000", -- 9 *** + "11110000", -- a **** + "11100000", -- b *** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0e + "00000000", -- 0 + "00000000", -- 1 + "01111111", -- 2 ******* + "01100011", -- 3 ** ** + "01111111", -- 4 ******* + "01100011", -- 5 ** ** + "01100011", -- 6 ** ** + "01100011", -- 7 ** ** + "01100011", -- 8 ** ** + "01100111", -- 9 ** *** + "11100111", -- a *** *** + "11100110", -- b *** ** + "11000000", -- c ** + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00011000", -- 3 ** + "00011000", -- 4 ** + "11011011", -- 5 ** ** ** + "00111100", -- 6 **** + "11100111", -- 7 *** *** + "00111100", -- 8 **** + "11011011", -- 9 ** ** ** + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x10 + "00000000", -- 0 + "10000000", -- 1 * + "11000000", -- 2 ** + "11100000", -- 3 *** + "11110000", -- 4 **** + "11111000", -- 5 ***** + "11111110", -- 6 ******* + "11111000", -- 7 ***** + "11110000", -- 8 **** + "11100000", -- 9 *** + "11000000", -- a ** + "10000000", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x11 + "00000000", -- 0 + "00000010", -- 1 * + "00000110", -- 2 ** + "00001110", -- 3 *** + "00011110", -- 4 **** + "00111110", -- 5 ***** + "11111110", -- 6 ******* + "00111110", -- 7 ***** + "00011110", -- 8 **** + "00001110", -- 9 *** + "00000110", -- a ** + "00000010", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x12 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00111100", -- 3 **** + "01111110", -- 4 ****** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "01111110", -- 8 ****** + "00111100", -- 9 **** + "00011000", -- a ** + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x13 + "00000000", -- 0 + "00000000", -- 1 + "01100110", -- 2 ** ** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01100110", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "00000000", -- 9 + "01100110", -- a ** ** + "01100110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x14 + "00000000", -- 0 + "00000000", -- 1 + "01111111", -- 2 ******* + "11011011", -- 3 ** ** ** + "11011011", -- 4 ** ** ** + "11011011", -- 5 ** ** ** + "01111011", -- 6 **** ** + "00011011", -- 7 ** ** + "00011011", -- 8 ** ** + "00011011", -- 9 ** ** + "00011011", -- a ** ** + "00011011", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x15 + "00000000", -- 0 + "01111100", -- 1 ***** + "11000110", -- 2 ** ** + "01100000", -- 3 ** + "00111000", -- 4 *** + "01101100", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "01101100", -- 8 ** ** + "00111000", -- 9 *** + "00001100", -- a ** + "11000110", -- b ** ** + "01111100", -- c ***** + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x16 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "11111110", -- 8 ******* + "11111110", -- 9 ******* + "11111110", -- a ******* + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x17 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00111100", -- 3 **** + "01111110", -- 4 ****** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "01111110", -- 8 ****** + "00111100", -- 9 **** + "00011000", -- a ** + "01111110", -- b ****** + "00110000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x18 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00111100", -- 3 **** + "01111110", -- 4 ****** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x19 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "01111110", -- 9 ****** + "00111100", -- a **** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1a + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00011000", -- 5 ** + "00001100", -- 6 ** + "11111110", -- 7 ******* + "00001100", -- 8 ** + "00011000", -- 9 ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1b + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00110000", -- 5 ** + "01100000", -- 6 ** + "11111110", -- 7 ******* + "01100000", -- 8 ** + "00110000", -- 9 ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1c + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "11000000", -- 6 ** + "11000000", -- 7 ** + "11000000", -- 8 ** + "11111110", -- 9 ******* + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1d + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00100100", -- 5 * * + "01100110", -- 6 ** ** + "11111111", -- 7 ******** + "01100110", -- 8 ** ** + "00100100", -- 9 * * + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1e + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00010000", -- 4 * + "00111000", -- 5 *** + "00111000", -- 6 *** + "01111100", -- 7 ***** + "01111100", -- 8 ***** + "11111110", -- 9 ******* + "11111110", -- a ******* + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "11111110", -- 4 ******* + "11111110", -- 5 ******* + "01111100", -- 6 ***** + "01111100", -- 7 ***** + "00111000", -- 8 *** + "00111000", -- 9 *** + "00010000", -- a * + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x20 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x21 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00111100", -- 3 **** + "00111100", -- 4 **** + "00111100", -- 5 **** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00000000", -- 9 + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x22 + "00000000", -- 0 + "01100110", -- 1 ** ** + "01100110", -- 2 ** ** + "01100110", -- 3 ** ** + "00100100", -- 4 * * + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x23 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "01101100", -- 3 ** ** + "01101100", -- 4 ** ** + "11111110", -- 5 ******* + "01101100", -- 6 ** ** + "01101100", -- 7 ** ** + "01101100", -- 8 ** ** + "11111110", -- 9 ******* + "01101100", -- a ** ** + "01101100", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x24 + "00011000", -- 0 ** + "00011000", -- 1 ** + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000010", -- 4 ** * + "11000000", -- 5 ** + "01111100", -- 6 ***** + "00000110", -- 7 ** + "00000110", -- 8 ** + "10000110", -- 9 * ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00011000", -- c ** + "00011000", -- d ** + "00000000", -- e + "00000000", -- f + -- code x25 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "11000010", -- 4 ** * + "11000110", -- 5 ** ** + "00001100", -- 6 ** + "00011000", -- 7 ** + "00110000", -- 8 ** + "01100000", -- 9 ** + "11000110", -- a ** ** + "10000110", -- b * ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x26 + "00000000", -- 0 + "00000000", -- 1 + "00111000", -- 2 *** + "01101100", -- 3 ** ** + "01101100", -- 4 ** ** + "00111000", -- 5 *** + "01110110", -- 6 *** ** + "11011100", -- 7 ** *** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01110110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x27 + "00000000", -- 0 + "00110000", -- 1 ** + "00110000", -- 2 ** + "00110000", -- 3 ** + "01100000", -- 4 ** + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x28 + "00000000", -- 0 + "00000000", -- 1 + "00001100", -- 2 ** + "00011000", -- 3 ** + "00110000", -- 4 ** + "00110000", -- 5 ** + "00110000", -- 6 ** + "00110000", -- 7 ** + "00110000", -- 8 ** + "00110000", -- 9 ** + "00011000", -- a ** + "00001100", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x29 + "00000000", -- 0 + "00000000", -- 1 + "00110000", -- 2 ** + "00011000", -- 3 ** + "00001100", -- 4 ** + "00001100", -- 5 ** + "00001100", -- 6 ** + "00001100", -- 7 ** + "00001100", -- 8 ** + "00001100", -- 9 ** + "00011000", -- a ** + "00110000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2a + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01100110", -- 5 ** ** + "00111100", -- 6 **** + "11111111", -- 7 ******** + "00111100", -- 8 **** + "01100110", -- 9 ** ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2b + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00011000", -- 5 ** + "00011000", -- 6 ** + "01111110", -- 7 ****** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2c + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00011000", -- 9 ** + "00011000", -- a ** + "00011000", -- b ** + "00110000", -- c ** + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2d + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "01111110", -- 7 ****** + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2e + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000010", -- 4 * + "00000110", -- 5 ** + "00001100", -- 6 ** + "00011000", -- 7 ** + "00110000", -- 8 ** + "01100000", -- 9 ** + "11000000", -- a ** + "10000000", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x30 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11001110", -- 5 ** *** + "11011110", -- 6 ** **** + "11110110", -- 7 **** ** + "11100110", -- 8 *** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x31 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 + "00111000", -- 3 + "01111000", -- 4 ** + "00011000", -- 5 *** + "00011000", -- 6 **** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "01111110", -- b ** + "00000000", -- c ** + "00000000", -- d ****** + "00000000", -- e + "00000000", -- f + -- code x32 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "00000110", -- 4 ** + "00001100", -- 5 ** + "00011000", -- 6 ** + "00110000", -- 7 ** + "01100000", -- 8 ** + "11000000", -- 9 ** + "11000110", -- a ** ** + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x33 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "00000110", -- 4 ** + "00000110", -- 5 ** + "00111100", -- 6 **** + "00000110", -- 7 ** + "00000110", -- 8 ** + "00000110", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x34 + "00000000", -- 0 + "00000000", -- 1 + "00001100", -- 2 ** + "00011100", -- 3 *** + "00111100", -- 4 **** + "01101100", -- 5 ** ** + "11001100", -- 6 ** ** + "11111110", -- 7 ******* + "00001100", -- 8 ** + "00001100", -- 9 ** + "00001100", -- a ** + "00011110", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x35 + "00000000", -- 0 + "00000000", -- 1 + "11111110", -- 2 ******* + "11000000", -- 3 ** + "11000000", -- 4 ** + "11000000", -- 5 ** + "11111100", -- 6 ****** + "00000110", -- 7 ** + "00000110", -- 8 ** + "00000110", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x36 + "00000000", -- 0 + "00000000", -- 1 + "00111000", -- 2 *** + "01100000", -- 3 ** + "11000000", -- 4 ** + "11000000", -- 5 ** + "11111100", -- 6 ****** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x37 + "00000000", -- 0 + "00000000", -- 1 + "11111110", -- 2 ******* + "11000110", -- 3 ** ** + "00000110", -- 4 ** + "00000110", -- 5 ** + "00001100", -- 6 ** + "00011000", -- 7 ** + "00110000", -- 8 ** + "00110000", -- 9 ** + "00110000", -- a ** + "00110000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x38 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "01111100", -- 6 ***** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x39 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "01111110", -- 6 ****** + "00000110", -- 7 ** + "00000110", -- 8 ** + "00000110", -- 9 ** + "00001100", -- a ** + "01111000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3a + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00011000", -- 4 ** + "00011000", -- 5 ** + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00011000", -- 9 ** + "00011000", -- a ** + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3b + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00011000", -- 4 ** + "00011000", -- 5 ** + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00011000", -- 9 ** + "00011000", -- a ** + "00110000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3c + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000110", -- 3 ** + "00001100", -- 4 ** + "00011000", -- 5 ** + "00110000", -- 6 ** + "01100000", -- 7 ** + "00110000", -- 8 ** + "00011000", -- 9 ** + "00001100", -- a ** + "00000110", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3d + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111110", -- 5 ****** + "00000000", -- 6 + "00000000", -- 7 + "01111110", -- 8 ****** + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3e + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "01100000", -- 3 ** + "00110000", -- 4 ** + "00011000", -- 5 ** + "00001100", -- 6 ** + "00000110", -- 7 ** + "00001100", -- 8 ** + "00011000", -- 9 ** + "00110000", -- a ** + "01100000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3f + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "00001100", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00000000", -- 9 + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x40 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11011110", -- 6 ** **** + "11011110", -- 7 ** **** + "11011110", -- 8 ** **** + "11011100", -- 9 ** *** + "11000000", -- a ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x41 + "00000000", -- 0 + "00000000", -- 1 + "00010000", -- 2 * + "00111000", -- 3 *** + "01101100", -- 4 ** ** + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11111110", -- 7 ******* + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "11000110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x42 + "00000000", -- 0 + "00000000", -- 1 + "11111100", -- 2 ****** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01111100", -- 6 ***** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "11111100", -- b ****** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x43 + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "01100110", -- 3 ** ** + "11000010", -- 4 ** * + "11000000", -- 5 ** + "11000000", -- 6 ** + "11000000", -- 7 ** + "11000000", -- 8 ** + "11000010", -- 9 ** * + "01100110", -- a ** ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x44 + "00000000", -- 0 + "00000000", -- 1 + "11111000", -- 2 ***** + "01101100", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01100110", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01101100", -- a ** ** + "11111000", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x45 + "00000000", -- 0 + "00000000", -- 1 + "11111110", -- 2 ******* + "01100110", -- 3 ** ** + "01100010", -- 4 ** * + "01101000", -- 5 ** * + "01111000", -- 6 **** + "01101000", -- 7 ** * + "01100000", -- 8 ** + "01100010", -- 9 ** * + "01100110", -- a ** ** + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x46 + "00000000", -- 0 + "00000000", -- 1 + "11111110", -- 2 ******* + "01100110", -- 3 ** ** + "01100010", -- 4 ** * + "01101000", -- 5 ** * + "01111000", -- 6 **** + "01101000", -- 7 ** * + "01100000", -- 8 ** + "01100000", -- 9 ** + "01100000", -- a ** + "11110000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x47 + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "01100110", -- 3 ** ** + "11000010", -- 4 ** * + "11000000", -- 5 ** + "11000000", -- 6 ** + "11011110", -- 7 ** **** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "01100110", -- a ** ** + "00111010", -- b *** * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x48 + "00000000", -- 0 + "00000000", -- 1 + "11000110", -- 2 ** ** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11111110", -- 6 ******* + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "11000110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x49 + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4a + "00000000", -- 0 + "00000000", -- 1 + "00011110", -- 2 **** + "00001100", -- 3 ** + "00001100", -- 4 ** + "00001100", -- 5 ** + "00001100", -- 6 ** + "00001100", -- 7 ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01111000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4b + "00000000", -- 0 + "00000000", -- 1 + "11100110", -- 2 *** ** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01101100", -- 5 ** ** + "01111000", -- 6 **** + "01111000", -- 7 **** + "01101100", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "11100110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4c + "00000000", -- 0 + "00000000", -- 1 + "11110000", -- 2 **** + "01100000", -- 3 ** + "01100000", -- 4 ** + "01100000", -- 5 ** + "01100000", -- 6 ** + "01100000", -- 7 ** + "01100000", -- 8 ** + "01100010", -- 9 ** * + "01100110", -- a ** ** + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4d + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11100111", -- 3 *** *** + "11111111", -- 4 ******** + "11111111", -- 5 ******** + "11011011", -- 6 ** ** ** + "11000011", -- 7 ** ** + "11000011", -- 8 ** ** + "11000011", -- 9 ** ** + "11000011", -- a ** ** + "11000011", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4e + "00000000", -- 0 + "00000000", -- 1 + "11000110", -- 2 ** ** + "11100110", -- 3 *** ** + "11110110", -- 4 **** ** + "11111110", -- 5 ******* + "11011110", -- 6 ** **** + "11001110", -- 7 ** *** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "11000110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4f + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x50 + "00000000", -- 0 + "00000000", -- 1 + "11111100", -- 2 ****** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01111100", -- 6 ***** + "01100000", -- 7 ** + "01100000", -- 8 ** + "01100000", -- 9 ** + "01100000", -- a ** + "11110000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x510 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11010110", -- 9 ** * ** + "11011110", -- a ** **** + "01111100", -- b ***** + "00001100", -- c ** + "00001110", -- d *** + "00000000", -- e + "00000000", -- f + -- code x52 + "00000000", -- 0 + "00000000", -- 1 + "11111100", -- 2 ****** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01111100", -- 6 ***** + "01101100", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "11100110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x53 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "01100000", -- 5 ** + "00111000", -- 6 *** + "00001100", -- 7 ** + "00000110", -- 8 ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x54 + "00000000", -- 0 + "00000000", -- 1 + "11111111", -- 2 ******** + "11011011", -- 3 ** ** ** + "10011001", -- 4 * ** * + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x55 + "00000000", -- 0 + "00000000", -- 1 + "11000110", -- 2 ** ** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x56 + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11000011", -- 3 ** ** + "11000011", -- 4 ** ** + "11000011", -- 5 ** ** + "11000011", -- 6 ** ** + "11000011", -- 7 ** ** + "11000011", -- 8 ** ** + "01100110", -- 9 ** ** + "00111100", -- a **** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x57 + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11000011", -- 3 ** ** + "11000011", -- 4 ** ** + "11000011", -- 5 ** ** + "11000011", -- 6 ** ** + "11011011", -- 7 ** ** ** + "11011011", -- 8 ** ** ** + "11111111", -- 9 ******** + "01100110", -- a ** ** + "01100110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + + -- code x58 + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11000011", -- 3 ** ** + "01100110", -- 4 ** ** + "00111100", -- 5 **** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00111100", -- 8 **** + "01100110", -- 9 ** ** + "11000011", -- a ** ** + "11000011", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x59 + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11000011", -- 3 ** ** + "11000011", -- 4 ** ** + "01100110", -- 5 ** ** + "00111100", -- 6 **** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5a + "00000000", -- 0 + "00000000", -- 1 + "11111111", -- 2 ******** + "11000011", -- 3 ** ** + "10000110", -- 4 * ** + "00001100", -- 5 ** + "00011000", -- 6 ** + "00110000", -- 7 ** + "01100000", -- 8 ** + "11000001", -- 9 ** * + "11000011", -- a ** ** + "11111111", -- b ******** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5b + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "00110000", -- 3 ** + "00110000", -- 4 ** + "00110000", -- 5 ** + "00110000", -- 6 ** + "00110000", -- 7 ** + "00110000", -- 8 ** + "00110000", -- 9 ** + "00110000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5c + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "10000000", -- 3 * + "11000000", -- 4 ** + "11100000", -- 5 *** + "01110000", -- 6 *** + "00111000", -- 7 *** + "00011100", -- 8 *** + "00001110", -- 9 *** + "00000110", -- a ** + "00000010", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5d + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "00001100", -- 3 ** + "00001100", -- 4 ** + "00001100", -- 5 ** + "00001100", -- 6 ** + "00001100", -- 7 ** + "00001100", -- 8 ** + "00001100", -- 9 ** + "00001100", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5e + "00010000", -- 0 * + "00111000", -- 1 *** + "01101100", -- 2 ** ** + "11000110", -- 3 ** ** + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "11111111", -- d ******** + "00000000", -- e + "00000000", -- f + -- code x60 + "00110000", -- 0 ** + "00110000", -- 1 ** + "00011000", -- 2 ** + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x61 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111000", -- 5 **** + "00001100", -- 6 ** + "01111100", -- 7 ***** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01110110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x62 + "00000000", -- 0 + "00000000", -- 1 + "11100000", -- 2 *** + "01100000", -- 3 ** + "01100000", -- 4 ** + "01111000", -- 5 **** + "01101100", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x63 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111100", -- 5 ***** + "11000110", -- 6 ** ** + "11000000", -- 7 ** + "11000000", -- 8 ** + "11000000", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x64 + "00000000", -- 0 + "00000000", -- 1 + "00011100", -- 2 *** + "00001100", -- 3 ** + "00001100", -- 4 ** + "00111100", -- 5 **** + "01101100", -- 6 ** ** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01110110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x65 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111100", -- 5 ***** + "11000110", -- 6 ** ** + "11111110", -- 7 ******* + "11000000", -- 8 ** + "11000000", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x66 + "00000000", -- 0 + "00000000", -- 1 + "00111000", -- 2 *** + "01101100", -- 3 ** ** + "01100100", -- 4 ** * + "01100000", -- 5 ** + "11110000", -- 6 **** + "01100000", -- 7 ** + "01100000", -- 8 ** + "01100000", -- 9 ** + "01100000", -- a ** + "11110000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x67 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01110110", -- 5 *** ** + "11001100", -- 6 ** ** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01111100", -- b ***** + "00001100", -- c ** + "11001100", -- d ** ** + "01111000", -- e **** + "00000000", -- f + -- code x68 + "00000000", -- 0 + "00000000", -- 1 + "11100000", -- 2 *** + "01100000", -- 3 ** + "01100000", -- 4 ** + "01101100", -- 5 ** ** + "01110110", -- 6 *** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "11100110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x69 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00011000", -- 3 ** + "00000000", -- 4 + "00111000", -- 5 *** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6a + "00000000", -- 0 + "00000000", -- 1 + "00000110", -- 2 ** + "00000110", -- 3 ** + "00000000", -- 4 + "00001110", -- 5 *** + "00000110", -- 6 ** + "00000110", -- 7 ** + "00000110", -- 8 ** + "00000110", -- 9 ** + "00000110", -- a ** + "00000110", -- b ** + "01100110", -- c ** ** + "01100110", -- d ** ** + "00111100", -- e **** + "00000000", -- f + -- code x6b + "00000000", -- 0 + "00000000", -- 1 + "11100000", -- 2 *** + "01100000", -- 3 ** + "01100000", -- 4 ** + "01100110", -- 5 ** ** + "01101100", -- 6 ** ** + "01111000", -- 7 **** + "01111000", -- 8 **** + "01101100", -- 9 ** ** + "01100110", -- a ** ** + "11100110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6c + "00000000", -- 0 + "00000000", -- 1 + "00111000", -- 2 *** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6d + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11100110", -- 5 *** ** + "11111111", -- 6 ******** + "11011011", -- 7 ** ** ** + "11011011", -- 8 ** ** ** + "11011011", -- 9 ** ** ** + "11011011", -- a ** ** ** + "11011011", -- b ** ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6e + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11011100", -- 5 ** *** + "01100110", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "01100110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111100", -- 5 ***** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x70 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11011100", -- 5 ** *** + "01100110", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "01111100", -- b ***** + "01100000", -- c ** + "01100000", -- d ** + "11110000", -- e **** + "00000000", -- f + -- code x71 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01110110", -- 5 *** ** + "11001100", -- 6 ** ** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01111100", -- b ***** + "00001100", -- c ** + "00001100", -- d ** + "00011110", -- e **** + "00000000", -- f + -- code x72 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11011100", -- 5 ** *** + "01110110", -- 6 *** ** + "01100110", -- 7 ** ** + "01100000", -- 8 ** + "01100000", -- 9 ** + "01100000", -- a ** + "11110000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x73 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111100", -- 5 ***** + "11000110", -- 6 ** ** + "01100000", -- 7 ** + "00111000", -- 8 *** + "00001100", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x74 + "00000000", -- 0 + "00000000", -- 1 + "00010000", -- 2 * + "00110000", -- 3 ** + "00110000", -- 4 ** + "11111100", -- 5 ****** + "00110000", -- 6 ** + "00110000", -- 7 ** + "00110000", -- 8 ** + "00110000", -- 9 ** + "00110110", -- a ** ** + "00011100", -- b *** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x75 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11001100", -- 5 ** ** + "11001100", -- 6 ** ** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01110110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x76 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11000011", -- 5 ** ** + "11000011", -- 6 ** ** + "11000011", -- 7 ** ** + "11000011", -- 8 ** ** + "01100110", -- 9 ** ** + "00111100", -- a **** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x77 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11000011", -- 5 ** ** + "11000011", -- 6 ** ** + "11000011", -- 7 ** ** + "11011011", -- 8 ** ** ** + "11011011", -- 9 ** ** ** + "11111111", -- a ******** + "01100110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x78 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11000011", -- 5 ** ** + "01100110", -- 6 ** ** + "00111100", -- 7 **** + "00011000", -- 8 ** + "00111100", -- 9 **** + "01100110", -- a ** ** + "11000011", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x79 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111110", -- b ****** + "00000110", -- c ** + "00001100", -- d ** + "11111000", -- e ***** + "00000000", -- f + -- code x7a + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11111110", -- 5 ******* + "11001100", -- 6 ** ** + "00011000", -- 7 ** + "00110000", -- 8 ** + "01100000", -- 9 ** + "11000110", -- a ** ** + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7b + "00000000", -- 0 + "00000000", -- 1 + "00001110", -- 2 *** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "01110000", -- 6 *** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00001110", -- b *** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7c + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00000000", -- 6 + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7d + "00000000", -- 0 + "00000000", -- 1 + "01110000", -- 2 *** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00001110", -- 6 *** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "01110000", -- b *** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7e + "00000000", -- 0 + "00000000", -- 1 + "01110110", -- 2 *** ** + "11011100", -- 3 ** *** + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00010000", -- 4 * + "00111000", -- 5 *** + "01101100", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11111110", -- a ******* + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000" -- f + ); +begin + -- addr register to infer block RAM + process (clk) + begin + if (clk'event and clk = '1') then + addr_reg <= addr; + end if; + end process; + data <= ROM(to_integer(unsigned(addr_reg))); +end arch; + diff --git a/ecen320/rx_decoder/rx.vhd b/ecen320/rx_decoder/rx.vhd new file mode 100644 index 0000000..24b587d --- /dev/null +++ b/ecen320/rx_decoder/rx.vhd @@ -0,0 +1,179 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity rx is + generic( + CLK_RATE: natural := 50_000_000; + BAUD_RATE: natural := 19_200 + ); + port( + clk: in std_logic; + rst: in std_logic; + rx_in: in std_logic; + data_out: out std_logic_vector(7 downto 0); + data_strobe: out std_logic; + rx_busy:out std_logic + + --send_character: in std_logic; + ); +end rx; + +architecture receive_arch of rx is + function log2c(n: integer) return integer is + variable m, p: integer; + begin + m := 0; + p := 1; + while p'0'); + signal counter_next: unsigned(BIT_COUNTER_BITS downto 0); + + type fsm_state_type is + (power_up,idle,strt,b0,b1,b2,b3,b4,b5,b6,b7,stp); + signal state_reg, state_next: fsm_state_type; + + -- BitTimer signal + signal rx_bit: std_logic := '0' ; + signal rx_bit_half: std_logic := '0' ; + +begin + + -- FSM + process(clk,rst) + begin + if(rst='1') then + state_reg <= idle; + elsif(clk'event and clk='1') then + state_reg <= state_next; + end if; + end process; + + process(state_reg,rx_in,rx_bit,rx_bit_half) + begin + state_next <= state_reg; + rx_busy <= '1'; + data_strobe <= '0'; + case state_reg is + when idle => + rx_busy <= '0'; + if(rx_in='0') then + state_next <= strt; + end if; + when strt => + if(rx_bit='1') then + state_next <= b0; + end if; + when b0 => + if(rx_bit='1') then + state_next <= b1; + else + if(rx_bit_half='1') then + data_out(0) <= rx_in; + end if; + end if; + when b1 => + if(rx_bit='1') then + state_next <= b2; + else + if(rx_bit_half='1') then + data_out(1) <= rx_in; + end if; + end if; + when b2 => + if(rx_bit='1') then + state_next <= b3; + else + if(rx_bit_half='1') then + data_out(2) <= rx_in; + end if; + end if; + when b3 => + if(rx_bit='1') then + state_next <= b4; + else + if(rx_bit_half='1') then + data_out(3) <= rx_in; + end if; + end if; + when b4 => + if(rx_bit='1') then + state_next <= b5; + else + if(rx_bit_half='1') then + data_out(4) <= rx_in; + end if; + end if; + when b5 => + if(rx_bit='1') then + state_next <= b6; + else + if(rx_bit_half='1') then + data_out(5) <= rx_in; + end if; + end if; + when b6 => + if(rx_bit='1') then + state_next <= b7; + else + if(rx_bit_half='1') then + data_out(6) <= rx_in; + end if; + end if; + when b7 => + if(rx_bit='1') then + state_next <= stp; + else + if(rx_bit_half='1') then + data_out(7) <= rx_in; + end if; + end if; + when stp => + if(rx_bit='0') then + state_next <= stp; + elsif(rx_bit='1' and rx_in='1') then + state_next <= idle; + data_strobe <= '1'; + elsif (rx_bit='1' and rx_in='0') then + state_next <= power_up; + end if; + when power_up => + if(rx_in='1') then + state_next <= idle; + end if; + end case; + end process; + + --data_strobe <= '1' when (state_reg=stp) and (state_next=idle) else + -- '0'; + + -- BitTimer + process(clk,rst) + begin + if(rst='1') then + counter <= (others=>'0'); + elsif(clk'event and clk='1') then + counter <= counter_next; + end if; + end process; + + counter_next <= (others=>'0') when counter = to_unsigned(BIT_COUNTER_MAX_VAL,BIT_COUNTER_BITS) else + (others=>'0') when state_reg = idle else + counter+1; + + rx_bit <= '1' when counter = to_unsigned(BIT_COUNTER_MAX_VAL,BIT_COUNTER_BITS) else + '0'; + + rx_bit_half <= '1' when counter= to_unsigned(BIT_COUNTER_MAX_VAL, BIT_COUNTER_BITS)/2 else + '0'; + +end receive_arch; \ No newline at end of file diff --git a/ecen320/rx_decoder/seven_segment_display.vhd b/ecen320/rx_decoder/seven_segment_display.vhd new file mode 100644 index 0000000..d33416b --- /dev/null +++ b/ecen320/rx_decoder/seven_segment_display.vhd @@ -0,0 +1,78 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity seven_segment_display is + generic( + COUNTER_BITS: natural := 15 + ); + port( + clk: in std_logic; + data_in: in std_logic_vector(15 downto 0); + dp_in: in std_logic_vector(3 downto 0); + blank: in std_logic_vector(3 downto 0); + seg: out std_logic_vector(6 downto 0); + dp: out std_logic; + an: out std_logic_vector(3 downto 0) + ); +end seven_segment_display; + +architecture seven_arch of seven_segment_display is + --signal which_sym: std_logic_vector(3 downto 0); + signal mydatain, an_temp: std_logic_vector(3 downto 0); + signal r_reg: unsigned(COUNTER_BITS-1 downto 0):=(others=>'0'); + signal r_next: unsigned(COUNTER_BITS-1 downto 0); + signal anode_select: std_logic_vector(1 downto 0); +begin + --register + process(clk) + begin + if clk'event and clk='1' then + r_reg <= r_next; + end if; + end process; + --next-state logic + process(r_reg) + begin + r_next <= r_reg+1; + end process; + anode_select <= std_logic_vector(r_reg(COUNTER_BITS-1 downto COUNTER_BITS-2)); + + with mydatain select + seg <= "1000000" when "0000", + "1111001" when "0001", + "0100100" when "0010", + "0110000" when "0011", + "0011001" when "0100", + "0010010" when "0101", + "0000010" when "0110", + "1111000" when "0111", + "0000000" when "1000", + "0010000" when "1001", + "0001000" when "1010", + "0000011" when "1011", + "1000110" when "1100", + "0100001" when "1101", + "0000110" when "1110", + "0001110" when others; + + mydatain <= data_in(3 downto 0) when anode_select = "00" else + data_in(7 downto 4) when anode_select = "01" else + data_in(11 downto 8) when anode_select = "10" else + data_in(15 downto 12); + + + dp <= not dp_in(0) when anode_select="00" else + not dp_in(1) when anode_select="01" else + not dp_in(2) when anode_select="10" else + not dp_in(3); + + an_temp <= "1110" when anode_select="00" else + "1101" when anode_select="01" else + "1011" when anode_select="10" else + "0111" when anode_select="11" else + "0000"; + + an <= an_temp or blank; + +end seven_arch; \ No newline at end of file diff --git a/ecen320/rx_decoder/vga_timing.vhd b/ecen320/rx_decoder/vga_timing.vhd new file mode 100644 index 0000000..d7a170b --- /dev/null +++ b/ecen320/rx_decoder/vga_timing.vhd @@ -0,0 +1,78 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +entity vga_timing is + port( + clk, rst: in std_logic; + HS, VS: out std_logic; + pixel_x, pixel_y: out std_logic_vector(9 downto 0); + last_column, last_row: out std_logic; + blank: out std_logic + ); +end vga_timing; + +architecture vga_arch of vga_timing is + signal pixel_en: std_logic := '0'; + signal column: unsigned(9 downto 0) := (others=>'0'); + signal column_next: unsigned(9 downto 0); + signal row_en: std_logic; + signal row: unsigned(9 downto 0) := (others=>'0'); + signal row_next: unsigned(9 downto 0); + +begin + + -- pixel clock + process(clk,rst) + begin + if(rst='1') then + pixel_en <= '0'; + elsif(clk'event and clk='1') then + pixel_en <= not pixel_en; + end if; + end process; + + -- horizontal counter + process(pixel_en,rst) + begin + if(rst='1') then + column <= (others=>'0'); + elsif(pixel_en'event and pixel_en='1') then + column <= column_next; + end if; + end process; + column_next <= (others=>'0') when column=799 else + column + 1; + row_en <= '1' when column=799 else + '0'; + + -- vertical counter + process(row_en,rst) + begin + if(rst='1') then + row <= (others=>'0'); + elsif(row_en'event and row_en='1') then + row <= row_next; + end if; + end process; + row_next <= (others=>'0') when row=520 else + row + 1; + + + + + + --output logic + pixel_x <= std_logic_vector(column); + pixel_y <= std_logic_vector(row); + last_column <= '1' when column=639 else + '0'; + last_row <= '1' when row=479 else + '0'; + HS <= '0' when column >= 656 and column <= 751 else + '1'; + VS <= '0' when row >= 490 and row <= 491 else + '1'; + blank <= '0' when column >= 0 and column <= 639 and row >= 0 and row <= 479 else + '1'; + +end vga_arch; \ No newline at end of file diff --git a/ecen320/tx_encoder/Spartan3EMaster.ucf b/ecen320/tx_encoder/Spartan3EMaster.ucf new file mode 100644 index 0000000..5cb59b2 --- /dev/null +++ b/ecen320/tx_encoder/Spartan3EMaster.ucf @@ -0,0 +1,228 @@ +# This file is a general .ucf for Nexys2 rev A board +# To use it in a project: +# - remove or comment the lines corresponding to unused pins +# - rename the used signals according to the project + + +## clock pin for Nexys 2 Board +NET "clk" LOC = "B8"; # Bank = 0, Pin name = IP_L13P_0/GCLK8, Type = GCLK, Sch name = GCLK0 +##NET "clk1" LOC = "U9"; # Bank = 2, Pin name = IO_L13P_2/D4/GCLK14, Type = DUAL/GCLK, Sch name = GCLK1 +# +## Leds +#NET "led_reset" LOC = "J14"; # Bank = 1, Pin name = IO_L14N_1/A3/RHCLK7, Type = RHCLK/DUAL, Sch name = JD10/LD0 +#NET "Led<1>" LOC = "J15"; # Bank = 1, Pin name = IO_L14P_1/A4/RHCLK6, Type = RHCLK/DUAL, Sch name = JD9/LD1 +#NET "led_mem" LOC = "K15"; # Bank = 1, Pin name = IO_L12P_1/A8/RHCLK2, Type = RHCLK/DUAL, Sch name = JD8/LD2 +#NET "led_rw" LOC = "K14"; # Bank = 1, Pin name = IO_L12N_1/A7/RHCLK3/TRDY1, Type = RHCLK/DUAL, Sch name = JD7/LD3 +#NET "Led<4>" LOC = "E17"; # Bank = 1, Pin name = IO, Type = I/O, Sch name = LD4 +#NET "Led<5>" LOC = "P15"; # Bank = 1, Pin name = IO, Type = I/O, Sch name = LD5 +#NET "Led<6>" LOC = "F4"; # Bank = 3, Pin name = IO, Type = I/O, Sch name = LD6 +#NET "Led<7>" LOC = "R4"; # Bank = 3, Pin name = IO/VREF_3, Type = VREF, Sch name = LD7 + +## Switches +NET "sw<0>" LOC = "G18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW0 +NET "sw<1>" LOC = "H18"; # Bank = 1, Pin name = IP/VREF_1, Type = VREF, Sch name = SW1 +NET "sw<2>" LOC = "K18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW2 +NET "sw<3>" LOC = "K17"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW3 +NET "sw<4>" LOC = "L14"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW4 +NET "sw<5>" LOC = "L13"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW5 +NET "sw<6>" LOC = "N17"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW6 +NET "sw<7>" LOC = "R17"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = SW7 + +## Buttons +#NET "btn0" LOC = "B18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = BTN0 +#NET "btn<1>" LOC = "D18"; # Bank = 1, Pin name = IP/VREF_1, Type = VREF, Sch name = BTN1 +#NET "btn<2>" LOC = "E18"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = BTN2 +#NET "btn<3>" LOC = "H13"; # Bank = 1, Pin name = IP, Type = INPUT, Sch name = BTN3 + +### 7 segment display +NET "seg<0>" LOC = "L18"; # Bank = 1, Pin name = IO_L10P_1, Type = I/O, Sch name = CA +NET "seg<1>" LOC = "F18"; # Bank = 1, Pin name = IO_L19P_1, Type = I/O, Sch name = CB +NET "seg<2>" LOC = "D17"; # Bank = 1, Pin name = IO_L23P_1/HDC, Type = DUAL, Sch name = CC +NET "seg<3>" LOC = "D16"; # Bank = 1, Pin name = IO_L23N_1/LDC0, Type = DUAL, Sch name = CD +NET "seg<4>" LOC = "G14"; # Bank = 1, Pin name = IO_L20P_1, Type = I/O, Sch name = CE +NET "seg<5>" LOC = "J17"; # Bank = 1, Pin name = IO_L13P_1/A6/RHCLK4/IRDY1, Type = RHCLK/DUAL, Sch name = CF +NET "seg<6>" LOC = "H14"; # Bank = 1, Pin name = IO_L17P_1, Type = I/O, Sch name = CG +NET "dp" LOC = "C17"; # Bank = 1, Pin name = IO_L24N_1/LDC2, Type = DUAL, Sch name = DP + +NET "an<0>" LOC = "F17"; # Bank = 1, Pin name = IO_L19N_1, Type = I/O, Sch name = AN0 +NET "an<1>" LOC = "H17"; # Bank = 1, Pin name = IO_L16N_1/A0, Type = DUAL, Sch name = AN1 +NET "an<2>" LOC = "C18"; # Bank = 1, Pin name = IO_L24P_1/LDC1, Type = DUAL, Sch name = AN2 +NET "an<3>" LOC = "F15"; # Bank = 1, Pin name = IO_L21P_1, Type = I/O, Sch name = AN3 + +## VGA Connector +NET "rgb<7>" LOC = "R9"; # Bank = 2, Pin name = IO/D5, Type = DUAL, Sch name = RED0 +NET "rgb<6>" LOC = "T8"; # Bank = 2, Pin name = IO_L10N_2, Type = I/O, Sch name = RED1 +NET "rgb<5>" LOC = "R8"; # Bank = 2, Pin name = IO_L10P_2, Type = I/O, Sch name = RED2 +NET "rgb<4>" LOC = "N8"; # Bank = 2, Pin name = IO_L09N_2, Type = I/O, Sch name = GRN0 +NET "rgb<3>" LOC = "P8"; # Bank = 2, Pin name = IO_L09P_2, Type = I/O, Sch name = GRN1 +NET "rgb<2>" LOC = "P6"; # Bank = 2, Pin name = IO_L05N_2, Type = I/O, Sch name = GRN2 +NET "rgb<1>" LOC = "U5"; # Bank = 2, Pin name = IO/VREF_2, Type = VREF, Sch name = BLU1 +NET "rgb<0>" LOC = "U4"; # Bank = 2, Pin name = IO_L03P_2/DOUT/BUSY, Type = DUAL, Sch name = BLU2 + +NET "Hs_out" LOC = "T4"; # Bank = 2, Pin name = IO_L03N_2/MOSI/CSI_B, Type = DUAL, Sch name = HSYNC +NET "Vs_out" LOC = "U3"; # Bank = 2, Pin name = IO_L01P_2/CSO_B, Type = DUAL, Sch name = VSYNC + +## RS232 connector +#NET "RsRx" LOC = "U6"; # Bank = 2, Pin name = IP, Type = INPUT, Sch name = RS-RX +NET "btwn" LOC = "P9"; # Bank = 2, Pin name = IO, Type = I/O, Sch name = RS-TX + +## PS/2 connector +NET "ps2_clk" LOC = "R12"; # Bank = 2, Pin name = IO_L20N_2, Type = I/O, Sch name = PS2C +NET "ps2_data" LOC = "P11"; # Bank = 2, Pin name = IO_L18P_2, Type = I/O, Sch name = PS2D + +## onBoard Cellular RAM and StrataFlash +#NET "MemOE" LOC = "T2"; # Bank = 3, Pin name = IO_L24P_3, Type = I/O, Sch name = OE +#NET "MemWR" LOC = "N7"; # Bank = 2, Pin name = IO_L07P_2, Type = I/O, Sch name = WE +# +#NET "RamAdv" LOC = "J4"; # Bank = 3, Pin name = IO_L11N_3/LHCLK1, Type = LHCLK, Sch name = MT-ADV +#NET "RamCS" LOC = "R6"; # Bank = 2, Pin name = IO_L05P_2, Type = I/O, Sch name = MT-CE +#NET "RamClk" LOC = "H5"; # Bank = 3, Pin name = IO_L08N_3, Type = I/O, Sch name = MT-CLK +#NET "RamCRE" LOC = "P7"; # Bank = 2, Pin name = IO_L07N_2, Type = I/O, Sch name = MT-CRE +#NET "RamLB" LOC = "K5"; # Bank = 3, Pin name = IO_L14N_3/LHCLK7, Type = LHCLK, Sch name = MT-LB +#NET "RamUB" LOC = "K4"; # Bank = 3, Pin name = IO_L13N_3/LHCLK5, Type = LHCLK, Sch name = MT-UB +#NET "RamWait" LOC = "F5"; # Bank = 3, Pin name = IP, Type = INPUT, Sch name = MT-WAIT + +#NET "FlashRp" LOC = "T5"; # Bank = 2, Pin name = IO_L04N_2, Type = I/O, Sch name = RP# +#NET "FlashCS" LOC = "R5"; # Bank = 2, Pin name = IO_L04P_2, Type = I/O, Sch name = ST-CE +#NET "FlashStSts" LOC = "D3"; # Bank = 3, Pin name = IP, Type = INPUT, Sch name = ST-STS + +#NET "MemAdr<1>" LOC = "J1"; # Bank = 3, Pin name = IO_L12P_3/LHCLK2, Type = LHCLK, Sch name = ADR1 +#NET "MemAdr<2>" LOC = "J2"; # Bank = 3, Pin name = IO_L12N_3/LHCLK3/IRDY2, Type = LHCLK, Sch name = ADR2 +#NET "MemAdr<3>" LOC = "H4"; # Bank = 3, Pin name = IO_L09P_3, Type = I/O, Sch name = ADR3 +#NET "MemAdr<4>" LOC = "H1"; # Bank = 3, Pin name = IO_L10N_3, Type = I/O, Sch name = ADR4 +#NET "MemAdr<5>" LOC = "H2"; # Bank = 3, Pin name = IO_L10P_3, Type = I/O, Sch name = ADR5 +#NET "MemAdr<6>" LOC = "J5"; # Bank = 3, Pin name = IO_L11P_3/LHCLK0, Type = LHCLK, Sch name = ADR6 +#NET "MemAdr<7>" LOC = "H3"; # Bank = 3, Pin name = IO_L09N_3, Type = I/O, Sch name = ADR7 +#NET "MemAdr<8>" LOC = "H6"; # Bank = 3, Pin name = IO_L08P_3, Type = I/O, Sch name = ADR8 +#NET "MemAdr<9>" LOC = "F1"; # Bank = 3, Pin name = IO_L05P_3, Type = I/O, Sch name = ADR9 +#NET "MemAdr<10>" LOC = "G3"; # Bank = 3, Pin name = IO_L06P_3, Type = I/O, Sch name = ADR10 +#NET "MemAdr<11>" LOC = "G6"; # Bank = 3, Pin name = IO_L07P_3, Type = I/O, Sch name = ADR11 +#NET "MemAdr<12>" LOC = "G5"; # Bank = 3, Pin name = IO_L07N_3, Type = I/O, Sch name = ADR12 +#NET "MemAdr<13>" LOC = "G4"; # Bank = 3, Pin name = IO_L06N_3/VREF_3, Type = VREF, Sch name = ADR13 +#NET "MemAdr<14>" LOC = "F2"; # Bank = 3, Pin name = IO_L05N_3, Type = I/O, Sch name = ADR14 +#NET "MemAdr<15>" LOC = "E1"; # Bank = 3, Pin name = IO_L03N_3, Type = I/O, Sch name = ADR15 +#NET "MemAdr<16>" LOC = "M5"; # Bank = 3, Pin name = IO_L19P_3, Type = I/O, Sch name = ADR16 +#NET "MemAdr<17>" LOC = "E2"; # Bank = 3, Pin name = IO_L03P_3, Type = I/O, Sch name = ADR17 +#NET "MemAdr<18>" LOC = "C2"; # Bank = 3, Pin name = IO_L01N_3, Type = I/O, Sch name = ADR18 +#NET "MemAdr<19>" LOC = "C1"; # Bank = 3, Pin name = IO_L01P_3, Type = I/O, Sch name = ADR19 +#NET "MemAdr<20>" LOC = "D2"; # Bank = 3, Pin name = IO_L02N_3/VREF_3, Type = VREF, Sch name = ADR20 +#NET "MemAdr<21>" LOC = "K3"; # Bank = 3, Pin name = IO_L13P_3/LHCLK4/TRDY2, Type = LHCLK, Sch name = ADR21 +#NET "MemAdr<22>" LOC = "D1"; # Bank = 3, Pin name = IO_L02P_3, Type = I/O, Sch name = ADR22 +#NET "MemAdr<23>" LOC = "K6"; # Bank = 3, Pin name = IO_L14P_3/LHCLK6, Type = LHCLK, Sch name = ADR23 +# +#NET "MemDB<0>" LOC = "L1"; # Bank = 3, Pin name = IO_L15P_3, Type = I/O, Sch name = DB0 +#NET "MemDB<1>" LOC = "L4"; # Bank = 3, Pin name = IO_L16N_3, Type = I/O, Sch name = DB1 +#NET "MemDB<2>" LOC = "L6"; # Bank = 3, Pin name = IO_L17P_3, Type = I/O, Sch name = DB2 +#NET "MemDB<3>" LOC = "M4"; # Bank = 3, Pin name = IO_L18P_3, Type = I/O, Sch name = DB3 +#NET "MemDB<4>" LOC = "N5"; # Bank = 3, Pin name = IO_L20N_3, Type = I/O, Sch name = DB4 +#NET "MemDB<5>" LOC = "P1"; # Bank = 3, Pin name = IO_L21N_3, Type = I/O, Sch name = DB5 +#NET "MemDB<6>" LOC = "P2"; # Bank = 3, Pin name = IO_L21P_3, Type = I/O, Sch name = DB6 +#NET "MemDB<7>" LOC = "R2"; # Bank = 3, Pin name = IO_L23N_3, Type = I/O, Sch name = DB7 +#NET "MemDB<8>" LOC = "L3"; # Bank = 3, Pin name = IO_L16P_3, Type = I/O, Sch name = DB8 +#NET "MemDB<9>" LOC = "L5"; # Bank = 3, Pin name = IO_L17N_3/VREF_3, Type = VREF, Sch name = DB9 +#NET "MemDB<10>" LOC = "M3"; # Bank = 3, Pin name = IO_L18N_3, Type = I/O, Sch name = DB10 +#NET "MemDB<11>" LOC = "M6"; # Bank = 3, Pin name = IO_L19N_3, Type = I/O, Sch name = DB11 +#NET "MemDB<12>" LOC = "L2"; # Bank = 3, Pin name = IO_L15N_3, Type = I/O, Sch name = DB12 +#NET "MemDB<13>" LOC = "N4"; # Bank = 3, Pin name = IO_L20P_3, Type = I/O, Sch name = DB13 +#NET "MemDB<14>" LOC = "R3"; # Bank = 3, Pin name = IO_L23P_3, Type = I/O, Sch name = DB14 +#NET "MemDB<15>" LOC = "T1"; # Bank = 3, Pin name = IO_L24N_3, Type = I/O, Sch name = DB15 + +## FX2 connector +#NET "PIO<0>" LOC = "B4"; # Bank = 0, Pin name = IO_L24N_0, Type = I/O, Sch name = R-IO1 +#NET "PIO<1>" LOC = "A4"; # Bank = 0, Pin name = IO_L24P_0, Type = I/O, Sch name = R-IO2 +#NET "PIO<2>" LOC = "C3"; # Bank = 0, Pin name = IO_L25P_0, Type = I/O, Sch name = R-IO3 +#NET "PIO<3>" LOC = "C4"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO4 +#NET "PIO<4>" LOC = "B6"; # Bank = 0, Pin name = IO_L20P_0, Type = I/O, Sch name = R-IO5 +#NET "PIO<5>" LOC = "D5"; # Bank = 0, Pin name = IO_L23N_0/VREF_0, Type = VREF, Sch name = R-IO6 +#NET "PIO<6>" LOC = "C5"; # Bank = 0, Pin name = IO_L23P_0, Type = I/O, Sch name = R-IO7 +#NET "PIO<7>" LOC = "F7"; # Bank = 0, Pin name = IO_L19P_0, Type = I/O, Sch name = R-IO8 +#NET "PIO<8>" LOC = "E7"; # Bank = 0, Pin name = IO_L19N_0/VREF_0, Type = VREF, Sch name = R-IO9 +#NET "PIO<9>" LOC = "A6"; # Bank = 0, Pin name = IO_L20N_0, Type = I/O, Sch name = R-IO10 +#NET "PIO<10>" LOC = "C7"; # Bank = 0, Pin name = IO_L18P_0, Type = I/O, Sch name = R-IO11 +#NET "PIO<11>" LOC = "F8"; # Bank = 0, Pin name = IO_L17N_0, Type = I/O, Sch name = R-IO12 +#NET "PIO<12>" LOC = "D7"; # Bank = 0, Pin name = IO_L18N_0/VREF_0, Type = VREF, Sch name = R-IO13 +#NET "PIO<13>" LOC = "E8"; # Bank = 0, Pin name = IO_L17P_0, Type = I/O, Sch name = R-IO14 +#NET "PIO<14>" LOC = "E9"; # Bank = 0, Pin name = IO_L15P_0, Type = I/O, Sch name = R-IO15 +#NET "PIO<15>" LOC = "C9"; # Bank = 0, Pin name = IO_L14P_0/GCLK10, Type = GCLK, Sch name = R-IO16 +#NET "PIO<16>" LOC = "A8"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO17 +#NET "PIO<17>" LOC = "G9"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO18 +#NET "PIO<18>" LOC = "F9"; # Bank = 0, Pin name = IO_L15N_0, Type = I/O, Sch name = R-IO19 +#NET "PIO<19>" LOC = "D10"; # Bank = 0, Pin name = IO_L11P_0/GCLK4, Type = GCLK, Sch name = R-IO20 +#NET "PIO<20>" LOC = "A10"; # Bank = 0, Pin name = IO_L12N_0/GCLK7, Type = GCLK, Sch name = R-IO21 +#NET "PIO<21>" LOC = "B10"; # Bank = 0, Pin name = IO_L12P_0/GCLK6, Type = GCLK, Sch name = R-IO22 +#NET "PIO<22>" LOC = "A11"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO23 +#NET "PIO<23>" LOC = "D11"; # Bank = 0, Pin name = IO_L09N_0, Type = I/O, Sch name = R-IO24 +#NET "PIO<24>" LOC = "E10"; # Bank = 0, Pin name = IO_L11N_0/GCLK5, Type = GCLK, Sch name = R-IO25 +#NET "PIO<25>" LOC = "B11"; # Bank = 0, Pin name = IO/VREF_0, Type = VREF, Sch name = R-IO26 +#NET "PIO<26>" LOC = "C11"; # Bank = 0, Pin name = IO_L09P_0, Type = I/O, Sch name = R-IO27 +#NET "PIO<27>" LOC = "E11"; # Bank = 0, Pin name = IO_L08P_0, Type = I/O, Sch name = R-IO28 +#NET "PIO<28>" LOC = "F11"; # Bank = 0, Pin name = IO_L08N_0, Type = I/O, Sch name = R-IO29 +#NET "PIO<29>" LOC = "E12"; # Bank = 0, Pin name = IO_L06N_0, Type = I/O, Sch name = R-IO30 +#NET "PIO<30>" LOC = "F12"; # Bank = 0, Pin name = IO_L06P_0, Type = I/O, Sch name = R-IO31 +#NET "PIO<31>" LOC = "A13"; # Bank = 0, Pin name = IO_L05P_0, Type = I/O, Sch name = R-IO32 +#NET "PIO<32>" LOC = "B13"; # Bank = 0, Pin name = IO_L05N_0/VREF_0, Type = VREF, Sch name = R-IO33 +#NET "PIO<33>" LOC = "E13"; # Bank = 0, Pin name = IO, Type = I/O, Sch name = R-IO34 +#NET "PIO<34>" LOC = "A14"; # Bank = 0, Pin name = IO_L04N_0, Type = I/O, Sch name = R-IO35 +#NET "PIO<35>" LOC = "C14"; # Bank = 0, Pin name = IO_L03N_0/VREF_0, Type = VREF, Sch name = R-IO36 +#NET "PIO<36>" LOC = "D14"; # Bank = 0, Pin name = IO_L03P_0, Type = I/O, Sch name = R-IO37 +#NET "PIO<37>" LOC = "B14"; # Bank = 0, Pin name = IO_L04P_0, Type = I/O, Sch name = R-IO38 +#NET "PIO<38>" LOC = "A16"; # Bank = 0, Pin name = IO_L01N_0, Type = I/O, Sch name = R-IO39 +#NET "PIO<39>" LOC = "B16"; # Bank = 0, Pin name = IO_L01P_0, Type = I/O, Sch name = R-IO40 + +## 12 pin connectors +#NET "JA<0>" LOC = "L15"; # Bank = 1, Pin name = IO_L09N_1/A11, Type = DUAL, Sch name = JA1 +#NET "JA<1>" LOC = "K12"; # Bank = 1, Pin name = IO_L11N_1/A9/RHCLK1, Type = RHCLK/DUAL, Sch name = JA2 +#NET "JA<2>" LOC = "L17"; # Bank = 1, Pin name = IO_L10N_1/VREF_1, Type = VREF, Sch name = JA3 +#NET "JA<3>" LOC = "M15"; # Bank = 1, Pin name = IO_L07P_1, Type = I/O, Sch name = JA4 +#NET "JA<4>" LOC = "K13"; # Bank = 1, Pin name = IO_L11P_1/A10/RHCLK0, Type = RHCLK/DUAL, Sch name = JA7 +#NET "JA<5>" LOC = "L16"; # Bank = 1, Pin name = IO_L09P_1/A12, Type = DUAL, Sch name = JA8 +#NET "JA<6>" LOC = "M14"; # Bank = 1, Pin name = IO_L05P_1, Type = I/O, Sch name = JA9 +#NET "JA<7>" LOC = "M16"; # Bank = 1, Pin name = IO_L07N_1, Type = I/O, Sch name = JA10 +#NET "JB<0>" LOC = "M13"; # Bank = 1, Pin name = IO_L05N_1/VREF_1, Type = VREF, Sch name = JB1 +#NET "JB<1>" LOC = "R18"; # Bank = 1, Pin name = IO_L02P_1/A14, Type = DUAL, Sch name = JB2 +#NET "JB<2>" LOC = "R15"; # Bank = 1, Pin name = IO_L03P_1, Type = I/O, Sch name = JB3 +#NET "JB<3>" LOC = "T17"; # Bank = 1, Pin name = IO_L01N_1/A15, Type = DUAL, Sch name = JB4 +#NET "JB<4>" LOC = "P17"; # Bank = 1, Pin name = IO_L06P_1, Type = I/O, Sch name = JB7 +#NET "JB<5>" LOC = "R16"; # Bank = 1, Pin name = IO_L03N_1/VREF_1, Type = VREF, Sch name = JB8 +#NET "JB<6>" LOC = "T18"; # Bank = 1, Pin name = IO_L02N_1/A13, Type = DUAL, Sch name = JB9 +#NET "JB<7>" LOC = "U18"; # Bank = 1, Pin name = IO_L01P_1/A16, Type = DUAL, Sch name = JB10 +#NET "JC<0>" LOC = "G15"; # Bank = 1, Pin name = IO_L18P_1, Type = I/O, Sch name = JC1 +#NET "JC<1>" LOC = "J16"; # Bank = 1, Pin name = IO_L13N_1/A5/RHCLK5, Type = RHCLK/DUAL, Sch name = JC2 +#NET "JC<2>" LOC = "G13"; # Bank = 1, Pin name = IO_L20N_1, Type = I/O, Sch name = JC3 +#NET "JC<3>" LOC = "H16"; # Bank = 1, Pin name = IO_L16P_1, Type = I/O, Sch name = JC4 +#NET "JC<4>" LOC = "H15"; # Bank = 1, Pin name = IO_L17N_1, Type = I/O, Sch name = JC7 +#NET "JC<5>" LOC = "F14"; # Bank = 1, Pin name = IO_L21N_1, Type = I/O, Sch name = JC8 +#NET "JC<6>" LOC = "G16"; # Bank = 1, Pin name = IO_L18N_1, Type = I/O, Sch name = JC9 +#NET "JC<7>" LOC = "J12"; # Bank = 1, Pin name = IO_L15P_1/A2, Type = DUAL, Sch name = JC10 +#NET "JD<0>" LOC = "J13"; # Bank = 1, Pin name = IO_L15N_1/A1, Type = DUAL, Sch name = JD1 +#NET "JD<1>" LOC = "M18"; # Bank = 1, Pin name = IO_L08N_1, Type = I/O, Sch name = JD2 +#NET "JD<2>" LOC = "N18"; # Bank = 1, Pin name = IO_L08P_1, Type = I/O, Sch name = JD3 +#NET "JD<3>" LOC = "P18"; # Bank = 1, Pin name = IO_L06N_1, Type = I/O, Sch name = JD4 + +## onBoard USB controller +#NET "EppAstb" LOC = "V14"; # Bank = 2, Pin name = IP_L23P_2, Type = INPUT, Sch name = U-FLAGA +#NET "EppDstb" LOC = "U14"; # Bank = 2, Pin name = IP_L23N_2, Type = INPUT, Sch name = U-FLAGB +#NET "UsbFlag" LOC = "V16"; # Bank = 2, Pin name = IP, Type = INPUT, Sch name = U-FLAGC +#NET "EppWait" LOC = "N9"; # Bank = 2, Pin name = IO_L12P_2/D7/GCLK12, Type = DUAL/GCLK, Sch name = U-SLRD +#NET "EppDB<0>" LOC = "R14"; # Bank = 2, Pin name = IO_L24N_2/A20, Type = DUAL, Sch name = U-FD0 +#NET "EppDB<1>" LOC = "R13"; # Bank = 2, Pin name = IO_L22N_2/A22, Type = DUAL, Sch name = U-FD1 +#NET "EppDB<2>" LOC = "P13"; # Bank = 2, Pin name = IO_L22P_2/A23, Type = DUAL, Sch name = U-FD2 +#NET "EppDB<3>" LOC = "T12"; # Bank = 2, Pin name = IO_L20P_2, Type = I/O, Sch name = U-FD3 +#NET "EppDB<4>" LOC = "N11"; # Bank = 2, Pin name = IO_L18N_2, Type = I/O, Sch name = U-FD4 +#NET "EppDB<5>" LOC = "R11"; # Bank = 2, Pin name = IO, Type = I/O, Sch name = U-FD5 +#NET "EppDB<6>" LOC = "P10"; # Bank = 2, Pin name = IO_L15N_2/D1/GCLK3, Type = DUAL/GCLK, Sch name = U-FD6 +#NET "EppDB<7>" LOC = "R10"; # Bank = 2, Pin name = IO_L15P_2/D2/GCLK2, Type = DUAL/GCLK, Sch name = U-FD7 + +#NET "UsbClk" LOC = "T15"; # Bank = 2, Pin name = IO/VREF_2, Type = VREF, Sch name = U-IFCLK + +#NET "UsbOE" LOC = "V15"; # Bank = 2, Pin name = IO_L25P_2/VS2/A19, Type = DUAL, Sch name = U-SLOE +#NET "UsbWR" LOC = "V9"; # Bank = 2, Pin name = IO_L13N_2/D3/GCLK15, Type = DUAL/GCLK, Sch name = U-SWLR +#NET "UsbPktEnd" LOC = "V12"; # Bank = 2, Pin name = IO_L19P_2, Type = I/O, Sch name = U-PKTEND + +#NET "UsbDir" LOC = "T16"; # Bank = 2, Pin name = IO_L26P_2/VS0/A17, Type = DUAL, Sch name = U-SLCS +#NET "UsbMode" LOC = "U15"; # Bank = 2, Pin name = IO_L25N_2/VS1/A18, Type = DUAL, Sch name = U-INT0# + +#NET "UsbAdr<0>" LOC = "T14"; # Bank = 2, Pin name = IO_L24P_2/A21, Type = DUAL, Sch name = U-FIFOAD0 +#NET "UsbAdr<1>" LOC = "V13"; # Bank = 2, Pin name = IO_L19N_2/VREF_2, Type = VREF, Sch name = U-FIFOAD1 + +##NET "UsbRdy" LOC = "U13"; # Bank = 2, Pin name = IP, Type = INPUT, Sch name = U-RDY diff --git a/ecen320/tx_encoder/Tx.bit b/ecen320/tx_encoder/Tx.bit new file mode 100644 index 0000000000000000000000000000000000000000..011f5cf35567155f68b137d78a6a7d82e29df544 GIT binary patch literal 283877 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 literal 0 HcmV?d00001 diff --git a/ecen320/tx_encoder/charGen.vhd b/ecen320/tx_encoder/charGen.vhd new file mode 100644 index 0000000..0ef1556 --- /dev/null +++ b/ecen320/tx_encoder/charGen.vhd @@ -0,0 +1,76 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity charGen is + port( + clk: in std_logic; + char_we: in std_logic; + char_value: in std_logic_vector(7 downto 0); + char_addr: in std_logic_vector(11 downto 0); + pixel_x, pixel_y: in std_logic_vector(9 downto 0); + pixel_out: out std_logic + ); +end charGen; + +architecture charGen_arch of charGen is + + component char_mem + port( + clk: in std_logic; + char_read_addr : in std_logic_vector(11 downto 0); + char_write_addr: in std_logic_vector(11 downto 0); + char_we : in std_logic; + char_write_value : in std_logic_vector(7 downto 0); + char_read_value : out std_logic_vector(7 downto 0) + ); + end component; + + component font_rom + port( + clk: in std_logic; + addr: in std_logic_vector(10 downto 0); + data: out std_logic_vector(7 downto 0) + ); + end component; + + signal rom_addr: std_logic_vector(10 downto 0); + signal ram_read_addr: std_logic_vector(11 downto 0); + signal ram_value: std_logic_vector(7 downto 0); + signal myselect: std_logic_vector(2 downto 0); + signal tempvar: std_logic_vector(2 downto 0); + signal rom_data_out: std_logic_vector(7 downto 0); + + begin + myRam: char_mem + port map(clk=>clk, char_read_addr=>ram_read_addr, char_write_addr=>char_addr, char_we=>char_we, char_write_value=>char_value, char_read_value=>ram_value + ); + myRom: font_rom + port map(clk=>clk, addr=>rom_addr, data=>rom_data_out + ); + + process(clk) + begin + if(rising_edge(clk)) then + tempvar <= pixel_x(2 downto 0); + myselect <= tempvar; + end if; + end process; + + + with myselect select + pixel_out <= rom_data_out(7) when "000", + rom_data_out(6) when "001", + rom_data_out(5) when "010", + rom_data_out(4) when "011", + rom_data_out(3) when "100", + rom_data_out(2) when "101", + rom_data_out(1) when "110", + rom_data_out(0) when others; + + + ram_read_addr <= pixel_y(8 downto 4) & pixel_x(9 downto 3); + + rom_addr <= ram_value(6 downto 0) & pixel_y(3 downto 0); + +end charGen_arch; \ No newline at end of file diff --git a/ecen320/tx_encoder/charGen_toplevel.vhd b/ecen320/tx_encoder/charGen_toplevel.vhd new file mode 100644 index 0000000..58ff0c4 --- /dev/null +++ b/ecen320/tx_encoder/charGen_toplevel.vhd @@ -0,0 +1,228 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity charGen_toplevel is + port( + clk: in std_logic; + rgb: out std_logic_vector(7 downto 0); + hs_out, vs_out: out std_logic; + sw: in std_logic_vector(7 downto 0); + seg : out std_logic_vector(6 downto 0); + an : out std_logic_vector(3 downto 0) := "1100"; + dp : out std_logic; + btn: in std_logic_vector(3 downto 0); + ps2_clk : IN STD_LOGIC; --clock signal from PS2 keyboard + ps2_data : IN STD_LOGIC; + btwn: out std_logic + ); +end charGen_toplevel; + +architecture top_charGen of charGen_toplevel is + + component ps2_keyboard_to_ascii is + generic( + clk_freq : INTEGER := 50_000_000; --system clock frequency in Hz + ps2_debounce_counter_size : INTEGER := 8 --set such that 2^size/clk_freq = 5us (size = 8 for 50MHz) + ); + port( + clk : IN STD_LOGIC; --system clock input + ps2_clk : IN STD_LOGIC; --clock signal from PS2 keyboard + ps2_data : IN STD_LOGIC; --data signal from PS2 keyboard + ascii_code : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); + ascii_new : OUT STD_LOGIC + ); + end component; + + component charGen is + port( + clk: in std_logic; + char_we: in std_logic; + char_value: in std_logic_vector(7 downto 0); + char_addr: in std_logic_vector(11 downto 0); + pixel_x: in std_logic_vector(9 downto 0); + pixel_y: in std_logic_vector(9 downto 0); + pixel_out: out std_logic + ); + end component; + + component vga_timing is + port( + clk, rst: in std_logic; + HS: out std_logic; + VS: out std_logic; + pixel_x, pixel_y: out std_logic_vector(9 downto 0); + last_column, last_row: out std_logic; + blank: out std_logic + ); + end component; + + component seven_segment_display is + generic( + COUNT: natural := 15 + ); + port( + clk: in std_logic; + data_in: in std_logic_vector(15 downto 0); + dp_in: in std_logic_Vector(3 downto 0); + blank: in std_logic_vector(3 downto 0); + seg : out std_logic_vector(6 downto 0); + dp : out std_logic; + an : out std_logic_vector(3 downto 0) + ); + end component; + + component tx is + generic( + CLK_RATE: natural := 50_000_000; + BAUD_RATE: natural := 19_200 + ); + port( + clk: in std_logic; + rst: in std_logic; + data_in: in std_logic_vector(7 downto 0); + send_character: in std_logic; + tx_out: out std_logic; + tx_busy:out std_logic + + ); + end component; + + signal temp_x,temp_y: std_logic_vector(9 downto 0); + signal hs,vs: std_logic; + signal temp_hs,temp_vs: std_logic := '0'; + signal reset: std_logic := '0'; + signal dp_in: std_logic_vector(3 downto 0) := "0000"; + signal blank4: std_logic_vector(3 downto 0) := (others=>'0'); + signal data_in: std_logic_vector(15 downto 0) := (others=>'0'); + signal data_in123: std_logic_vector(7 downto 0) := (others=>'0'); + signal pixel_out: std_logic; + signal count: natural := 0; + signal count_next: natural; + signal count_en: std_logic; + signal count_key: natural := 0; + signal count_next_key: natural; + signal count_en_key: std_logic; + signal count_en_start: std_logic; + signal char_we: std_logic; + signal row_position, column_position: natural := 0; + signal row_next, column_next: natural; + signal row_en: std_logic; + signal char_write_addr: std_logic_vector(11 downto 0) := (others=>'0'); + signal blank: std_logic := '0'; + signal font_color: std_logic_vector(7 downto 0) := (others=>'1'); + signal back_color: std_logic_vector(7 downto 0) := (others => '0'); + signal ascii_new_temp : STD_LOGIC; --output flag indicating new ASCII value + signal ascii_code_temp : STD_LOGIC_VECTOR(6 DOWNTO 0); --ASCII value + signal ascii_code_buf : Std_logic_vector(7 downto 0); + + signal go : std_logic:='0'; + signal tx_out : std_logic; + signal tx_busy: std_logic; + begin + + bottom_tx: tx + port map(clk=>clk, rst=>reset, send_character=>ascii_new_temp, + tx_out=>tx_out, tx_busy=>tx_busy, data_in=>data_in123 + ); + + bottom_ps2: ps2_keyboard_to_ascii + port map(clk=>clk,ps2_clk=>ps2_clk,ps2_data=>ps2_data,ascii_new=>ascii_new_temp,ascii_code=>ascii_code_temp + ); + + bottom_level: vga_timing + port map(clk=>clk, rst=>reset, pixel_x=>temp_x, pixel_y=>temp_y, blank=>blank, + HS=>hs, VS=>vs, last_column=>open, last_row=>open + ); + + bottom_charGen: charGen + port map(clk=>clk, char_we=>char_we, char_value=>ascii_code_buf, char_addr=>char_write_addr, pixel_x=>temp_x, pixel_y=>temp_y, pixel_out=>pixel_out + ); + + bottom_segment: seven_segment_display + generic map(COUNT=>15) + port map(clk=>clk, an=>an, seg=>seg, dp=>dp, blank=>blank4, + data_in=>data_in, dp_in=>dp_in + ); + ascii_code_buf <= "0" & ascii_code_temp; + data_in <= "000000000" & ascii_code_temp; + data_in123 <= std_logic_vector(unsigned("0" & ascii_code_temp) + unsigned(sw)); + + + + -- DELAY for char_gen + process(clk) + begin + if(rising_edge(clk)) then + count <= count_next; + end if; + end process; + count_next <= 0 when count=3000000 else + count + 1; + count_en <= '1' when count=3000000 else + '0'; + + -- ROW AND COL LOGIC + + row_next <= row_position+1 when row_position < 30 else + 0; + column_next <= column_position+1 when column_position < 79 else + 0; + row_en <= '1' when column_position = 79 else + '0'; + char_write_addr <= std_logic_vector(to_unsigned(row_position,5)) & std_logic_vector(to_unsigned(column_position,7)); + + font_color <= sw; + back_color <= not sw; + -- COLOR + rgb <= std_logic_vector(font_color) when pixel_out='1' else + std_logic_vector(back_color) when blank = '0' else + "00000000"; + btwn <= tx_out; + process(clk) + begin + if(rising_edge(clk)) then + if(ascii_new_temp = '1') then + go <='1'; + end if; + if(char_we = '1') then + go <='0'; + end if; + end if; + end process; + + -- BUTTON + char_we <= '1' when count_en = '1' and go = '1' else '0'; + process(clk,ascii_new_temp,count_en) + begin + if(rising_edge(clk)) then + if (btn(3)='1') then + reset <= '1'; + column_position <= 0; + row_position <= 0; + elsif (go = '1') then + if(count_en='1') then + reset <= '0'; + column_position <= column_next; + if(row_en='1') then + row_position <= row_next; + end if; + end if; + else + reset <= '0'; + end if; + end if; + end process; + + -- DELAYS + process(clk,hs,vs) + begin + if(rising_edge(clk)) then + temp_hs <= hs; + temp_vs <= vs; + hs_out <= temp_hs; + vs_out <= temp_vs; + end if; + end process; + +end top_charGen; \ No newline at end of file diff --git a/ecen320/tx_encoder/char_mem.vhd b/ecen320/tx_encoder/char_mem.vhd new file mode 100644 index 0000000..33d9eb4 --- /dev/null +++ b/ecen320/tx_encoder/char_mem.vhd @@ -0,0 +1,341 @@ +-- VGA Character Memory +-- +-- This memory can store 128x32 characters where each character is +-- 8 bits. The memory is dual ported providing a port +-- to read the characters and a port to write the characters. +-- +-- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity char_mem is + port( + clk: in std_logic; + char_read_addr : in std_logic_vector(11 downto 0); + char_write_addr: in std_logic_vector(11 downto 0); + char_we : in std_logic; + char_write_value : in std_logic_vector(7 downto 0); + char_read_value : out std_logic_vector(7 downto 0) + ); +end char_mem; + +architecture arch of char_mem is + + constant CHAR_RAM_ADDR_WIDTH: integer := 12; -- 2^7 X 2^5 + constant CHAR_RAM_WIDTH: integer := 8; -- 8 bits per character + type char_ram_type is array (0 to 2**CHAR_RAM_ADDR_WIDTH-1) + of std_logic_vector(CHAR_RAM_WIDTH-1 downto 0); + signal read_a : std_logic_vector(11 downto 0); + + -- character memory signal + signal char_ram : char_ram_type := ( + + -- Initial Value of character memory + + -- Line 0 + X"57",X"65",X"6c",X"63",X"6f",X"6d",X"65",X"20",X"74",X"6f",X"20",X"41",X"61",X"72",X"6f",X"6e", + X"20",X"61",X"6e",X"64",X"20",X"44",X"65",X"72",X"65",X"6b",X"27",X"73",X"20",X"65",X"6e",X"63", + X"72",X"79",X"70",X"74",X"69",X"6f",X"6e",X"20",X"70",X"72",X"6f",X"67",X"72",X"61",X"6d",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 1 + X"49",X"6e",X"73",X"74",X"72",X"75",X"63",X"74",X"69",X"6f",X"6e",X"73",X"3a",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 2 + X"2d",X"48",X"6f",X"6f",X"6b",X"20",X"75",X"70",X"20",X"61",X"6e",X"64",X"20",X"74",X"79",X"70", + X"65",X"20",X"69",X"6e",X"20",X"61",X"20",X"70",X"73",X"32",X"20",X"6b",X"65",X"79",X"62",X"6f", + X"61",X"72",X"64",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 3 + X"2d",X"54",X"68",X"65",X"20",X"73",X"77",X"69",X"74",X"63",X"68",X"65",X"73",X"20",X"61",X"72", + X"65",X"20",X"74",X"68",X"65",X"20",X"6b",X"65",X"79",X"20",X"28",X"64",X"69",X"73",X"70",X"6c", + X"61",X"79",X"65",X"64",X"20",X"61",X"73",X"20",X"61",X"20",X"63",X"6f",X"6c",X"6f",X"72",X"20", + X"69",X"6e",X"20",X"74",X"68",X"65",X"20",X"62",X"61",X"63",X"6b",X"67",X"72",X"6f",X"75",X"6e", + X"64",X"29",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 4 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 5 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 6 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 7 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 8 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 9 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 10 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 11 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 12 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 13 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 14 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 15 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 16 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 17 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 18 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 19 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 20 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 21 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 22 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 23 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 24 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 25 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 26 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 27 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 28 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 29 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"54",--end of visible line + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 30 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + -- Line 31 + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20", + X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20" + ); +begin + + -- character memory concurrent statement + process(clk) + begin + if (clk'event and clk='1') then + if (char_we = '1') then + char_ram(to_integer(unsigned(char_write_addr))) <= char_write_value; + end if; + read_a <= char_read_addr; + end if; + end process; + char_read_value <= char_ram(to_integer(unsigned(read_a))); + +end arch; + diff --git a/ecen320/tx_encoder/debounce.vhd b/ecen320/tx_encoder/debounce.vhd new file mode 100644 index 0000000..8c86049 --- /dev/null +++ b/ecen320/tx_encoder/debounce.vhd @@ -0,0 +1,58 @@ +-------------------------------------------------------------------------------- +-- +-- FileName: debounce.vhd +-- Dependencies: none +-- Design Software: Quartus II 32-bit Version 11.1 Build 173 SJ Full Version +-- +-- HDL CODE IS PROVIDED "AS IS." DIGI-KEY EXPRESSLY DISCLAIMS ANY +-- WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT +-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +-- PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL DIGI-KEY +-- BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL +-- DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF +-- PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS +-- BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), +-- ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS. +-- +-- Version History +-- Version 1.0 3/26/2012 Scott Larson +-- Initial Public Release +-- +-------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.all; +USE ieee.std_logic_unsigned.all; + +ENTITY debounce IS + GENERIC( + counter_size : INTEGER := 25); --counter size (19 bits gives 10.5ms with 50MHz clock) + PORT( + clk : IN STD_LOGIC; --input clock + button : IN STD_LOGIC; --input signal to be debounced + result : OUT STD_LOGIC); --debounced signal +END debounce; + +ARCHITECTURE logic OF debounce IS + SIGNAL flipflops : STD_LOGIC_VECTOR(1 DOWNTO 0); --input flip flops + SIGNAL counter_set : STD_LOGIC; --sync reset to zero + SIGNAL counter_out : STD_LOGIC_VECTOR(counter_size DOWNTO 0) := (OTHERS => '0'); --counter output +BEGIN + + counter_set <= flipflops(0) xor flipflops(1); --determine when to start/reset counter + + PROCESS(clk) + BEGIN + IF(clk'EVENT and clk = '1') THEN + flipflops(0) <= button; + flipflops(1) <= flipflops(0); + If(counter_set = '1') THEN --reset counter because input is changing + counter_out <= (OTHERS => '0'); + ELSIF(counter_out(counter_size) = '0') THEN --stable input time is not yet met + counter_out <= counter_out + 1; + ELSE --stable input time is met + result <= flipflops(1); + END IF; + END IF; + END PROCESS; +END logic; diff --git a/ecen320/tx_encoder/font_rom.vhd b/ecen320/tx_encoder/font_rom.vhd new file mode 100644 index 0000000..6f70575 --- /dev/null +++ b/ecen320/tx_encoder/font_rom.vhd @@ -0,0 +1,2215 @@ +-- Listing 13.1 +-- ROM with synchonous read (inferring Block RAM) +-- character ROM +-- - 8-by-16 (8-by-2^4) font +-- - 128 (2^7) characters +-- - ROM size: 512-by-8 (2^11-by-8) bits +-- 16K bits: 1 BRAM + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +entity font_rom is + port( + clk: in std_logic; + addr: in std_logic_vector(10 downto 0); + data: out std_logic_vector(7 downto 0) + ); +end font_rom; + +architecture arch of font_rom is + constant ADDR_WIDTH: integer:=11; + constant DATA_WIDTH: integer:=8; + signal addr_reg: std_logic_vector(ADDR_WIDTH-1 downto 0); + type rom_type is array (0 to 2**ADDR_WIDTH-1) + of std_logic_vector(DATA_WIDTH-1 downto 0); + -- ROM definition + constant ROM: rom_type:=( -- 2^11-by-8 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x01 + "00000000", -- 0 + "00000000", -- 1 + "01111110", -- 2 ****** + "10000001", -- 3 * * + "10100101", -- 4 * * * * + "10000001", -- 5 * * + "10000001", -- 6 * * + "10111101", -- 7 * **** * + "10011001", -- 8 * ** * + "10000001", -- 9 * * + "10000001", -- a * * + "01111110", -- b ****** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x02 + "00000000", -- 0 + "00000000", -- 1 + "01111110", -- 2 ****** + "11111111", -- 3 ******** + "11011011", -- 4 ** ** ** + "11111111", -- 5 ******** + "11111111", -- 6 ******** + "11000011", -- 7 ** ** + "11100111", -- 8 *** *** + "11111111", -- 9 ******** + "11111111", -- a ******** + "01111110", -- b ****** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x03 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "01101100", -- 4 ** ** + "11111110", -- 5 ******* + "11111110", -- 6 ******* + "11111110", -- 7 ******* + "11111110", -- 8 ******* + "01111100", -- 9 ***** + "00111000", -- a *** + "00010000", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x04 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00010000", -- 4 * + "00111000", -- 5 *** + "01111100", -- 6 ***** + "11111110", -- 7 ******* + "01111100", -- 8 ***** + "00111000", -- 9 *** + "00010000", -- a * + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x05 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00011000", -- 3 ** + "00111100", -- 4 **** + "00111100", -- 5 **** + "11100111", -- 6 *** *** + "11100111", -- 7 *** *** + "11100111", -- 8 *** *** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x06 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00011000", -- 3 ** + "00111100", -- 4 **** + "01111110", -- 5 ****** + "11111111", -- 6 ******** + "11111111", -- 7 ******** + "01111110", -- 8 ****** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x07 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00011000", -- 6 ** + "00111100", -- 7 **** + "00111100", -- 8 **** + "00011000", -- 9 ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x08 + "11111111", -- 0 ******** + "11111111", -- 1 ******** + "11111111", -- 2 ******** + "11111111", -- 3 ******** + "11111111", -- 4 ******** + "11111111", -- 5 ******** + "11100111", -- 6 *** *** + "11000011", -- 7 ** ** + "11000011", -- 8 ** ** + "11100111", -- 9 *** *** + "11111111", -- a ******** + "11111111", -- b ******** + "11111111", -- c ******** + "11111111", -- d ******** + "11111111", -- e ******** + "11111111", -- f ******** + -- code x09 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00111100", -- 5 **** + "01100110", -- 6 ** ** + "01000010", -- 7 * * + "01000010", -- 8 * * + "01100110", -- 9 ** ** + "00111100", -- a **** + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0a + "11111111", -- 0 ******** + "11111111", -- 1 ******** + "11111111", -- 2 ******** + "11111111", -- 3 ******** + "11111111", -- 4 ******** + "11000011", -- 5 ** ** + "10011001", -- 6 * ** * + "10111101", -- 7 * **** * + "10111101", -- 8 * **** * + "10011001", -- 9 * ** * + "11000011", -- a ** ** + "11111111", -- b ******** + "11111111", -- c ******** + "11111111", -- d ******** + "11111111", -- e ******** + "11111111", -- f ******** + -- code x0b + "00000000", -- 0 + "00000000", -- 1 + "00011110", -- 2 **** + "00001110", -- 3 *** + "00011010", -- 4 ** * + "00110010", -- 5 ** * + "01111000", -- 6 **** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01111000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0c + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01100110", -- 6 ** ** + "00111100", -- 7 **** + "00011000", -- 8 ** + "01111110", -- 9 ****** + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0d + "00000000", -- 0 + "00000000", -- 1 + "00111111", -- 2 ****** + "00110011", -- 3 ** ** + "00111111", -- 4 ****** + "00110000", -- 5 ** + "00110000", -- 6 ** + "00110000", -- 7 ** + "00110000", -- 8 ** + "01110000", -- 9 *** + "11110000", -- a **** + "11100000", -- b *** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0e + "00000000", -- 0 + "00000000", -- 1 + "01111111", -- 2 ******* + "01100011", -- 3 ** ** + "01111111", -- 4 ******* + "01100011", -- 5 ** ** + "01100011", -- 6 ** ** + "01100011", -- 7 ** ** + "01100011", -- 8 ** ** + "01100111", -- 9 ** *** + "11100111", -- a *** *** + "11100110", -- b *** ** + "11000000", -- c ** + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x0f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00011000", -- 3 ** + "00011000", -- 4 ** + "11011011", -- 5 ** ** ** + "00111100", -- 6 **** + "11100111", -- 7 *** *** + "00111100", -- 8 **** + "11011011", -- 9 ** ** ** + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x10 + "00000000", -- 0 + "10000000", -- 1 * + "11000000", -- 2 ** + "11100000", -- 3 *** + "11110000", -- 4 **** + "11111000", -- 5 ***** + "11111110", -- 6 ******* + "11111000", -- 7 ***** + "11110000", -- 8 **** + "11100000", -- 9 *** + "11000000", -- a ** + "10000000", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x11 + "00000000", -- 0 + "00000010", -- 1 * + "00000110", -- 2 ** + "00001110", -- 3 *** + "00011110", -- 4 **** + "00111110", -- 5 ***** + "11111110", -- 6 ******* + "00111110", -- 7 ***** + "00011110", -- 8 **** + "00001110", -- 9 *** + "00000110", -- a ** + "00000010", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x12 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00111100", -- 3 **** + "01111110", -- 4 ****** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "01111110", -- 8 ****** + "00111100", -- 9 **** + "00011000", -- a ** + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x13 + "00000000", -- 0 + "00000000", -- 1 + "01100110", -- 2 ** ** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01100110", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "00000000", -- 9 + "01100110", -- a ** ** + "01100110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x14 + "00000000", -- 0 + "00000000", -- 1 + "01111111", -- 2 ******* + "11011011", -- 3 ** ** ** + "11011011", -- 4 ** ** ** + "11011011", -- 5 ** ** ** + "01111011", -- 6 **** ** + "00011011", -- 7 ** ** + "00011011", -- 8 ** ** + "00011011", -- 9 ** ** + "00011011", -- a ** ** + "00011011", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x15 + "00000000", -- 0 + "01111100", -- 1 ***** + "11000110", -- 2 ** ** + "01100000", -- 3 ** + "00111000", -- 4 *** + "01101100", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "01101100", -- 8 ** ** + "00111000", -- 9 *** + "00001100", -- a ** + "11000110", -- b ** ** + "01111100", -- c ***** + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x16 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "11111110", -- 8 ******* + "11111110", -- 9 ******* + "11111110", -- a ******* + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x17 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00111100", -- 3 **** + "01111110", -- 4 ****** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "01111110", -- 8 ****** + "00111100", -- 9 **** + "00011000", -- a ** + "01111110", -- b ****** + "00110000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x18 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00111100", -- 3 **** + "01111110", -- 4 ****** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x19 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "01111110", -- 9 ****** + "00111100", -- a **** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1a + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00011000", -- 5 ** + "00001100", -- 6 ** + "11111110", -- 7 ******* + "00001100", -- 8 ** + "00011000", -- 9 ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1b + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00110000", -- 5 ** + "01100000", -- 6 ** + "11111110", -- 7 ******* + "01100000", -- 8 ** + "00110000", -- 9 ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1c + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "11000000", -- 6 ** + "11000000", -- 7 ** + "11000000", -- 8 ** + "11111110", -- 9 ******* + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1d + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00100100", -- 5 * * + "01100110", -- 6 ** ** + "11111111", -- 7 ******** + "01100110", -- 8 ** ** + "00100100", -- 9 * * + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1e + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00010000", -- 4 * + "00111000", -- 5 *** + "00111000", -- 6 *** + "01111100", -- 7 ***** + "01111100", -- 8 ***** + "11111110", -- 9 ******* + "11111110", -- a ******* + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x1f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "11111110", -- 4 ******* + "11111110", -- 5 ******* + "01111100", -- 6 ***** + "01111100", -- 7 ***** + "00111000", -- 8 *** + "00111000", -- 9 *** + "00010000", -- a * + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x20 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x21 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00111100", -- 3 **** + "00111100", -- 4 **** + "00111100", -- 5 **** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00000000", -- 9 + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x22 + "00000000", -- 0 + "01100110", -- 1 ** ** + "01100110", -- 2 ** ** + "01100110", -- 3 ** ** + "00100100", -- 4 * * + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x23 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "01101100", -- 3 ** ** + "01101100", -- 4 ** ** + "11111110", -- 5 ******* + "01101100", -- 6 ** ** + "01101100", -- 7 ** ** + "01101100", -- 8 ** ** + "11111110", -- 9 ******* + "01101100", -- a ** ** + "01101100", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x24 + "00011000", -- 0 ** + "00011000", -- 1 ** + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000010", -- 4 ** * + "11000000", -- 5 ** + "01111100", -- 6 ***** + "00000110", -- 7 ** + "00000110", -- 8 ** + "10000110", -- 9 * ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00011000", -- c ** + "00011000", -- d ** + "00000000", -- e + "00000000", -- f + -- code x25 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "11000010", -- 4 ** * + "11000110", -- 5 ** ** + "00001100", -- 6 ** + "00011000", -- 7 ** + "00110000", -- 8 ** + "01100000", -- 9 ** + "11000110", -- a ** ** + "10000110", -- b * ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x26 + "00000000", -- 0 + "00000000", -- 1 + "00111000", -- 2 *** + "01101100", -- 3 ** ** + "01101100", -- 4 ** ** + "00111000", -- 5 *** + "01110110", -- 6 *** ** + "11011100", -- 7 ** *** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01110110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x27 + "00000000", -- 0 + "00110000", -- 1 ** + "00110000", -- 2 ** + "00110000", -- 3 ** + "01100000", -- 4 ** + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x28 + "00000000", -- 0 + "00000000", -- 1 + "00001100", -- 2 ** + "00011000", -- 3 ** + "00110000", -- 4 ** + "00110000", -- 5 ** + "00110000", -- 6 ** + "00110000", -- 7 ** + "00110000", -- 8 ** + "00110000", -- 9 ** + "00011000", -- a ** + "00001100", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x29 + "00000000", -- 0 + "00000000", -- 1 + "00110000", -- 2 ** + "00011000", -- 3 ** + "00001100", -- 4 ** + "00001100", -- 5 ** + "00001100", -- 6 ** + "00001100", -- 7 ** + "00001100", -- 8 ** + "00001100", -- 9 ** + "00011000", -- a ** + "00110000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2a + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01100110", -- 5 ** ** + "00111100", -- 6 **** + "11111111", -- 7 ******** + "00111100", -- 8 **** + "01100110", -- 9 ** ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2b + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00011000", -- 5 ** + "00011000", -- 6 ** + "01111110", -- 7 ****** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2c + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00011000", -- 9 ** + "00011000", -- a ** + "00011000", -- b ** + "00110000", -- c ** + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2d + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "01111110", -- 7 ****** + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2e + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x2f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000010", -- 4 * + "00000110", -- 5 ** + "00001100", -- 6 ** + "00011000", -- 7 ** + "00110000", -- 8 ** + "01100000", -- 9 ** + "11000000", -- a ** + "10000000", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x30 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11001110", -- 5 ** *** + "11011110", -- 6 ** **** + "11110110", -- 7 **** ** + "11100110", -- 8 *** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x31 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 + "00111000", -- 3 + "01111000", -- 4 ** + "00011000", -- 5 *** + "00011000", -- 6 **** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "01111110", -- b ** + "00000000", -- c ** + "00000000", -- d ****** + "00000000", -- e + "00000000", -- f + -- code x32 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "00000110", -- 4 ** + "00001100", -- 5 ** + "00011000", -- 6 ** + "00110000", -- 7 ** + "01100000", -- 8 ** + "11000000", -- 9 ** + "11000110", -- a ** ** + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x33 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "00000110", -- 4 ** + "00000110", -- 5 ** + "00111100", -- 6 **** + "00000110", -- 7 ** + "00000110", -- 8 ** + "00000110", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x34 + "00000000", -- 0 + "00000000", -- 1 + "00001100", -- 2 ** + "00011100", -- 3 *** + "00111100", -- 4 **** + "01101100", -- 5 ** ** + "11001100", -- 6 ** ** + "11111110", -- 7 ******* + "00001100", -- 8 ** + "00001100", -- 9 ** + "00001100", -- a ** + "00011110", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x35 + "00000000", -- 0 + "00000000", -- 1 + "11111110", -- 2 ******* + "11000000", -- 3 ** + "11000000", -- 4 ** + "11000000", -- 5 ** + "11111100", -- 6 ****** + "00000110", -- 7 ** + "00000110", -- 8 ** + "00000110", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x36 + "00000000", -- 0 + "00000000", -- 1 + "00111000", -- 2 *** + "01100000", -- 3 ** + "11000000", -- 4 ** + "11000000", -- 5 ** + "11111100", -- 6 ****** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x37 + "00000000", -- 0 + "00000000", -- 1 + "11111110", -- 2 ******* + "11000110", -- 3 ** ** + "00000110", -- 4 ** + "00000110", -- 5 ** + "00001100", -- 6 ** + "00011000", -- 7 ** + "00110000", -- 8 ** + "00110000", -- 9 ** + "00110000", -- a ** + "00110000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x38 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "01111100", -- 6 ***** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x39 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "01111110", -- 6 ****** + "00000110", -- 7 ** + "00000110", -- 8 ** + "00000110", -- 9 ** + "00001100", -- a ** + "01111000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3a + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00011000", -- 4 ** + "00011000", -- 5 ** + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00011000", -- 9 ** + "00011000", -- a ** + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3b + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00011000", -- 4 ** + "00011000", -- 5 ** + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00011000", -- 9 ** + "00011000", -- a ** + "00110000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3c + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000110", -- 3 ** + "00001100", -- 4 ** + "00011000", -- 5 ** + "00110000", -- 6 ** + "01100000", -- 7 ** + "00110000", -- 8 ** + "00011000", -- 9 ** + "00001100", -- a ** + "00000110", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3d + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111110", -- 5 ****** + "00000000", -- 6 + "00000000", -- 7 + "01111110", -- 8 ****** + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3e + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "01100000", -- 3 ** + "00110000", -- 4 ** + "00011000", -- 5 ** + "00001100", -- 6 ** + "00000110", -- 7 ** + "00001100", -- 8 ** + "00011000", -- 9 ** + "00110000", -- a ** + "01100000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x3f + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "00001100", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00000000", -- 9 + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x40 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11011110", -- 6 ** **** + "11011110", -- 7 ** **** + "11011110", -- 8 ** **** + "11011100", -- 9 ** *** + "11000000", -- a ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x41 + "00000000", -- 0 + "00000000", -- 1 + "00010000", -- 2 * + "00111000", -- 3 *** + "01101100", -- 4 ** ** + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11111110", -- 7 ******* + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "11000110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x42 + "00000000", -- 0 + "00000000", -- 1 + "11111100", -- 2 ****** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01111100", -- 6 ***** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "11111100", -- b ****** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x43 + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "01100110", -- 3 ** ** + "11000010", -- 4 ** * + "11000000", -- 5 ** + "11000000", -- 6 ** + "11000000", -- 7 ** + "11000000", -- 8 ** + "11000010", -- 9 ** * + "01100110", -- a ** ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x44 + "00000000", -- 0 + "00000000", -- 1 + "11111000", -- 2 ***** + "01101100", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01100110", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01101100", -- a ** ** + "11111000", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x45 + "00000000", -- 0 + "00000000", -- 1 + "11111110", -- 2 ******* + "01100110", -- 3 ** ** + "01100010", -- 4 ** * + "01101000", -- 5 ** * + "01111000", -- 6 **** + "01101000", -- 7 ** * + "01100000", -- 8 ** + "01100010", -- 9 ** * + "01100110", -- a ** ** + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x46 + "00000000", -- 0 + "00000000", -- 1 + "11111110", -- 2 ******* + "01100110", -- 3 ** ** + "01100010", -- 4 ** * + "01101000", -- 5 ** * + "01111000", -- 6 **** + "01101000", -- 7 ** * + "01100000", -- 8 ** + "01100000", -- 9 ** + "01100000", -- a ** + "11110000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x47 + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "01100110", -- 3 ** ** + "11000010", -- 4 ** * + "11000000", -- 5 ** + "11000000", -- 6 ** + "11011110", -- 7 ** **** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "01100110", -- a ** ** + "00111010", -- b *** * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x48 + "00000000", -- 0 + "00000000", -- 1 + "11000110", -- 2 ** ** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11111110", -- 6 ******* + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "11000110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x49 + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4a + "00000000", -- 0 + "00000000", -- 1 + "00011110", -- 2 **** + "00001100", -- 3 ** + "00001100", -- 4 ** + "00001100", -- 5 ** + "00001100", -- 6 ** + "00001100", -- 7 ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01111000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4b + "00000000", -- 0 + "00000000", -- 1 + "11100110", -- 2 *** ** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01101100", -- 5 ** ** + "01111000", -- 6 **** + "01111000", -- 7 **** + "01101100", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "11100110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4c + "00000000", -- 0 + "00000000", -- 1 + "11110000", -- 2 **** + "01100000", -- 3 ** + "01100000", -- 4 ** + "01100000", -- 5 ** + "01100000", -- 6 ** + "01100000", -- 7 ** + "01100000", -- 8 ** + "01100010", -- 9 ** * + "01100110", -- a ** ** + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4d + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11100111", -- 3 *** *** + "11111111", -- 4 ******** + "11111111", -- 5 ******** + "11011011", -- 6 ** ** ** + "11000011", -- 7 ** ** + "11000011", -- 8 ** ** + "11000011", -- 9 ** ** + "11000011", -- a ** ** + "11000011", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4e + "00000000", -- 0 + "00000000", -- 1 + "11000110", -- 2 ** ** + "11100110", -- 3 *** ** + "11110110", -- 4 **** ** + "11111110", -- 5 ******* + "11011110", -- 6 ** **** + "11001110", -- 7 ** *** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "11000110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x4f + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x50 + "00000000", -- 0 + "00000000", -- 1 + "11111100", -- 2 ****** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01111100", -- 6 ***** + "01100000", -- 7 ** + "01100000", -- 8 ** + "01100000", -- 9 ** + "01100000", -- a ** + "11110000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x510 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11010110", -- 9 ** * ** + "11011110", -- a ** **** + "01111100", -- b ***** + "00001100", -- c ** + "00001110", -- d *** + "00000000", -- e + "00000000", -- f + -- code x52 + "00000000", -- 0 + "00000000", -- 1 + "11111100", -- 2 ****** + "01100110", -- 3 ** ** + "01100110", -- 4 ** ** + "01100110", -- 5 ** ** + "01111100", -- 6 ***** + "01101100", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "11100110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x53 + "00000000", -- 0 + "00000000", -- 1 + "01111100", -- 2 ***** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "01100000", -- 5 ** + "00111000", -- 6 *** + "00001100", -- 7 ** + "00000110", -- 8 ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x54 + "00000000", -- 0 + "00000000", -- 1 + "11111111", -- 2 ******** + "11011011", -- 3 ** ** ** + "10011001", -- 4 * ** * + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x55 + "00000000", -- 0 + "00000000", -- 1 + "11000110", -- 2 ** ** + "11000110", -- 3 ** ** + "11000110", -- 4 ** ** + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x56 + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11000011", -- 3 ** ** + "11000011", -- 4 ** ** + "11000011", -- 5 ** ** + "11000011", -- 6 ** ** + "11000011", -- 7 ** ** + "11000011", -- 8 ** ** + "01100110", -- 9 ** ** + "00111100", -- a **** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x57 + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11000011", -- 3 ** ** + "11000011", -- 4 ** ** + "11000011", -- 5 ** ** + "11000011", -- 6 ** ** + "11011011", -- 7 ** ** ** + "11011011", -- 8 ** ** ** + "11111111", -- 9 ******** + "01100110", -- a ** ** + "01100110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + + -- code x58 + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11000011", -- 3 ** ** + "01100110", -- 4 ** ** + "00111100", -- 5 **** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00111100", -- 8 **** + "01100110", -- 9 ** ** + "11000011", -- a ** ** + "11000011", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x59 + "00000000", -- 0 + "00000000", -- 1 + "11000011", -- 2 ** ** + "11000011", -- 3 ** ** + "11000011", -- 4 ** ** + "01100110", -- 5 ** ** + "00111100", -- 6 **** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5a + "00000000", -- 0 + "00000000", -- 1 + "11111111", -- 2 ******** + "11000011", -- 3 ** ** + "10000110", -- 4 * ** + "00001100", -- 5 ** + "00011000", -- 6 ** + "00110000", -- 7 ** + "01100000", -- 8 ** + "11000001", -- 9 ** * + "11000011", -- a ** ** + "11111111", -- b ******** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5b + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "00110000", -- 3 ** + "00110000", -- 4 ** + "00110000", -- 5 ** + "00110000", -- 6 ** + "00110000", -- 7 ** + "00110000", -- 8 ** + "00110000", -- 9 ** + "00110000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5c + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "10000000", -- 3 * + "11000000", -- 4 ** + "11100000", -- 5 *** + "01110000", -- 6 *** + "00111000", -- 7 *** + "00011100", -- 8 *** + "00001110", -- 9 *** + "00000110", -- a ** + "00000010", -- b * + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5d + "00000000", -- 0 + "00000000", -- 1 + "00111100", -- 2 **** + "00001100", -- 3 ** + "00001100", -- 4 ** + "00001100", -- 5 ** + "00001100", -- 6 ** + "00001100", -- 7 ** + "00001100", -- 8 ** + "00001100", -- 9 ** + "00001100", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5e + "00010000", -- 0 * + "00111000", -- 1 *** + "01101100", -- 2 ** ** + "11000110", -- 3 ** ** + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x5f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "11111111", -- d ******** + "00000000", -- e + "00000000", -- f + -- code x60 + "00110000", -- 0 ** + "00110000", -- 1 ** + "00011000", -- 2 ** + "00000000", -- 3 + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x61 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111000", -- 5 **** + "00001100", -- 6 ** + "01111100", -- 7 ***** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01110110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x62 + "00000000", -- 0 + "00000000", -- 1 + "11100000", -- 2 *** + "01100000", -- 3 ** + "01100000", -- 4 ** + "01111000", -- 5 **** + "01101100", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x63 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111100", -- 5 ***** + "11000110", -- 6 ** ** + "11000000", -- 7 ** + "11000000", -- 8 ** + "11000000", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x64 + "00000000", -- 0 + "00000000", -- 1 + "00011100", -- 2 *** + "00001100", -- 3 ** + "00001100", -- 4 ** + "00111100", -- 5 **** + "01101100", -- 6 ** ** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01110110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x65 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111100", -- 5 ***** + "11000110", -- 6 ** ** + "11111110", -- 7 ******* + "11000000", -- 8 ** + "11000000", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x66 + "00000000", -- 0 + "00000000", -- 1 + "00111000", -- 2 *** + "01101100", -- 3 ** ** + "01100100", -- 4 ** * + "01100000", -- 5 ** + "11110000", -- 6 **** + "01100000", -- 7 ** + "01100000", -- 8 ** + "01100000", -- 9 ** + "01100000", -- a ** + "11110000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x67 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01110110", -- 5 *** ** + "11001100", -- 6 ** ** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01111100", -- b ***** + "00001100", -- c ** + "11001100", -- d ** ** + "01111000", -- e **** + "00000000", -- f + -- code x68 + "00000000", -- 0 + "00000000", -- 1 + "11100000", -- 2 *** + "01100000", -- 3 ** + "01100000", -- 4 ** + "01101100", -- 5 ** ** + "01110110", -- 6 *** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "11100110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x69 + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00011000", -- 3 ** + "00000000", -- 4 + "00111000", -- 5 *** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6a + "00000000", -- 0 + "00000000", -- 1 + "00000110", -- 2 ** + "00000110", -- 3 ** + "00000000", -- 4 + "00001110", -- 5 *** + "00000110", -- 6 ** + "00000110", -- 7 ** + "00000110", -- 8 ** + "00000110", -- 9 ** + "00000110", -- a ** + "00000110", -- b ** + "01100110", -- c ** ** + "01100110", -- d ** ** + "00111100", -- e **** + "00000000", -- f + -- code x6b + "00000000", -- 0 + "00000000", -- 1 + "11100000", -- 2 *** + "01100000", -- 3 ** + "01100000", -- 4 ** + "01100110", -- 5 ** ** + "01101100", -- 6 ** ** + "01111000", -- 7 **** + "01111000", -- 8 **** + "01101100", -- 9 ** ** + "01100110", -- a ** ** + "11100110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6c + "00000000", -- 0 + "00000000", -- 1 + "00111000", -- 2 *** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00011000", -- 6 ** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00111100", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6d + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11100110", -- 5 *** ** + "11111111", -- 6 ******** + "11011011", -- 7 ** ** ** + "11011011", -- 8 ** ** ** + "11011011", -- 9 ** ** ** + "11011011", -- a ** ** ** + "11011011", -- b ** ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6e + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11011100", -- 5 ** *** + "01100110", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "01100110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x6f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111100", -- 5 ***** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x70 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11011100", -- 5 ** *** + "01100110", -- 6 ** ** + "01100110", -- 7 ** ** + "01100110", -- 8 ** ** + "01100110", -- 9 ** ** + "01100110", -- a ** ** + "01111100", -- b ***** + "01100000", -- c ** + "01100000", -- d ** + "11110000", -- e **** + "00000000", -- f + -- code x71 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01110110", -- 5 *** ** + "11001100", -- 6 ** ** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01111100", -- b ***** + "00001100", -- c ** + "00001100", -- d ** + "00011110", -- e **** + "00000000", -- f + -- code x72 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11011100", -- 5 ** *** + "01110110", -- 6 *** ** + "01100110", -- 7 ** ** + "01100000", -- 8 ** + "01100000", -- 9 ** + "01100000", -- a ** + "11110000", -- b **** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x73 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "01111100", -- 5 ***** + "11000110", -- 6 ** ** + "01100000", -- 7 ** + "00111000", -- 8 *** + "00001100", -- 9 ** + "11000110", -- a ** ** + "01111100", -- b ***** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x74 + "00000000", -- 0 + "00000000", -- 1 + "00010000", -- 2 * + "00110000", -- 3 ** + "00110000", -- 4 ** + "11111100", -- 5 ****** + "00110000", -- 6 ** + "00110000", -- 7 ** + "00110000", -- 8 ** + "00110000", -- 9 ** + "00110110", -- a ** ** + "00011100", -- b *** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x75 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11001100", -- 5 ** ** + "11001100", -- 6 ** ** + "11001100", -- 7 ** ** + "11001100", -- 8 ** ** + "11001100", -- 9 ** ** + "11001100", -- a ** ** + "01110110", -- b *** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x76 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11000011", -- 5 ** ** + "11000011", -- 6 ** ** + "11000011", -- 7 ** ** + "11000011", -- 8 ** ** + "01100110", -- 9 ** ** + "00111100", -- a **** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x77 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11000011", -- 5 ** ** + "11000011", -- 6 ** ** + "11000011", -- 7 ** ** + "11011011", -- 8 ** ** ** + "11011011", -- 9 ** ** ** + "11111111", -- a ******** + "01100110", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x78 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11000011", -- 5 ** ** + "01100110", -- 6 ** ** + "00111100", -- 7 **** + "00011000", -- 8 ** + "00111100", -- 9 **** + "01100110", -- a ** ** + "11000011", -- b ** ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x79 + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11000110", -- 5 ** ** + "11000110", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11000110", -- a ** ** + "01111110", -- b ****** + "00000110", -- c ** + "00001100", -- d ** + "11111000", -- e ***** + "00000000", -- f + -- code x7a + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00000000", -- 4 + "11111110", -- 5 ******* + "11001100", -- 6 ** ** + "00011000", -- 7 ** + "00110000", -- 8 ** + "01100000", -- 9 ** + "11000110", -- a ** ** + "11111110", -- b ******* + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7b + "00000000", -- 0 + "00000000", -- 1 + "00001110", -- 2 *** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "01110000", -- 6 *** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00001110", -- b *** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7c + "00000000", -- 0 + "00000000", -- 1 + "00011000", -- 2 ** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00000000", -- 6 + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "00011000", -- b ** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7d + "00000000", -- 0 + "00000000", -- 1 + "01110000", -- 2 *** + "00011000", -- 3 ** + "00011000", -- 4 ** + "00011000", -- 5 ** + "00001110", -- 6 *** + "00011000", -- 7 ** + "00011000", -- 8 ** + "00011000", -- 9 ** + "00011000", -- a ** + "01110000", -- b *** + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7e + "00000000", -- 0 + "00000000", -- 1 + "01110110", -- 2 *** ** + "11011100", -- 3 ** *** + "00000000", -- 4 + "00000000", -- 5 + "00000000", -- 6 + "00000000", -- 7 + "00000000", -- 8 + "00000000", -- 9 + "00000000", -- a + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000", -- f + -- code x7f + "00000000", -- 0 + "00000000", -- 1 + "00000000", -- 2 + "00000000", -- 3 + "00010000", -- 4 * + "00111000", -- 5 *** + "01101100", -- 6 ** ** + "11000110", -- 7 ** ** + "11000110", -- 8 ** ** + "11000110", -- 9 ** ** + "11111110", -- a ******* + "00000000", -- b + "00000000", -- c + "00000000", -- d + "00000000", -- e + "00000000" -- f + ); +begin + -- addr register to infer block RAM + process (clk) + begin + if (clk'event and clk = '1') then + addr_reg <= addr; + end if; + end process; + data <= ROM(to_integer(unsigned(addr_reg))); +end arch; + diff --git a/ecen320/tx_encoder/ps2_keyboard.vhd b/ecen320/tx_encoder/ps2_keyboard.vhd new file mode 100644 index 0000000..3dba646 --- /dev/null +++ b/ecen320/tx_encoder/ps2_keyboard.vhd @@ -0,0 +1,108 @@ +-------------------------------------------------------------------------------- +-- +-- FileName: ps2_keyboard.vhd +-- Dependencies: debounce.vhd +-- Design Software: Quartus II 32-bit Version 12.1 Build 177 SJ Full Version +-- +-- HDL CODE IS PROVIDED "AS IS." DIGI-KEY EXPRESSLY DISCLAIMS ANY +-- WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT +-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +-- PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL DIGI-KEY +-- BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL +-- DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF +-- PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS +-- BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), +-- ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS. +-- +-- Version History +-- Version 1.0 11/25/2013 Scott Larson +-- Initial Public Release +-- +-------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +ENTITY ps2_keyboard IS + GENERIC( + clk_freq : INTEGER := 50_000_000; --system clock frequency in Hz + debounce_counter_size : INTEGER := 8); --set such that (2^size)/clk_freq = 5us (size = 8 for 50MHz) + PORT( + clk : IN STD_LOGIC; --system clock + ps2_clk : IN STD_LOGIC; --clock signal from PS/2 keyboard + ps2_data : IN STD_LOGIC; --data signal from PS/2 keyboard + ps2_code_new : OUT STD_LOGIC; --flag that new PS/2 code is available on ps2_code bus + ps2_code : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --code received from PS/2 +END ps2_keyboard; + +ARCHITECTURE logic OF ps2_keyboard IS + SIGNAL sync_ffs : STD_LOGIC_VECTOR(1 DOWNTO 0); --synchronizer flip-flops for PS/2 signals + SIGNAL ps2_clk_int : STD_LOGIC; --debounced clock signal from PS/2 keyboard + SIGNAL ps2_data_int : STD_LOGIC; --debounced data signal from PS/2 keyboard + SIGNAL ps2_word : STD_LOGIC_VECTOR(10 DOWNTO 0); --stores the ps2 data word + SIGNAL error : STD_LOGIC; --validate parity, start, and stop bits + SIGNAL count_idle : INTEGER RANGE 0 TO clk_freq/18_000; --counter to determine PS/2 is idle + + --declare debounce component for debouncing PS2 input signals + COMPONENT debounce IS + GENERIC( + counter_size : INTEGER); --debounce period (in seconds) = 2^counter_size/(clk freq in Hz) + PORT( + clk : IN STD_LOGIC; --input clock + button : IN STD_LOGIC; --input signal to be debounced + result : OUT STD_LOGIC); --debounced signal + END COMPONENT; +BEGIN + + --synchronizer flip-flops + PROCESS(clk) + BEGIN + IF(clk'EVENT AND clk = '1') THEN --rising edge of system clock + sync_ffs(0) <= ps2_clk; --synchronize PS/2 clock signal + sync_ffs(1) <= ps2_data; --synchronize PS/2 data signal + END IF; + END PROCESS; + + --debounce PS2 input signals + debounce_ps2_clk: debounce + GENERIC MAP(counter_size => debounce_counter_size) + PORT MAP(clk => clk, button => sync_ffs(0), result => ps2_clk_int); + debounce_ps2_data: debounce + GENERIC MAP(counter_size => debounce_counter_size) + PORT MAP(clk => clk, button => sync_ffs(1), result => ps2_data_int); + + --input PS2 data + PROCESS(ps2_clk_int) + BEGIN + IF(ps2_clk_int'EVENT AND ps2_clk_int = '0') THEN --falling edge of PS2 clock + ps2_word <= ps2_data_int & ps2_word(10 DOWNTO 1); --shift in PS2 data bit + END IF; + END PROCESS; + + --verify that parity, start, and stop bits are all correct + error <= NOT (NOT ps2_word(0) AND ps2_word(10) AND (ps2_word(9) XOR ps2_word(8) XOR + ps2_word(7) XOR ps2_word(6) XOR ps2_word(5) XOR ps2_word(4) XOR ps2_word(3) XOR + ps2_word(2) XOR ps2_word(1))); + + --determine if PS2 port is idle (i.e. last transaction is finished) and output result + PROCESS(clk) + BEGIN + IF(clk'EVENT AND clk = '1') THEN --rising edge of system clock + + IF(ps2_clk_int = '0') THEN --low PS2 clock, PS/2 is active + count_idle <= 0; --reset idle counter + ELSIF(count_idle /= clk_freq/18_000) THEN --PS2 clock has been high less than a half clock period (<55us) + count_idle <= count_idle + 1; --continue counting + END IF; + + IF(count_idle = clk_freq/18_000 AND error = '0') THEN --idle threshold reached and no errors detected + ps2_code_new <= '1'; --set flag that new PS/2 code is available + ps2_code <= ps2_word(8 DOWNTO 1); --output new PS/2 code + ELSE --PS/2 port active or error detected + ps2_code_new <= '0'; --set flag that PS/2 transaction is in progress + END IF; + + END IF; + END PROCESS; + +END logic; diff --git a/ecen320/tx_encoder/ps2_keyboard_to_ascii.vhd b/ecen320/tx_encoder/ps2_keyboard_to_ascii.vhd new file mode 100644 index 0000000..e8eb1f3 --- /dev/null +++ b/ecen320/tx_encoder/ps2_keyboard_to_ascii.vhd @@ -0,0 +1,319 @@ +-------------------------------------------------------------------------------- +-- +-- FileName: ps2_keyboard_to_ascii.vhd +-- Dependencies: ps2_keyboard.vhd, debounce.vhd +-- Design Software: Quartus II 32-bit Version 12.1 Build 177 SJ Full Version +-- +-- HDL CODE IS PROVIDED "AS IS." DIGI-KEY EXPRESSLY DISCLAIMS ANY +-- WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT +-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +-- PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL DIGI-KEY +-- BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL +-- DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF +-- PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS +-- BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), +-- ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS. +-- +-- Version History +-- Version 1.0 11/29/2013 Scott Larson +-- Initial Public Release +-- +-------------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +ENTITY ps2_keyboard_to_ascii IS + GENERIC( + clk_freq : INTEGER := 50_000_000; --system clock frequency in Hz + ps2_debounce_counter_size : INTEGER := 8); --set such that 2^size/clk_freq = 5us (size = 8 for 50MHz) + PORT( + clk : IN STD_LOGIC; --system clock input + ps2_clk : IN STD_LOGIC; --clock signal from PS2 keyboard + ps2_data : IN STD_LOGIC; --data signal from PS2 keyboard + ascii_new : OUT STD_LOGIC; --output flag indicating new ASCII value + ascii_code : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); --ASCII value +END ps2_keyboard_to_ascii; + +ARCHITECTURE behavior OF ps2_keyboard_to_ascii IS + TYPE machine IS(ready, new_code, translate, output); --needed states + SIGNAL state : machine; --state machine + SIGNAL ps2_code_new : STD_LOGIC; --new PS2 code flag from ps2_keyboard component + SIGNAL ps2_code : STD_LOGIC_VECTOR(7 DOWNTO 0); --PS2 code input form ps2_keyboard component + SIGNAL prev_ps2_code_new : STD_LOGIC := '1'; --value of ps2_code_new flag on previous clock + SIGNAL break : STD_LOGIC := '0'; --'1' for break code, '0' for make code + SIGNAL e0_code : STD_LOGIC := '0'; --'1' for multi-code commands, '0' for single code commands + SIGNAL caps_lock : STD_LOGIC := '0'; --'1' if caps lock is active, '0' if caps lock is inactive + SIGNAL control_r : STD_LOGIC := '0'; --'1' if right control key is held down, else '0' + SIGNAL control_l : STD_LOGIC := '0'; --'1' if left control key is held down, else '0' + SIGNAL shift_r : STD_LOGIC := '0'; --'1' if right shift is held down, else '0' + SIGNAL shift_l : STD_LOGIC := '0'; --'1' if left shift is held down, else '0' + SIGNAL ascii : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"FF"; --internal value of ASCII translation + + --declare PS2 keyboard interface component + COMPONENT ps2_keyboard IS + GENERIC( + clk_freq : INTEGER; --system clock frequency in Hz + debounce_counter_size : INTEGER); --set such that 2^size/clk_freq = 5us (size = 8 for 50MHz) + PORT( + clk : IN STD_LOGIC; --system clock + ps2_clk : IN STD_LOGIC; --clock signal from PS2 keyboard + ps2_data : IN STD_LOGIC; --data signal from PS2 keyboard + ps2_code_new : OUT STD_LOGIC; --flag that new PS/2 code is available on ps2_code bus + ps2_code : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --code received from PS/2 + END COMPONENT; + +BEGIN + + --instantiate PS2 keyboard interface logic + ps2_keyboard_0: ps2_keyboard + GENERIC MAP(clk_freq => clk_freq, debounce_counter_size => ps2_debounce_counter_size) + PORT MAP(clk => clk, ps2_clk => ps2_clk, ps2_data => ps2_data, ps2_code_new => ps2_code_new, ps2_code => ps2_code); + + PROCESS(clk) + BEGIN + IF(clk'EVENT AND clk = '1') THEN + prev_ps2_code_new <= ps2_code_new; --keep track of previous ps2_code_new values to determine low-to-high transitions + CASE state IS + + --ready state: wait for a new PS2 code to be received + WHEN ready => + IF(prev_ps2_code_new = '0' AND ps2_code_new = '1') THEN --new PS2 code received + ascii_new <= '0'; --reset new ASCII code indicator + state <= new_code; --proceed to new_code state + ELSE --no new PS2 code received yet + state <= ready; --remain in ready state + END IF; + + --new_code state: determine what to do with the new PS2 code + WHEN new_code => + IF(ps2_code = x"F0") THEN --code indicates that next command is break + break <= '1'; --set break flag + state <= ready; --return to ready state to await next PS2 code + ELSIF(ps2_code = x"E0") THEN --code indicates multi-key command + e0_code <= '1'; --set multi-code command flag + state <= ready; --return to ready state to await next PS2 code + ELSE --code is the last PS2 code in the make/break code + ascii(7) <= '1'; --set internal ascii value to unsupported code (for verification) + state <= translate; --proceed to translate state + END IF; + + --translate state: translate PS2 code to ASCII value + WHEN translate => + break <= '0'; --reset break flag + e0_code <= '0'; --reset multi-code command flag + + --handle codes for control, shift, and caps lock + CASE ps2_code IS + WHEN x"58" => --caps lock code + IF(break = '0') THEN --if make command + caps_lock <= NOT caps_lock; --toggle caps lock + END IF; + WHEN x"14" => --code for the control keys + IF(e0_code = '1') THEN --code for right control + control_r <= NOT break; --update right control flag + ELSE --code for left control + control_l <= NOT break; --update left control flag + END IF; + WHEN x"12" => --left shift code + shift_l <= NOT break; --update left shift flag + WHEN x"59" => --right shift code + shift_r <= NOT break; --update right shift flag + WHEN OTHERS => NULL; + END CASE; + + --translate control codes (these do not depend on shift or caps lock) + IF(control_l = '1' OR control_r = '1') THEN + CASE ps2_code IS + WHEN x"1E" => ascii <= x"00"; --^@ NUL + WHEN x"1C" => ascii <= x"01"; --^A SOH + WHEN x"32" => ascii <= x"02"; --^B STX + WHEN x"21" => ascii <= x"03"; --^C ETX + WHEN x"23" => ascii <= x"04"; --^D EOT + WHEN x"24" => ascii <= x"05"; --^E ENQ + WHEN x"2B" => ascii <= x"06"; --^F ACK + WHEN x"34" => ascii <= x"07"; --^G BEL + WHEN x"33" => ascii <= x"08"; --^H BS + WHEN x"43" => ascii <= x"09"; --^I HT + WHEN x"3B" => ascii <= x"0A"; --^J LF + WHEN x"42" => ascii <= x"0B"; --^K VT + WHEN x"4B" => ascii <= x"0C"; --^L FF + WHEN x"3A" => ascii <= x"0D"; --^M CR + WHEN x"31" => ascii <= x"0E"; --^N SO + WHEN x"44" => ascii <= x"0F"; --^O SI + WHEN x"4D" => ascii <= x"10"; --^P DLE + WHEN x"15" => ascii <= x"11"; --^Q DC1 + WHEN x"2D" => ascii <= x"12"; --^R DC2 + WHEN x"1B" => ascii <= x"13"; --^S DC3 + WHEN x"2C" => ascii <= x"14"; --^T DC4 + WHEN x"3C" => ascii <= x"15"; --^U NAK + WHEN x"2A" => ascii <= x"16"; --^V SYN + WHEN x"1D" => ascii <= x"17"; --^W ETB + WHEN x"22" => ascii <= x"18"; --^X CAN + WHEN x"35" => ascii <= x"19"; --^Y EM + WHEN x"1A" => ascii <= x"1A"; --^Z SUB + WHEN x"54" => ascii <= x"1B"; --^[ ESC + WHEN x"5D" => ascii <= x"1C"; --^\ FS + WHEN x"5B" => ascii <= x"1D"; --^] GS + WHEN x"36" => ascii <= x"1E"; --^^ RS + WHEN x"4E" => ascii <= x"1F"; --^_ US + WHEN x"4A" => ascii <= x"7F"; --^? DEL + WHEN OTHERS => NULL; + END CASE; + ELSE --if control keys are not pressed + + --translate characters that do not depend on shift, or caps lock + CASE ps2_code IS + WHEN x"29" => ascii <= x"20"; --space + WHEN x"66" => ascii <= x"08"; --backspace (BS control code) + WHEN x"0D" => ascii <= x"09"; --tab (HT control code) + WHEN x"5A" => ascii <= x"0D"; --enter (CR control code) + WHEN x"76" => ascii <= x"1B"; --escape (ESC control code) + WHEN x"71" => + IF(e0_code = '1') THEN --ps2 code for delete is a multi-key code + ascii <= x"7F"; --delete + END IF; + WHEN OTHERS => NULL; + END CASE; + + --translate letters (these depend on both shift and caps lock) + IF((shift_r = '0' AND shift_l = '0' AND caps_lock = '0') OR + ((shift_r = '1' OR shift_l = '1') AND caps_lock = '1')) THEN --letter is lowercase + CASE ps2_code IS + WHEN x"1C" => ascii <= x"61"; --a + WHEN x"32" => ascii <= x"62"; --b + WHEN x"21" => ascii <= x"63"; --c + WHEN x"23" => ascii <= x"64"; --d + WHEN x"24" => ascii <= x"65"; --e + WHEN x"2B" => ascii <= x"66"; --f + WHEN x"34" => ascii <= x"67"; --g + WHEN x"33" => ascii <= x"68"; --h + WHEN x"43" => ascii <= x"69"; --i + WHEN x"3B" => ascii <= x"6A"; --j + WHEN x"42" => ascii <= x"6B"; --k + WHEN x"4B" => ascii <= x"6C"; --l + WHEN x"3A" => ascii <= x"6D"; --m + WHEN x"31" => ascii <= x"6E"; --n + WHEN x"44" => ascii <= x"6F"; --o + WHEN x"4D" => ascii <= x"70"; --p + WHEN x"15" => ascii <= x"71"; --q + WHEN x"2D" => ascii <= x"72"; --r + WHEN x"1B" => ascii <= x"73"; --s + WHEN x"2C" => ascii <= x"74"; --t + WHEN x"3C" => ascii <= x"75"; --u + WHEN x"2A" => ascii <= x"76"; --v + WHEN x"1D" => ascii <= x"77"; --w + WHEN x"22" => ascii <= x"78"; --x + WHEN x"35" => ascii <= x"79"; --y + WHEN x"1A" => ascii <= x"7A"; --z + WHEN OTHERS => NULL; + END CASE; + ELSE --letter is uppercase + CASE ps2_code IS + WHEN x"1C" => ascii <= x"41"; --A + WHEN x"32" => ascii <= x"42"; --B + WHEN x"21" => ascii <= x"43"; --C + WHEN x"23" => ascii <= x"44"; --D + WHEN x"24" => ascii <= x"45"; --E + WHEN x"2B" => ascii <= x"46"; --F + WHEN x"34" => ascii <= x"47"; --G + WHEN x"33" => ascii <= x"48"; --H + WHEN x"43" => ascii <= x"49"; --I + WHEN x"3B" => ascii <= x"4A"; --J + WHEN x"42" => ascii <= x"4B"; --K + WHEN x"4B" => ascii <= x"4C"; --L + WHEN x"3A" => ascii <= x"4D"; --M + WHEN x"31" => ascii <= x"4E"; --N + WHEN x"44" => ascii <= x"4F"; --O + WHEN x"4D" => ascii <= x"50"; --P + WHEN x"15" => ascii <= x"51"; --Q + WHEN x"2D" => ascii <= x"52"; --R + WHEN x"1B" => ascii <= x"53"; --S + WHEN x"2C" => ascii <= x"54"; --T + WHEN x"3C" => ascii <= x"55"; --U + WHEN x"2A" => ascii <= x"56"; --V + WHEN x"1D" => ascii <= x"57"; --W + WHEN x"22" => ascii <= x"58"; --X + WHEN x"35" => ascii <= x"59"; --Y + WHEN x"1A" => ascii <= x"5A"; --Z + WHEN OTHERS => NULL; + END CASE; + END IF; + + --translate numbers and symbols (these depend on shift but not caps lock) + IF(shift_l = '1' OR shift_r = '1') THEN --key's secondary character is desired + CASE ps2_code IS + WHEN x"16" => ascii <= x"21"; --! + WHEN x"52" => ascii <= x"22"; --" + WHEN x"26" => ascii <= x"23"; --# + WHEN x"25" => ascii <= x"24"; --$ + WHEN x"2E" => ascii <= x"25"; --% + WHEN x"3D" => ascii <= x"26"; --& + WHEN x"46" => ascii <= x"28"; --( + WHEN x"45" => ascii <= x"29"; --) + WHEN x"3E" => ascii <= x"2A"; --* + WHEN x"55" => ascii <= x"2B"; --+ + WHEN x"4C" => ascii <= x"3A"; --: + WHEN x"41" => ascii <= x"3C"; --< + WHEN x"49" => ascii <= x"3E"; --> + WHEN x"4A" => ascii <= x"3F"; --? + WHEN x"1E" => ascii <= x"40"; --@ + WHEN x"36" => ascii <= x"5E"; --^ + WHEN x"4E" => ascii <= x"5F"; --_ + WHEN x"54" => ascii <= x"7B"; --{ + WHEN x"5D" => ascii <= x"7C"; --| + WHEN x"5B" => ascii <= x"7D"; --} + WHEN x"0E" => ascii <= x"7E"; --~ + WHEN OTHERS => NULL; + END CASE; + ELSE --key's primary character is desired + CASE ps2_code IS + WHEN x"45" => ascii <= x"30"; --0 + WHEN x"16" => ascii <= x"31"; --1 + WHEN x"1E" => ascii <= x"32"; --2 + WHEN x"26" => ascii <= x"33"; --3 + WHEN x"25" => ascii <= x"34"; --4 + WHEN x"2E" => ascii <= x"35"; --5 + WHEN x"36" => ascii <= x"36"; --6 + WHEN x"3D" => ascii <= x"37"; --7 + WHEN x"3E" => ascii <= x"38"; --8 + WHEN x"46" => ascii <= x"39"; --9 + WHEN x"52" => ascii <= x"27"; --' + WHEN x"41" => ascii <= x"2C"; --, + WHEN x"4E" => ascii <= x"2D"; --- + WHEN x"49" => ascii <= x"2E"; --. + WHEN x"4A" => ascii <= x"2F"; --/ + WHEN x"4C" => ascii <= x"3B"; --; + WHEN x"55" => ascii <= x"3D"; --= + WHEN x"54" => ascii <= x"5B"; --[ + WHEN x"5D" => ascii <= x"5C"; --\ + WHEN x"5B" => ascii <= x"5D"; --] + WHEN x"0E" => ascii <= x"60"; --` + WHEN OTHERS => NULL; + END CASE; + END IF; + + END IF; + + IF(break = '0') THEN --the code is a make + state <= output; --proceed to output state + ELSE --code is a break + state <= ready; --return to ready state to await next PS2 code + END IF; + + --output state: verify the code is valid and output the ASCII value + WHEN output => + IF(ascii(7) = '0') THEN --the PS2 code has an ASCII output + ascii_new <= '1'; --set flag indicating new ASCII output + ascii_code <= ascii(6 DOWNTO 0); --output the ASCII value + END IF; + state <= ready; --return to ready state to await next PS2 code + + END CASE; + END IF; + END PROCESS; + +END behavior; + + + diff --git a/ecen320/tx_encoder/seven_segment_display.vhd b/ecen320/tx_encoder/seven_segment_display.vhd new file mode 100644 index 0000000..d33416b --- /dev/null +++ b/ecen320/tx_encoder/seven_segment_display.vhd @@ -0,0 +1,78 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity seven_segment_display is + generic( + COUNTER_BITS: natural := 15 + ); + port( + clk: in std_logic; + data_in: in std_logic_vector(15 downto 0); + dp_in: in std_logic_vector(3 downto 0); + blank: in std_logic_vector(3 downto 0); + seg: out std_logic_vector(6 downto 0); + dp: out std_logic; + an: out std_logic_vector(3 downto 0) + ); +end seven_segment_display; + +architecture seven_arch of seven_segment_display is + --signal which_sym: std_logic_vector(3 downto 0); + signal mydatain, an_temp: std_logic_vector(3 downto 0); + signal r_reg: unsigned(COUNTER_BITS-1 downto 0):=(others=>'0'); + signal r_next: unsigned(COUNTER_BITS-1 downto 0); + signal anode_select: std_logic_vector(1 downto 0); +begin + --register + process(clk) + begin + if clk'event and clk='1' then + r_reg <= r_next; + end if; + end process; + --next-state logic + process(r_reg) + begin + r_next <= r_reg+1; + end process; + anode_select <= std_logic_vector(r_reg(COUNTER_BITS-1 downto COUNTER_BITS-2)); + + with mydatain select + seg <= "1000000" when "0000", + "1111001" when "0001", + "0100100" when "0010", + "0110000" when "0011", + "0011001" when "0100", + "0010010" when "0101", + "0000010" when "0110", + "1111000" when "0111", + "0000000" when "1000", + "0010000" when "1001", + "0001000" when "1010", + "0000011" when "1011", + "1000110" when "1100", + "0100001" when "1101", + "0000110" when "1110", + "0001110" when others; + + mydatain <= data_in(3 downto 0) when anode_select = "00" else + data_in(7 downto 4) when anode_select = "01" else + data_in(11 downto 8) when anode_select = "10" else + data_in(15 downto 12); + + + dp <= not dp_in(0) when anode_select="00" else + not dp_in(1) when anode_select="01" else + not dp_in(2) when anode_select="10" else + not dp_in(3); + + an_temp <= "1110" when anode_select="00" else + "1101" when anode_select="01" else + "1011" when anode_select="10" else + "0111" when anode_select="11" else + "0000"; + + an <= an_temp or blank; + +end seven_arch; \ No newline at end of file diff --git a/ecen320/tx_encoder/tx.vhd b/ecen320/tx_encoder/tx.vhd new file mode 100644 index 0000000..87885b6 --- /dev/null +++ b/ecen320/tx_encoder/tx.vhd @@ -0,0 +1,207 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity tx is + generic( + CLK_RATE: natural := 50_000_000; + BAUD_RATE: natural := 19_200 + ); + port( + clk: in std_logic; + rst: in std_logic; + data_in: in std_logic_vector(7 downto 0); + send_character: in std_logic; + tx_out: out std_logic; + tx_busy:out std_logic + + ); +end tx; + +architecture tran_arch of tx is + function log2c(n: integer) return integer is + variable m, p: integer; + begin + m := 0; + p := 1; + while p'0'); + signal counter_next: unsigned(BIT_COUNTER_BITS downto 0); + + type fsm_state_type is + (idle,strt,b0,b1,b2,b3,b4,b5,b6,b7,stp,retrn); + signal state_reg, state_next: fsm_state_type; + + -- BitTimer signal + signal tx_bit: std_logic; + + -- Shift Register signal + signal shift_out: std_logic; + signal shift_next: std_logic; + signal mydata: std_logic_vector(7 downto 0); + + -- FSM signal + signal load: std_logic; + signal clrTimer: std_logic; + signal shift: std_logic; + signal stop: std_logic; + signal start: std_logic; + + -- Transmit Out signal + +begin + + -- Transmit Out + process(clk,shift_out) + begin + if(clk'event and clk='1') then + tx_out <= shift_out; + if(start='1') then + tx_out <= '0'; + end if; + if(stop='1') then + tx_out <= '1'; + end if; + end if; + end process; + + -- FSM + process(clk,rst) + begin + if(rst='1') then + state_reg <= idle; + elsif(clk'event and clk='1') then + state_reg <= state_next; + end if; + end process; + + process(state_reg,send_character,tx_bit) + begin + state_next <= state_reg; + start <= '0'; + stop <= '0'; + tx_busy <= '1'; + shift <= '0'; + clrTimer <= '0'; + load <= '0'; + case state_reg is + when idle => + stop <= '1'; + clrTimer <= '1'; + tx_busy <= '0'; + if(send_character='1') then + load <= '1'; + state_next <= strt; + end if; + when strt => + start <= '1'; + if(tx_bit='1') then + state_next <= b0; + end if; + when b0 => + if(tx_bit='1') then + shift <= '1'; + state_next <= b1; + end if; + when b1 => + if(tx_bit='1') then + shift <= '1'; + state_next <= b2; + end if; + when b2 => + if(tx_bit='1') then + shift <= '1'; + state_next <= b3; + end if; + when b3 => + if(tx_bit='1') then + shift <= '1'; + state_next <= b4; + end if; + when b4 => + if(tx_bit='1') then + shift <= '1'; + state_next <= b5; + end if; + when b5 => + if(tx_bit='1') then + shift <= '1'; + state_next <= b6; + end if; + when b6 => + if(tx_bit='1') then + shift <= '1'; + state_next <= b7; + end if; + when b7 => + if(tx_bit='1') then + shift <= '1'; + state_next <= stp; + end if; + when stp => + stop <= '1'; + if(tx_bit='1') then + state_next <= retrn; + end if; + when retrn => + stop <= '1'; + if(send_character='0') then + state_next <= idle; + end if; + + end case; + + end process; + + + -- BitTimer + process(clk,rst) + begin + if(rst='1') then + counter <= (others=>'0'); + elsif(clk'event and clk='1') then + counter <= counter_next; + end if; + end process; + + counter_next <= (others=>'0') when counter = to_unsigned(BIT_COUNTER_MAX_VAL,BIT_COUNTER_BITS) else + (others=>'0') when state_reg = idle else + counter+1; + tx_bit <= '1' when counter = to_unsigned(BIT_COUNTER_MAX_VAL,BIT_COUNTER_BITS) else + '0'; + + -- Shift Register + process(clk,rst,load) + begin + if(rst='1') then + mydata <= (others=>'0'); + elsif(clk'event and clk='1') then + if(load = '1') then + mydata <= data_in; + else + mydata <= mydata; + end if; + shift_out <= shift_next; + end if; + end process; + + shift_next <= mydata(0) when state_reg=b0 else + mydata(1) when state_reg=b1 else + mydata(2) when state_reg=b2 else + mydata(3) when state_reg=b3 else + mydata(4) when state_reg=b4 else + mydata(5) when state_reg=b5 else + mydata(6) when state_reg=b6 else + mydata(7) when state_reg=b7 else + '0'; + +end tran_arch; \ No newline at end of file diff --git a/ecen320/tx_encoder/tx_top.vhd b/ecen320/tx_encoder/tx_top.vhd new file mode 100644 index 0000000..e986e32 --- /dev/null +++ b/ecen320/tx_encoder/tx_top.vhd @@ -0,0 +1,104 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity tx_top is + generic(COUNTER_BIT: natural := 20); + port( + clk: in std_logic; + sw: in std_logic_vector(7 downto 0); + seg : out std_logic_vector(6 downto 0); + an : out std_logic_vector(3 downto 0) := "1100"; + dp : out std_logic; + tx_out: out std_logic; + btn: in std_logic_vector(3 downto 0); + data_out : out std_logic_vector(15 downto 0) + ); +end tx_top; + +architecture top_arch of tx_top is + +-- component seven_segment_display +-- generic( +-- COUNTER_BITS: natural := 15 +-- ); +-- port( +-- clk: in std_logic; +-- data_in: in std_logic_vector(15 downto 0); +-- dp_in: in std_logic_Vector(3 downto 0); +-- blank: in std_logic_vector(3 downto 0); +-- seg : out std_logic_vector(6 downto 0); +-- dp : out std_logic; +-- an : out std_logic_vector(3 downto 0) +-- ); +-- end component; + + component tx + port( + clk: in std_logic; + rst: in std_logic; + data_in: in std_logic_vector(7 downto 0); + send_character: in std_logic; + tx_out: out std_logic; + tx_busy: out std_logic + + ); + end component; + + signal reset: std_logic := '0'; + signal dp_in: std_logic_vector(3 downto 0) := "0000"; + signal blank4: std_logic_vector(3 downto 0) := (others=>'0'); + signal data_in: std_logic_vector(7 downto 0) := (others=>'0'); + signal send_character: std_logic; + signal counter: unsigned(COUNTER_BIT downto 0) := (others=>'0'); + signal debouncing: std_logic; + signal data_in2: std_logic_vector(15 downto 0) := (others=>'0'); + + begin + +-- bottom_segment: seven_segment_display +-- generic map(COUNTER_BITS=>15) +-- port map(clk=>clk, an=>an, seg=>seg, dp=>dp, blank=>blank4, +-- data_in=>data_in2, dp_in=>dp_in +-- ); + + bottom_tx: tx + port map(clk=>clk, rst=>reset, send_character=>send_character, + tx_out=>tx_out, tx_busy=>open, data_in=>data_in + ); + + data_out <= "00000000" & sw; + data_in <= sw; + data_in2 <= "00000000" & sw; + -- debouncer + process(clk) + begin + if(rising_edge(clk)) then + if(counter = "111111111111111111111") then + debouncing <= '1'; + counter <= (others=>'0'); + else + debouncing <= '0'; + counter <= counter+1; + end if; + end if; + end process; + + -- button logic + process(clk,btn) + begin + if(rising_edge(clk)) then + if (btn(3)='1') then + reset <= '1'; + elsif (btn(0)='1') then + if(debouncing='1') then + send_character <= '1'; + end if; + else + reset <= '0'; + send_character <= '0'; + end if; + end if; + end process; + +end top_arch; \ No newline at end of file diff --git a/ecen320/tx_encoder/vga_timing.vhd b/ecen320/tx_encoder/vga_timing.vhd new file mode 100644 index 0000000..2a2bccf --- /dev/null +++ b/ecen320/tx_encoder/vga_timing.vhd @@ -0,0 +1,83 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity vga_timing is + port( + clk: in std_logic; + rst: in std_logic; + HS: out std_logic; + VS: out std_logic; + pixel_x: out std_logic_vector(9 downto 0); + pixel_y: out std_logic_vector(9 downto 0); + last_column: out std_logic; + last_row: out std_logic; + blank: out std_logic + ); +end vga_timing; + +architecture behavior of vga_timing is + signal pixel_en: std_logic := '0'; + signal column: unsigned(9 downto 0); + signal column_next: unsigned(9 downto 0); + signal row: unsigned(9 downto 0); + signal row_next: unsigned(9 downto 0); +begin + -- pixel clock + process(clk, rst) + begin + if(rst = '1') then + pixel_en <= '0'; + elsif(clk'event and clk='1') then + pixel_en <= not pixel_en; + end if; + end process; + + -- register for HS counter + process(rst,clk) + begin + if(rst = '1') then + column <= (others=>'0'); + elsif(clk'event and clk = '1') then + if(pixel_en = '1') then + column <= column_next; + end if; + end if; + end process; + -- next state HS counter + column_next <= (others=>'0') when column = 799 else + column + 1; + -- output logic for HS counter + last_column <= '1' when column = 639 else + '0'; + HS <= '0' when ((column > 655) and (column < 752)) else + '1'; + pixel_x <= std_logic_vector(column); + + + -- register for VS counter + process(rst,clk, pixel_en, column) + begin + if(rst = '1') then + row <= (others=>'0'); + elsif(clk'event and clk = '1') then + if(pixel_en = '1' and column = 799) then -- only increment if HS is 799 and the pixel enable is high + row <= row_next; + end if; + end if; + end process; + -- next state VS counter + row_next <= (others=>'0') when row = 520 else + row + 1; + -- output logic for VS counter + last_row <= '1' when row = 479 else + '0'; + VS <= '0' when ((row > 489) and (row < 492)) else + '1'; + pixel_y <= std_logic_vector(row); + + -- blank signal + blank <= '1' when (row > 479) or (column > 639) else + '0'; + +end behavior; \ No newline at end of file