I decided to start a new thread on the Controller Board because I was having difficulty finding a decent camera module. In the end I decided to use an HDMI video input. This way a camera could be hooked up or any other HDMI video source outputting 1920x1080 @60Hz.
The IC I was looking at is an Analog Devices
ADV7441. It is a video digitizer with the capability to handle many types of video inputs, even HDMI. It also handles the audio present in the HDMI stream. A very nice looking chip in a 144-pin QFP package, although I am prepared for a challenge.
EDIT: This IC is presently not recommended for new designs, so I am going to use an
ADV7611 HDMI Receiver. It only has a single HDMI input and also can strip out the audio from the multimedia stream with the help of an
SSM2604 audio codec. The receiver comes in an easy to handle 96-pin QFP package. There is a 1/8"
dual stereo jack for audio out
and audio in for experimentation with the audio codec IC. The audio codec is in a 20-pin QFN package.
There are 2 fast 2Mx18 SyncRAM's onboard as well, each with their own dedicated address and data buses. They can be used as video frame buffers, or maybe 1 as a frame buffer and 1 for sprite data.
It also has a 3 x USB to UART interfaces using the FTDI FT230X. Connections to a PC for file transfer, separate keyboard and separate mouse
should be possible.
A DS1085L programmable frequency generator is onboard as well. It can be used in conjunction with the FPGAs PLL to generate virtually any frequency needed for the project.
A TSC2003 resistive touchscreen controller is onboard as well for experimentation.
At the center of all this will be a Xilinx XC6SLX25-3FT256, a 256-pin 1mm BGA, with a SPI FLASH PROM. Only 2 Voltages are needed for the FPGA, 3.3v for VCCaux & VCCO and 1.2v for VCCint. The FPGA will control the HDMI receiver, audio codec, touchscreen controller and programmable oscillator through a common I2C bus.
So the plan is to digitize incoming HDMI video into 24 bpp, take the
least 5-6-5 bits from the RGB stream, mix it with the onboard videoRAM and then send the stream to 1 Parallel Video Board which will output the 1080p video through an older style VGA connector to an HD monitor. The original idea was to use at least 3 PVB's, but the pins were not there on this 256-pin Spartan 6. A successor to this K1 controller board will be able to control 6 PVB's. As it stands the 1 PVB will receive commands using an 8 bit parallel interface. Also, the controller board can choose which FPGA PROM the PVB should be programmed with.
Big dreams indeed, but I will take it one step at a time. The first step, after the board layout, is properly mounting the BGA and controlling the 1 PVB. Some discussion of how I will attempt this has already
taken place.
Here is the constraints file that locks in the pin locations for ISE for program the FPGA. A great way to re-check a design, found just a few problems that I corrected.
Code:
# Synchronous Ram #1 Signals #
NET "SRAddr[0]" LOC = PA4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //VREF
NET "SRAddr[1]" LOC = PE7 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SRAddr[2]" LOC = PA3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //VREF
NET "SRAddr[3]" LOC = PB3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[4]" LOC = PA2 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[5]" LOC = PB2 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[6]" LOC = PF4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[7]" LOC = PF3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[8]" LOC = PE4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[9]" LOC = PD5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[10]" LOC = PC5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[11]" LOC = PE6 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[12]" LOC = PD6 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[13]" LOC = PA8 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[14]" LOC = PB8 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[15]" LOC = PA7 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[16]" LOC = PC7 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[17]" LOC = PA6 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[18]" LOC = PB6 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[19]" LOC = PA5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[20]" LOC = PB5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[0]" LOC = PD6 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[1]" LOC = PD8 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[2]" LOC = PC8 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //VREF
NET "SRD[3]" LOC = PE8 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //N_GCLK
NET "SRD[4]" LOC = PE10 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SRD[5]" LOC = PD11 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[6]" LOC = PE11 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[7]" LOC = PD12 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[8]" LOC = PB1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[9]" LOC = PC3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[10]" LOC = PC1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[11]" LOC = PC2 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[12]" LOC = PD1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[13]" LOC = PE1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[14]" LOC = PE3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[15]" LOC = PF2 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SRWEn" LOC = PF5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRCLK" LOC = PF1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //N_GCLK
# Synchronous Ram #2 Signals #
NET "SRAddr[0]" LOC = PT6 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[1]" LOC = PP6 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[2]" LOC = PT7 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //N_GCLK
NET "SRAddr[3]" LOC = PR7 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SRAddr[4]" LOC = PT8 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SRAddr[5]" LOC = PR9 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[6]" LOC = PK5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[7]" LOC = PH4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SRAddr[8]" LOC = PL4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[9]" LOC = PM4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[10]" LOC = PL5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[11]" LOC = PK1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[12]" LOC = PK2 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[13]" LOC = PP4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[14]" LOC = PT4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRAddr[15]" LOC = PR5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //D0-D15
NET "SRAddr[16]" LOC = PT5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //RDWR_B_VREF
NET "SRAddr[17]" LOC = PM6 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //D0-D15
NET "SRAddr[18]" LOC = PP8 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SRAddr[19]" LOC = PP7 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SRAddr[20]" LOC = PN8 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //N_GCLK
NET "SRD[0]" LOC = PL1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[1]" LOC = PL3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[2]" LOC = PM1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[3]" LOC = PM2 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[4]" LOC = PN1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[5]" LOC = PN3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[6]" LOC = PP1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[7]" LOC = PP2 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[8]" LOC = PN6 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //D0-D15
NET "SRD[9]" LOC = PN5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //D0-D15
NET "SRD[10]" LOC = PP5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //D0-D15
NET "SRD[11]" LOC = PN4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[12]" LOC = PM5 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[13]" LOC = PM3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //VREF
NET "SRD[14]" LOC = PR2 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRD[15]" LOC = PR1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "SRWEn" LOC = PK3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SRCLK" LOC = PH4 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
# USB TO UART Signals #
NET "PC_TX" LOC = PJ3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "PC_RX" LOC = PJ1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "MOUSE_TX" LOC = PH2 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "MOUSE_RX" LOC = PH1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "KB_TX" LOC = PG3 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "KB_TX" LOC = PG1 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
# I2C Signals #
NET "SCL" LOC = PJ11 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "SDA" LOC = PM9 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
# HDMI Receiver #
NET "P23" LOC = PA9 |IOSTANDARD = LVCMOS33; //N_GCLK
NET "P22" LOC = PC9 |IOSTANDARD = LVCMOS33; //P_GCLK
NET "P21" LOC = PB10 |IOSTANDARD = LVCMOS33; //P_GCLK
NET "P20" LOC = PA10 |IOSTANDARD = LVCMOS33; //N_GCLK
NET "P19" LOC = PC11 |IOSTANDARD = LVCMOS33; //USER I/O
NET "P18" LOC = PA11 |IOSTANDARD = LVCMOS33; //USER I/O
NET "P17" LOC = PB12 |IOSTANDARD = LVCMOS33; //USER I/O
NET "P16" LOC = PA12 |IOSTANDARD = LVCMOS33; //VREF
NET "P15" LOC = PA13 |IOSTANDARD = LVCMOS33; //USER I/O
NET "P14" LOC = PE12 |IOSTANDARD = LVCMOS33; //VREF
NET "P13" LOC = PA14 |IOSTANDARD = LVCMOS33; //USER I/O
NET "P12" LOC = PB14 |IOSTANDARD = LVCMOS33; //USER I/O
NET "P11" LOC = PB16 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P10" LOC = PC16 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P9" LOC = PC15 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P8" LOC = PD16 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P7" LOC = PD14 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P6" LOC = PE16 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P5" LOC = PF12 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P4" LOC = PE15 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P3" LOC = PF14 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P2" LOC = PF16 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P1" LOC = PF13 |IOSTANDARD = LVCMOS33; //A0-A25
NET "P0" LOC = PF15 |IOSTANDARD = LVCMOS332; //A0-A25
NET "LLC" LOC = PJ6 |IOSTANDARD = LVCMOS33; //P_GCLK
NET "DE" LOC = PG16 |IOSTANDARD = LVCMOS33; //A0-A25
NET "HSYNCin" LOC = PG12 |IOSTANDARD = LVCMOS33; //A0-A25
NET "VSYNCin" LOC = PH15 |IOSTANDARD = LVCMOS33; //P_GCLK
# Bi-Directional Communication Interface #
NET "D0" LOC = PL13 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //VREF
NET "D1" LOC = PJ12 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //N_GCLK
NET "D2" LOC = PT9 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "D3" LOC = PL10 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "D4" LOC = PM11 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "D5" LOC = PP12 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //D0-D15
NET "D6" LOC = PN12 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //D0-D15
NET "D7" LOC = PJ13 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "CLK" LOC = PR12 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "R_W" LOC = PT14 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "PVB1RDY" LOC = PT12 |IOSTANDARD = LVCMOS33; //USER I/O
NET "PVB1BE" LOC = PT13 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "PVB1PROM1_2" LOC = PH15 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //A0-A25
NET "PVB1PROGRAM" LOC = PT15 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
# RGB Video Signals to PVB1#
NET "HSYNCout" LOC = PR14 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "VSYNCout" LOC = PP16 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "B4out" LOC = PR15 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "B3out" LOC = PR16 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "B2out" LOC = PP15 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //FCS/FWE
NET "B1out" LOC = PN16 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //A0-A25
NET "B0out" LOC = PN14 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //A0-A25
NET "G5out" LOC = PM12 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "G4out" LOC = PM16 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //FCS/FWE
NET "G3out" LOC = PM15 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //FCS/FWE
NET "G2out" LOC = PL14 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //FCS/FWE
NET "G1out" LOC = PL16 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //FCS/FWE
NET "G0out" LOC = PL12 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //USER I/O
NET "R4out" LOC = PK16 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //A0-A25
NET "R3out" LOC = PJ14 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //P_GCLK
NET "R2out" LOC = PJ16 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //N_GCLK
NET "R1out" LOC = PH16 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //A0-A25
NET "R0out" LOC = PG14 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //A0-A25
NET "PCLKout" LOC = PK14 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //N_GCLK
# Programmable Clock Input from DS1085L #
NET "ProCLKin" LOC = PK11 |IOSTANDARD = LVCMOS33; //N_GCLK
# Programmable Clock Output from FPGA #
NET "ProCLKout" LOC = PM7 |IOSTANDARD = LVCMOS33 |SLEW = SLOW |DRIVE = 12; //N_GCLK
EDIT: (11/10/2014) Redefined the goals, added board layout and .ucf constraints file.
EDIT: (11/12/2014) Added missing CLK signal to bidirectional interface in .ucf file