Motivation #1Posted on 2007/10/05 - 17:15
So, yeah, design and build an open graphics card. It was nice to see some people chime in on my last post, that doesn't seem to happen to often here. I want to start documenting some things here about this project so that people get a better idea of what and why I'm doing certain things with this card. I've got a document here in dutch filled with little notes to myself and links / page numbers to documents. See this post as a distilled version of the 'why' (and why not something else) I made certain design choises, I'll talk some other day about the 'how'.
But first I've got a little other issue I'd like to discuss. I have no idea how to call this project. I managed to cut through most of the red tape and got it approved as my university project for this semester, where it's now known as 'Project VGA'. On my harddrive it's in the folder 'ASNE' which means 'Advanced System and Network Engineering', which is the name of the general course I'm following this semester. Somebody already suggested "Wacco's Open VGA", and although that sounds catchy, it's a bit straightforward and 'WOV' doesn't sound 'cool'. If you get what I mean. So what I'm really asking is; if you have a cool idea for a name, and it's not in use or associated with anything else that might get me in trouble somehow, let me know! I'm probably going to route the circuit board next week and want to put some art on it with a catchy name. I'll do the art (got a good idea for that already) but I need a name ASAP.
Now that that's out of the way, back to the card. What I want to do is discuss some chips I'm going to put on the card and why I've chosen these. A big requirement for all these chips is that I can get my hands on them easily. This comes twofold, first I want everybody else to be able to copy me, and second I need to be able to buy them as well. I can't buy a reel of 2500 chips, I'm a student! Second, you should be able to get them from a general 'big' electronics shop. I'll be using digikey, so if they don't have it, I won't use it. Third, all components should be (albeit with some difficulty) capable of handsoldering. That's just to eliminate chips with Ball Grid Arrays on them, since if you don't have a compatible oven (I do have one at my university by the way) you can't use them. No-no on BGA and the like for home-soldering. Lastly, they need to be cheap. But I'm not going on a bargain hunt if I might save a few cents, I don't have the time on that (or else I'll end up spending 3 years in development).
Main FPGA: Xilinx Spartan 3 S400 (208 PQFP)
Right, the first and biggest chip! This is basically the biggest FPGA I could get which was still in a flat package and isn't to overly expensive. Altera wasn't an option, since I couldn't get them easily, xilinx virtex wasn't an option either because they have things like complete POWER cores onboard. Not that it isn't usable, it's just not quite in the spirit of open source. If I'm going to include complete proprietary subsystems on the FPGA and build my open source implementation on that, we're still stuck with these closed (you might be able to get your hands on it, but not everyone can read and alter it) source components. So this was an easy choice.
Secondary CPLD: Xilinx XC95144XL-7 (144 TQFP)
The main problem with the FPGA is that it needs to be programmed before use. It can do this automatically, but it'll probably take too long to respond to initial PCI commands. A CPLD doesn't have this problem, so a small one is included between the FPGA and the PCI bus. Also, I've never played with these so it might be fun to simply use it even if the FPGA is fast enough, and somebody already did this. After some emails (thanks Ben!) I also found out that he reprogrammed the CPLD when the system was on (which had some side-effects but nothing a reboot wouldn't solve) so no seperate power supply is needed, just tap straight from the PCI bus. That somewhat motivated me to clone part of his design since this probably will work, and an FPGA-only solution might not. Oh, and did I mention that the Open Graphics guys also have a similar setup?
Memory: 128Mbit SDRAM Micron MT48LC4M32B2P-6 (86 TSOP)
For memory I could use DDR material, but that would require a lot of pins on the FPGA side and other trickery I'm not familiar with, and I was going to keep stuff simple! Even more simple than SDRAM would be SRAM since that won't need a refresh cycle every once in a while, but that stuff is screaming expensive in larger quantities. So it's going to be a simple SDRAM module. The FPGA has enough IO available so a 32bit bus wouldn't be a problem, and this means we still get reasonably good performance on the maximum clock of 166MHz. I picked 128MBit since it's big, but not expensive-big. It'll be plenty for now.
DAC: Fairchild FMS3818 (48 LQFP)
Nothing special here, if you want to build a VGA card, you'll need a DAC. There where some high speed 10bit chips which looked interesting, but I didn't want to tie the lowest (or highest) 2 bits to ground (or vcc) since that would influence our range of colors directly. This chip only does translation to plain analog, so nothing fancy like DVI connectors or HDCP support anywhere. We don't want to worry about that just yet.
JTAG / USB: FTDI FT2232D (48 LQFP)
Now, this is an interesting addition. Since I learned that I can reprogram the card in-system (roughly) I figured people want to play around with a card like this. So, if you buy an expensive 200 bucks development board, you at least expect a JTAG programmer to come with it. But wait, why not simply put that onboard? Then all you need is an USB cable and you can reprogram the thing. It might be wise to reprogram the card from another machine, but at least you won't need an expensive programmer anymore. And I've seen commercially available JTAG cables using the FTDI chip for this since it has some nice bit-bang functionality. It also has a second channel, I'm still looking at whether or not I'm going to tie that to the FPGA. Might be handy for debugging.
PROM: XCF04S (20 TSSOP)
Some other details follow, I'll include a serial PROM for the FPGA which is 'too big' for the s400. This gives about 2Mbit of extra room. The space will be used for the PCI expansion ROM and things like font maps. There might be a race condition between how quickly the PCI BIOS asks for this expansion ROM and how quickly the FPGA will load everything into RAM, but that shouldn't be too much of a problem since we can ask to retry the request later. After mapping out the IO of the FPGA I'm considering to use a parallel PROM just for this reason since it might just fit, but it'll be tight and the advantage won't be that much bigger.
Clocks: 25.175MHz and 50MHz oscillators
For VGA we need to support a 25.175MHz and 28.322MHz output clock. The latter can be created with a Digital Clock Manager from the FPGA since it's 9/8th of the former. I checked some other video cards I got laying around and they all seem to use a 14.318MHz crystal. A bunch of chips are available to create any clock from that crystal, but that would be more expensive than just using a 25.175 directly and do everything in the FPGA. The 50MHz clock will be used internally by a DCM to generate a times 10, divided by 3 clock of 166MHz. We need that for the RAM and is a decent speed for everything else probably.
Power: 1.2V 1A MCP1726 and 2.5V 1.5A LM1086
The FPGA has some 'exotic' power rails. The FTDI chip needs 5V and everything else needs 3.3V. The PCI bus already delivers the 5V and 3.3V so I'll be using those directly. From the 3.3V I'll derive a 1.2V rail and a 2.5V rail. It's kind of hard to find out how much power the FPGA really needs, but from a reference design (the Spartan 3 starters kit) I deducted that 1A and 1.5A respectively would be enough. The LM1086 used in that design is easily available, however the FAN1112 wasn't, so I replaced that with a MCP1726.
And that's about it! Naturally there will be a bunch of resistors, a load of capacitors, some test leds and ferrite beads present but I haven't picked those out yet. That'll come when I'll be drawing up the final schematics during the rest of this and next week. Hopefully you all like the design so far, if you've got any tips, improvements or questions, let me know! This is by far the biggest circuit I've ever designed so I can only hope I'm not making silly mistakes anywhere. Thanks for reading, talk to ya later!
[: wacco :]