Hey, I can build that!
A while ago I picked up a Xilinx XC95108 CPLD in a PC84 package for about $10 from a surplus electronics shop. When I built a CPLD project board with a PC44 socket I realized that I never wanted to deal with a socket like that on a home-etched board again, so in the back of my mind I had been looking for an excuse to surface mount the big chip. When I got the urge one weekend to build a PCI card I realized that there would never be another project that offered such easy routing of surface mount pads to card edge fingers. I was so excited about the notion of getting to route the board and solder the chip down that I didn't really care if it worked — and at the time I thought that was highly unlikely.
The core I ended up with supports the following PCI features:
- Configuration space accessible by CFGREAD and CFGWRITE
- One memory space accessible by MEMREAD and MEMWRITE
- Burst reads and writes
- Fast back-to-back transactions
- Fast DEVSEL# timing
First I started work on my PCI core using the Xilinx WebPACK. The nice thing about software is you don't have to get out of your chair or handle caustic chemicals! The resulting simulations made me think it just might work if the timings were okay.
The verilog source wasn't originally this polished, but the card passed the smoke test in an old Pentium PC and got moved to my decommisioned server — the ABIT BP6 it is pictured in above. The wires are connections to a JTAG programmer.
If you're curious here are the implementation reports from the WebPACK showing the utilization of the chip and some dodgy timing information. Inside there are also some thoughts about a future board.
Once I got bored with operating on the configuration space, and rewrote my core from scratch (to the version above) I decided I needed a FreeBSD kernel driver to play with the memory space.
Here are a bunch of resources that are worth exploring.