How to program Xilinx CPLDs using TIAO USB Multi-Protocol Adapter (TUMPA) on Windows or Linux

10 PCS, 10cm x 10cm, 2 layers prototype for $38.80 shipped!
Contents
Buy various JTAG cables for your Satellite Receiver, Cable Modem, Wireless Router, Standard Wiggler from http://www.easymg.com and http://www.diygadget.com
Overview
In this tutorial, I am going to show you how to program TIAO Xilinx XC2C64A CoolRunner-II CPLD Dev Board (Reset Glitch) using TIAO USB Multi-Protocol Adapter (TUMPA). This method applies to all devices supported by xc3sprog.
The process is fairly straightforward.
Required Hardware and Software
- TIAO USB Multi-Protocol Adapter (TUMPA)
- Patched xc3sprog, download from here
- Supported CPLD, we use TIAO Xilinx XC2C64A CoolRunner-II CPLD Dev Board (Reset Glitch) as our example.
- (Optional, only needed if you are programming CPLDs) Xilinx CPLD map files. It is part of Xilinx Labtools (labtools\labtools\xbr\data), or you can download from here
XC3SPROG Supported Devices
The following is a list of supported devices of xc3sprog as of Rev646:
# IDCODE IR_len ID_Cmd Text 03642093 6 0x9 XC7K30T 03647093 6 0x9 XC7K70T 0364c093 6 0x9 XC7K160T 03651093 6 0x9 XC7K325T 03656093 6 0x9 XC7K410T 03667093 6 0x9 XC7V285T 0366C093 6 0x9 XC7V450T 03671093 6 0x9 XC7V585T 03676093 6 0x9 XC7V855T 03687093 6 0x9 XC7VX4855T 04244093 10 0x3c9 XC6VLX75T(L) 0424a093 10 0x3c9 XC6VLX130T(L) 0424c093 10 0x3c9 XC6VLX195T(L) 04250093 10 0x3c9 XC6VLX240T(L) 04252093 10 0x3c9 XC6VLX365T(L) 04256093 10 0x3c9 XC6VLX550T(L) 0423a093 10 0x3c9 XC6VLX760(L) 04286093 10 0x3c9 XC6VSX315T(L) 04288093 10 0x3c9 XC6VSX475T(L) 042c4093 10 0x3c9 XC6VCX75T 042ca093 10 0x3c9 XC6VCX130T 042cc093 10 0x3c9 XC6VCX195T 042d0093 10 0x3c9 XC6VCX240T 04000093 6 0x9 XC6SLX4 04001093 6 0x9 XC6SLX9 04002093 6 0x9 XC6SLX16 04004093 6 0x9 XC6SLX25 04024093 6 0x9 XC6SLX25T 04008093 6 0x9 XC6SLX45 04028093 6 0x9 XC6SLX45T 0400e093 6 0x9 XC6SLX75 0402e093 6 0x9 XC6SLX75T 04011093 6 0x9 XC6SLX100 04031093 6 0x9 XC6SLX100T 0401d093 6 0x9 XC6SLX150 0403d093 6 0x9 XC6SLX150T 0286e093 10 0x3c9 XC5VLX30 02896093 10 0x3c9 XC5VLX50 028ae093 10 0x3c9 XC5VLX85 028d6093 10 0x3c9 XC5VLX110 028ec093 10 0x3c9 XC5VLX155 0290c093 10 0x3c9 XC5VLX220 0295c095 10 0x3c9 XC5VLX330 02a56093 10 0x3c9 XC5VLX20T 02a6e093 10 0x3c9 XC5VLX30T 02a96093 10 0x3c9 XC5VLX50T 02aae093 10 0x3c9 XC5VLX85T 02ad6093 10 0x3c9 XC5VLX110T 02aec093 10 0x3c9 XC5VLX155T 02b0c093 10 0x3c9 XC5VLX220T 02b5c093 10 0x3c9 XC5VLX330T 02e72093 10 0x3c9 XC5SX35T 02e9a093 10 0x3c9 XC5SX50T 02ece093 10 0x3c9 XC5SX95T 02f3e093 10 0x3c9 XC5SX260T 04502093 10 0x3c9 XC5VTX150T 0453e093 10 0x3c9 XC5VTX240T 03276093 10 0x3c9 XC5VFX30T 032c6093 10 0x3c9 XC5VFX70T 032d8093 14 0x3c9 XC5VFX100T 03300093 14 0x3c9 XC5VFX130T 03334093 14 0x3c9 XC5VFX200T 0140d093 6 0x9 XC3S50 01414093 6 0x9 XC3S200 0141c093 6 0x9 XC3S400 01428093 6 0x9 XC3S1000 01434093 6 0x9 XC3S1500 01440093 6 0x9 XC3S2000 01448093 6 0x9 XC3S4000 01450093 6 0x9 XC3S5000 01C10093 6 0x9 XC3S100E 01C1A093 6 0x9 XC3S250E 01C22093 6 0x9 XC3S500E 01C2E093 6 0x9 XC3S1200E 01C3A093 6 0x9 XC3S1600E 02210093 6 0x9 XC3S50A 02218093 6 0x9 XC3S200A 02220093 6 0x9 XC3S400A 02228093 6 0x9 XC3S700A 02230093 6 0x9 XC3S1400A 02610093 6 0x9 XC3S50AN 02618093 6 0x9 XC3S200AN 02620093 6 0x9 XC3S400AN 02628093 6 0x9 XC3S700AN 02630093 6 0x9 XC3S1400AN 03840093 6 0x9 XC3SD1800 0384E093 6 0x9 XC3SD3400 01008093 6 0x9 XC2V40 01010093 6 0x9 XC2V80 01018093 6 0x9 XC2V250 01020093 6 0x9 XC2V500 01028093 6 0x9 XC2V1000 01030093 6 0x9 XC2V1500 01038093 6 0x9 XC2V2000 01040093 6 0x9 XC2V3000 01050093 6 0x9 XC2V4000 01060093 6 0x9 XC2V6000 01070093 6 0x9 XC2V8000 05044093 8 0xfe XCF01S 05045093 8 0xfe XCF02S 05046093 8 0xfe XCF04S 05057093 16 0xfe XCF08P 05058093 16 0xfe XCF16P 05059093 16 0xfe XCF32P 00608093 5 0x9 XC2S15 0060c093 5 0x9 XC2S30 00610093 5 0x9 XC2S50 00614093 5 0x9 XC2S100 00618093 5 0x9 XC2S150 0061c093 5 0x9 XC2S200 #XC95XL 09602093 8 0xfe XC9536XL 09604093 8 0xfe XC9572XL 09608093 8 0xfe XC95144XL 09616093 8 0xfe XC95288XL #XC95XV 09702093 8 0xfe XC9536XV 09704093 8 0xfe XC9572XV 09708093 8 0xfe XC95144XV 09716093 8 0xfe XC95288XV #XC2C 06c1c093 8 0x1 XC2C32_VQ44 06c1d093 8 0x1 XC2C32_PC44/64 06c1b093 8 0x1 XC2C32A_QF32 06d1d093 8 0x1 XC2C32A_PC44 06e1b093 8 0x1 XC2C32A_CP56 06e1c093 8 0x1 XC2C32A_VQ44 06e1d093 8 0x1 XC2C32A_PC44/64 06c5a093 8 0x1 XC2C64-PC44 06c5b093 8 0x1 XC2C64-CP132 06c5c093 8 0x1 XC2C64-VQ100 06c5d093 8 0x1 XC2C64-CP56 06c5e093 8 0x1 XC2C64-VQ44 06e59093 8 0x1 XC2C64A-QF48 06e5a093 8 0x1 XC2C64A-PC44 06e5b093 8 0x1 XC2C64A-CP132 06e5c093 8 0x1 XC2C64A-VQ100 06e5d093 8 0x1 XC2C64A-CP56 06e5e093 8 0x1 XC2C64A-VQ44 06d8a093 8 0x1 XC2C128_VQ100 06d8b093 8 0x1 XC2C128_CP132 06d8c093 8 0x1 XC2C128_TQ144 06d8e093 8 0x1 XC2C128_FT256 06d4a093 8 0x1 XC2C256_VQ100 06d4b093 8 0x1 XC2C256_CP132 06d4c093 8 0x1 XC2C256_TQ144 06d4d093 8 0x1 XC2C256_PQ208 06d4e093 8 0x1 XC2C256_FT256 06d5a093 8 0x1 XC2C384_FG324 06d5b093 8 0x1 XC2C384_CP204 06d5c093 8 0x1 XC2C384_TQ144 06d5d093 8 0x1 XC2C384_PQ208 06d5e093 8 0x1 XC2C384_FT256 06d7a093 8 0x1 XC2C512_FG324 06d7c093 8 0x1 XC2C512_PQ208 06d7e093 8 0x1 XC2C512_FT256 #unsupported #Virtex2 01020093 6 5 XC2V500 #XC95 09502093 8 0xfd XC9536 09504093 8 0xfd XC9572 09506093 8 0xfd XC95108 09508093 8 0xfd XC95144 09512093 8 0xfd XC95216 09516093 8 0xfd XC95288 #XC18 05024093 8 0xfd XC18V01 05025093 8 0xfd XC18V02 05026093 8 0xfd XC18V04 05023093 8 0xfd XC18V512 ##Atmel #list should not care for the version part 0978203f 4 0x1 AT90USB 0958103f 4 0x1 AT90CAN32 0968103f 4 0x1 AT90CAN64 0978103f 4 0x1 AT90CAN128 0970403f 4 0x1 ATmega1281 0970303f 4 0x1 ATmega1280 0970203f 4 0x1 ATmega128 0960803f 4 0x1 ATMEGA640 0960603f 4 0x1 ATMEGA6450 0960503f 4 0x1 ATMEGA645 0960403f 4 0x1 ATMEGA6490 0960303f 4 0x1 ATMEGA649 0960a03f 4 0x1 ATMEGA644p 0960903f 4 0x1 ATMEGA644 0960603f 4 0x1 ATMEGA650 0960203f 4 0x1 ATmega64 0950103f 4 0x1 ATmega323 0950203f 4 0x1 ATmega32 0940a03f 4 0x1 ATmega164p 0940703f 4 0x1 ATmega165(p) 0940403f 4 0x1 ATmega162 0940503f 4 0x1 ATmega169(p) 0940303f 4 0x1 ATmega16 0940403f 4 0x1 ATmega162 0940503f 4 0x1 ATmega169 0964203f 4 0x3 ATxmega64A3 0964403f 4 0x3 ATxmega96A3 0964e03f 4 0x3 ATxmega64A1 0964c03f 4 0x3 ATxmega64A3R 0964d03f 4 0x3 ATxmega96A3R 0965003f 4 0x3 ATxmega96A1 0974a03f 4 0x3 ATxmega128AR 0974c03f 4 0x3 ATxmega128A 0984203f 4 0x3 ATxmega256A3 0984303f 4 0x3 ATxmega256A3B 05b1703f 3 0 AT91SAM7X256 #AVR32 01e8203f 5 0x1 AT32AP7000 #STM 06410041 5 0x1 STM32L1_Med_density 06411041 5 0x1 STM32F2 06412041 5 0x1 STM32F1_Low_density 06414041 5 0x1 STM32F1_High_density 06418041 5 0x1 STM32F1_Connectivity_line 06420041 5 0x1 STM32F1_Low_Med_density_value 06428041 5 0x1 STM32F1_High_density_value 06430041 5 0x1 STM32F1_XL_density 06413041 5 0x1 STM32F4 #ARM Debug 3BA00477 4 0xe ARM_Cortex-M3_r1p1-01rel0 4BA00477 4 0xe ARM-Cortex-M4F_r0p1 #Manufacturer list 00000093 99 0 Xilinx_Unknown 0000003f 99 0 Atmel_Unknown
Software Installation
- Since I am going to program CPLD, download CPLD's map file from here. Unzip to a directory, e.g. d:\dev\.
- Install drivers for TUMPA. Instruction for Windows XP: How to install TIAO USB Multi Protocol Adapter Driver on Windows XP, Vista and Windows 7: How to install TIAO USB Multi Protocol Adapter Driver on Windows Vista or Windows 7. For Linux, you can get the driver here: FTDIDXX Drivers
- Download TIAO patched xc3sprog from here, unzip it to a directory. In my example, I unzipped to d:\dev\ directory. After you unzip it, a directory TIAO-xc3sprog will be created. The Windows applications are under win32, Linux applications are in linux32.
Hardware preparation
In our example, we use XC2C64A (RGH Hack Dev Board), it takes +3.3V power. TUMPA provides both +5V and +3.3V, thus a separate power supply to power up CPLD is not needed.
Connect TUMPA's TDI, TDO, TCK, TMS, +3.3V and GND pins to our XC2C64A dev board's TDI, TDO, TCK, TMS, +3.3V and GND respectively using the supplied female to female flexible cable.
The pinout of the JTAG connector (Complete pinout is here: TIAO USB Multi Protocol Adapter User's Manual#20 PIN JTAG Connector):
Pin # | Description |
---|---|
5 | TDI |
7 | TMS |
9 | TCK |
13 | TDO |
4, 6, 8, 10, 12, 14, 16, 18, 20 | GND |
The +3.3V and GND pin can be obtained from TTL Level Serial Connector.
Pinout of TTL Level Serial Connector (Complete pinout: TIAO USB Multi Protocol Adapter User's Manual#TTL Level Serial Connector):
Pin # | Description |
---|---|
9 | +3.3V |
11, 12 | GND |
The pinout of our XC2C64A Dev Board (JTAG pins and V3.3, GND are on P1):
Pin # | Description |
---|---|
P1.1 | TDI |
P1.2 | TMS |
P1.4 | TCK |
P1.3 | TDO |
P1.11 | GND |
P1.12 | +3.3V |
Now connect TDI, TDO, TCK, TMS, GND and +3.3V together:
Program CPLD
Copy the trinity.jed (or your jed file) to TIAO-xc3sprog\win32 or linux32 directory. In my case, I copied it to TIAO-xc3sprog\win32 directory as I am testing on Windows 7 64bit.
Connect TUMPA to PC using a USB cable:
Now, open a dos prompt windows, change directory to where you have unzipped TIAO-xc3sprog\win32, run the following command to detect JTAG chain:
xc3sprog -c tumpa -L
The -c tumpa option is to specify using TUMPA JTAG adapter. The -L option is to tell xc3sprog to use FTDI's D2xx driver instead of LibUSB and LIBFTDI. This is recommended.
Your CPLD should be detected:
Now, run the following command to program the CPLD:
xc3sprog -c tumpa -L -m D:\dev\cpld.data trinity.jed
The option -m D:\dev\cpld.data specifies the CPLD map file directory. If you have map files in a different, specify it by -m <CPLD map file location>. -v is for verbose output. The last parameter is the jed file you wish to write to CPLD. In my case, it is trinity.jed. xc3sprog will program the jed to CPLD and verify it.
Now, you have successfully programmed our RGH dev board.
There are other commands available from xc3sprog, such as erase, read. Run xc3sprog without any parameter to print out the usage:
XC3SPROG (c) 2004-2011 xc3sprog project $Rev: 646 $ OS: Windows Free software: If you contribute nothing, expect nothing! Feedback on success/failure/enhancement requests: http://sourceforge.net/mail/?group_id=170565 Check Sourceforge for updates: http://sourceforge.net/projects/xc3sprog/develop usage: xc3sprog -c cable [options] <file0spec> <file1spec> ... filespec is filename:action:offset:style:length action on of 'w|W|v|r|R' w: erase whole area, write and verify W: Write with auto-sector erase and verify v: Verify device against filename r: Read from device,write to file, don't overwrite existing file R: Read from device and write to file, overwrite existing file Default action is 'w' Default offset is 0 style: One of BIT|BIN|MCS|IHEX|HEX BIT: Xilinc .bit format BIN: Binary format MCS: XILINX Prom format IHEX: INTEL Hex format (= MCS with bits reversed) HEX: Hex dump format Default for FPGA|SPI|XCF is BIT Default for CPLD is JED Default for XMEGA is IHEX Default length is whole device Possible options: -p val[,val...] Use device at JTAG Chain position <val>. Default (0) is device connected to JTAG Adapter TDO. -e Erase whole device. -h Print this help. -I[file] Work on connected SPI Flash (ISF Mode), after loading 'bscan_spi' bitfile if given. -j Detect JTAG chain, nothing else (default action). -l Program lockbits if defined in fusefile. -m <dir> Directory with XC2C mapfiles. -R Try to reconfigure device(No other action!). -T val Test chain 'val' times (0 = forever) or 10000 times default. -J val Run at max with given JTAG Frequency, 0(default) means max. Rate of device Only used for FTDI cables for now -D Dump internal devlist and cablelist to files In ISF Mode, test the SPI connection. -v Verbose output. Programmer specific options: -d (pp only ) Parallel port device. -s num (usb devices only) Serial number string. -L (ftdi only ) Don't use LibUSB. Device specific options: -E file (AVR only) EEPROM file. -F file (AVR only) File with fuse bits.
Buy various JTAG cables for your Satellite Receiver, Cable Modem, Wireless Router, Standard Wiggler from http://www.easymg.com and http://www.diygadget.com

10 PCS, 10cm x 10cm, 2 layers prototype for $38.80 shipped!