The world’s worst video card?

July 31, 2019 posted by

For many years the most common way computers displayed information on a monitor who has through this ubiquitous VGA interface But how does it work what electrical signals does a computer need to send into this thing in order to get a picture to show? Up. Now this connector has 15 pins, but aside from some grounds here actually a bunch of these pins are ground There’s only five signals that we really care about. There’s red green blue horizontal sync and vertical sync some of these other pins are sometimes used in different ways for the computer and monitor to communicate about what Resolutions the monitor supports things like that, but those are all optional. It’s been just ignore everything but those five pins anyway This works is pretty closely tied to the way old-school CRT monitors worked and those old monitors you had an electron gun pointed at the screen with Electromagnets around here that could deflect the electrons to different parts of the screen Then to paint an image the electron beam just scans across the screen from left to right and top to bottom or so That’s not actually how it works in a modern flat panel monitor but the timing of that electron beam physically sweeping across a screen is still what defines the timing of when we need to send each pixel and we don’t just need to Worry about the order of the pixels and the time from one pixel the next there are also these margins on the top and bottom left and right For the electron beam to to sort of have a chance to stabilize or you can think of it coming up to speed Before it paints the next scan line Then it blanks and has a little extra room on the right here before the beam swings back to the left Which also takes time for the beam to swing back to the left? To start the next scanline and then same thing at the bottom of the image There’s some blank scan lines down here before the beam gets sent back up to the top left for the next frame And so there’s this physical process that the timing is based on So even though a more modern monitor doesn’t use the same physical process We’ve got to follow the same timing in order to get an image to show up And so this diagram shows the detail of what that timing looks like The visible part of each scanline takes some amount of time and that’s followed by what’s called the front porch Which is just a blank time on the right side of the image Then you get the sync pulse which is a separate signal line this horizontal sync signal That tells the electron beam to swing back to the left side of the image And then the back porch is the blank time on the left side of the image before the next scanline starts And then it’s the same at the end of the entire frame. So you get to the end of the frame. There’s a front porch Which is the time to account for blank scanlines down at the bottom of the image and then a vertical sync pulse Which is the signal and on also the time that it takes for the electron beam to get sent back up to the top left Of the display and then there’s a back porch which accounts for blank scan lines that are at the top of the next frame But what matters here is that for any particular display resolution the monitor supports we’ve got to get these timings right So the horizontal sync and vertical sync signals are the are pins 13 and 14 on our connector here We’ve got to get the timings of those signals right in order for the image to show up properly And in fact with older CRT monitors if you didn’t get the timing right you could actually damage the monitor because you could get the electron gun pointing somewhere where it shouldn’t be pointing and I don’t think it’s Possible to damage newer flat panel monitors, but if you do end up damaging your monitor I don’t wanna hear about don’t blame me. Actually, I do want to hear about it, but don’t blame me Okay, so getting the timing right is important, but what are the exact timing requirements? Well, if we look out VGA signal timing you can see in this first link there’s a whole bunch of different resolutions and different modes and A good video card would support a bunch of these resolutions and maybe even communicate with the monitor over some of those data pins I said to ignore to pick the best mode, but my goal is not to make a good video card My goal is just to get something working So, you know, I’m looking for one of these modes You know any mode that I think’s gonna be easiest to build hardware for and you know, there’s a bunch of trade-offs So depending how you think about it. You might come up with a different choice and that’s fine But you know I figure I want to avoid the larger resolutions here because it’s just a lot more image data to worry about and you know Then I’m just looking at the different pixel clock frequencies here Since I’m going to need to build a clock that runs at one of these frequencies And these are all in the tens of megahertz So that probably means using a crystal oscillator of some sort and I’ve got a bunch of crystals with different frequencies and of course None of them are any of the frequencies we want And I also have some of these integrated crystal oscillators can things that you can just hook 5 volts up to and it spits Out a nice clock, in this case, this one’s 10 megahertz But unfortunately, nothing I have matches any of these clock frequencies. However, I can actually use a slower pixel clock As long as I compensate by sending fewer pixels So for example, I could use that 10 megahertz oscillator here instead of the 40 megahertz pixel clock But of course, you know timing is still critical, you know I can’t change the overall timing But the times that matter here are these times here and there based on the pixel frequency But they’re also based on the number of pixels Right, what really matters is how long does it take to draw each scanline. How much time do we spend in the display How long is this front porch, how long is this sync pulse in terms of time and so forth So that’s what matters and that’s what these times are here So this 20 microseconds of how long it takes to draw the visible area of one scanline is based on having 800 pixels Divided by 40 million pixels per second, and that’s 20 microseconds But if instead of a 40 megahertz clock we’re using a 10 megahertz clock Well, 200 pixels divided by 10 million pixels per second is still 20 microseconds And so the timing will still work out and then same thing with the front porch the sync pulse in the back porch right is If our front porch we get to 200 pixels here and we keep going another 10 pixels Well 10 pixels divided by 10 million pixels per second is 1 microsecond And so that that front porch will take the right amount of time And then same thing with the sync pulse if we just keep counting another 32 pixel times 32 pixel times divided by 10 million per second is 3.2 microseconds. And so our sync pulse will be exactly the right length And so as long as we divide all these pixel numbers by 4 and conveniently, they’re all divisible by 4 We use these numbers. Our overall scanline is still going to take 26.4 microseconds even with this 10 megahertz clock So that’s what I’m going to do. So I guess to start out What I’m going to do is build a circuit that’s going to count pixels because we need to know where we are We need to know, you know, are we at pixel 0 or we at pixel 50? When do we get to pixel 200? When when are we in this range here where the sync pulse needs to be below? So to do that I’m going to build a counter that will just count pixels and then when it gets to 264 We’ll reset it and that will count the pixels horizontally And then we’ll end up building another one to count where we are in terms of which line we’re on And so to count the pixels, I’m going to use the 74LS161 And because we’ve got to be able to count all the way up to 264 That’s going to take nine bits and the 74LS161 is a 4-bit counter So in order to get at least nine bits, I’m going to need three of them I’ll start by connecting the power and ground pins for each one So I’ll just kind of go through each of the pins and hook them up So the clear pin is what’s going to reset all of our counters to zero So we want to be able to clear all of them at the same time once we get to 264 So I’m just gonna tie the clear pins together for now and then the clock pin is kind of the same way that they’re all gonna use the same clock So I’m just gonna tie the clock pins together for now And eventually I want to connect that clock pin to our 10 megahertz oscillator But I’m gonna leave it out for now Just because in order to test it I wanna be able to run it at a slower speed to start with so next we have our data inputs And we’re not gonna use that because we’re never gonna load a value into this. We just want this to count So I’m just gonna leave all those disconnected, but the enable pins, we do want to be connected So I’m gonna connect them all high so that the chips are always enabled Then again because we’re not using these inputs for anything the load pin over here. We we don’t want to use that either That’s an active low. So I’m going to tie them all high and then this other enable pin and this enable T I’m going to enable the first one But the other two I’m not going to always have enabled because this is actually how the ripple-carry works So we’re going to count the first four bits on the left here and then we want it to roll over and count the next Four bits here and then roll over and so forth And so the way that works is we connect the ripple-carry output of the first chip to the enable of the second chip and then the ripple-carry out but if the second chip will connect To the enable of the third chip and that way we’ve cascaded these together So that we will be able to count actually 12 bits because there’s you know four there four bits each But we really only care about the first nine bits And so that should be all we need in order to get a counter going So what I’ll do is connect the outputs up to some LEDs so we can see if it works. So there we go I’ve got the first 10 bits, even though we only really care about the first 9 bits got the first 10 But it’s hooked up to those LEDs if we power this up. Well, nothing happens because we don’t have our clock yet And we just hook our 10 megahertz clock up. We’re not going to see anything This is just gonna be counting so fast that just looks like all the LEDs are on Now for a slower clock I could use a 555 circuit like I’ve shown in a previous video But actually what I’m going to do is use this fancy signal generator since it’ll give me a lot more control over the exact frequency And so we want to set this up for a square wave and then the high level will be 5 volts and Then we need to set the low level and that’ll be 0 volts so that way we’ll get a square wave that goes from 0 volts to 5 volts and then the frequency here is 1 kilohertz and you know, that seems fine We’ll start there and so I’ll hook the output of the signal generator up to our clock input here That’ll go right into our clock for all 3 chips and so now if I turn on the signal generator And there we go, it looks like it’s counting but it’s counting pretty fast now we can slow it down let’s try 100 Hertz and That’s not working as well, but you know what Our clear is not actually they’re hooked together, but they’re not actually hooked to ground or 5 volts So I think ground ground clears it but if we look at the 5 volts, there we go So it was just sort of clearing itself because that was floating But now you can see it’s counting in binary Which is what we want and we can slow it down even more if we want to But really what we want to be able to do is we want to be able to know when we get to these different time points here So we want to start counting at 0 But then we want to know when we get to 200 if we want to know when we get to 210 When we get to 242 and when we get to 264 And then actually 264 we want to reset it back to zero. Well, how can we tell that? Well to figure out when the counter gets to 200, you know, we’re counting in binary So this is going to be the the binary equivalent here for 200 So all of the bits are zeros except for these 3, right? We’ve got the 128 place the 64s place in the eights place and net that makes 200 So we have these signals That look like this those 3 ones that are set and we want to be able to detect when we get here what we can do is we can actually Invert all the bits that are supposed to be zeros and not invert the bits that are ones and then over here on the right All of these are going to be ones when we get to 200 Then what we can do is we can just feed all of that into a NAND gate and the output of that NAND gate will go low only when all of the inputs are high and all those inputs are going to be high or all of those inputs could Be ones only when our counter over here is actually at 200 and you may noticed. I only hooked up eight of the bits There’s this ninth bit who’s kind of hanging out up here Well, that’s because we can use the 74LS30 which is an 8 input NAND gate But it’s it’s only 8 inputs. And as far as I know they don’t make a 9 input NAND gate that’s actually ok because looking at these 8 bits is actually enough to know that we’ve gotten to 200 because this 9th bit up here is the 256s place So if that actually were a 1 and the rest of these bits were Set the way they are. Then the overall value would be you know, 200 plus the 256 place would be 456 Remember when we get to 264 we’re gonna reset our counter back to zero So, you know, our counter is never going to get up to 456 So we don’t have to worry about this being a 1 if the rest of these are set the way that they are then We know this is going to be a 0 since we’re never going to go over to 64 So it’s fine to just ignore that one So this will detect when we get to 200 and we can do a similar thing to detect when we get to 210 We just have to look at different bits Right, so to match the value to 10 that we’re looking for and then same for 242 as well. Same basic idea, right? we just have the bits that we’re looking for and we just put the inverters where we need them in order to detect that with The NAND gate and then finally, this is what it looks like for 264 but now in this case we do need to look at that first bit to make sure it’s actually a 1 because if this were A 0 you know the rest of these bits this is the only other bit set and that’s the eights place So if this were a 0 up here the overall counter value would be an 8 which you know We’re gonna get to 8 long before we get to 264 and so we would detect this this early so that’s no good We’ve got to make sure that first bit is a 1 but in this case it’s actually okay to ignore the last bit here at this last zero because if this value here is 264 and we change that to a 1 then it’s going to be 265 but of course when we get to 264 we reset back to zero, so it’s never going to get to 265 So whenever these first eight bits are set like this We know the last one can’t be a 1 so we don’t have to check if it’s a 0 So in all of these cases, we got lucky that we can kind of cheat and only look at eight of the bits Now obviously we’ve got a lot of inverters here, but a lot of them are duplicates We really just need one per bit like this so we’ve got the nine bits coming in and Then we invert all of them and something we’ve got the inverted and non inverted version of each bit And then when we decode each of the numbers were interested and we can just kind of pick off the inverted or non inverted copy Of each bit that we need and depending on whatever number we’re trying to to decode So this is what we need to build and I’m going to start off with nine inverters So to invert each of the signals. I’m going to use the 74LS04 which has six inverters We need nine of them So I’m gonna have two of these chips and so now we just hook up each output to the input of an inverter Okay, and so now we have all of our outputs for a counter all nine bits any way that we care about hooked up to inverters Which means now we’ve got inverted and non-inverted copies of all of our counter signals over here that we can use to detect those four values we’re looking for So next we need to add those NAND gates. So I’ll add another breadboard here where we can do that And then here’s the first 74LS30, which is an 8 input NAND gate That’ll let us decode one of those values And the first one I’ll do is 264 because that’s the one that also resets us back to zero So that’ll be a good one to have So let’s try to detect the number 264. So starting on the right here. The first bit is a zero We’re actually don’t care about that because remember we’re gonna look at just the top eight bits. So we’re just ignore the first bit So the next bits gonna be a zero So we’ll hook up one of the inputs here to the inverted output If not the first one but the second one so that’s our second bit is 0 and the third bit from the right is also zero so hook that one up to our Inverted output of our third bit here and the next bit is gonna be a 1 so I’m gonna hock that not to the output But to the input of this inverter here So that’s just going to be the same as the output of our counter and I’ll hook that up to another input And what I’ll do is the inverted Lines, I’ll use blue. And then for the non inverted ones, I’ll use green So it’s sort of easier to tell what’s what that’s a 1 and so then we’ve got 4 more zeros So hook that to the inverter output of the next bit Then another 0 will go to the inverted output of the next bit and then another 0 going to the inverted output of the next bit and then one more 0 followed by that 9th bit is gonna be a 1 so I can just hook that directly to the input of this last inverter because that’s connected directly over to this 9th bit of our counter Alright, so we’ve got all the inputs of our and gate hooked up there I suppose I should also connect power and ground for a new chip over here. And then the output is pin 8 here Let me just hook on led to that. See what’s going on and if I connect power that’s on and of course that’s on because this is a NAND gate so the outputs inverted. So that’s going to be on unless we’ve got exactly The value 264 in our counter So if we reset our counter here by tying our reset here to low and then back to high we should have a zero in Our counter so not to 64. But if we send 264 pulses that led should go out and It’s sending it and hey, it went out. So there we go. We’ve detected our 264 pulses and if we send one more pulse, so let’s see one more pulse And we need to trigger it. So there we go trigger and it’s still off Oh because now we’ve sent 265 and remember we’re ignoring that last bit So we actually need to send one more pulse and there we go So now we’re 266 and the LED has come back on again Alright so we’re able to detect that 264 Now we just need to do the same thing for these other three numbers 242 210 and 200 as long as I add another NAND gate and let’s hook up for 242. So remember for this one. We were just looking at the top eight bits here We’re just gonna look at the bottom eight bits, and that should be enough to be able to detect 242 Ok, that first bit is a 0 so that’s going to be the inverted output of our first bit down here It’s going to go to one of our inputs up here then our next bits going to be a 1 so we actually want to Go from the non inverted as the input of our converter for the next bit and bring that up there Ok, so 0 1 the next is going to be a 0 and that’s the third bit So that’s this third inverter down here, which we’ve already got coming up to here Really? What we need to do is just bring that same inverted bit down and use that as an input Ok, so we have 0 1 0 0 1 0 the next is gonna be a 0 so that’s our fourth bit It’s gonna be a 0 so that fourth bit comes over here and then an output is there a 0 so you got 0 1 0 0 and then 1 1 1 1 so the next 4 inputs are all going to be Ones so this is going to go to input there and then the next one’s going to go to the next input There and then the next two, we’re gonna go to the next two inputs over here Okay, so we got 0 1 0 0 1 1 1 1 so 0 1 0 0 1 1 1 1 I hope I hooked that up right, of course we need to add power and ground. Now. This should be able to detect 242 So we’re not at 242 now. That’s a good sign Alright, so we’ve got the first two we’ve got the 264 and 242 So now we just need to do the same thing for 210 and 200 And so this is basically the same exercise. We’re gonna add another 8 input NAND gate and hook up all of the appropriate inputs So that it detects the the you know the number to 10 and then again We’ll do the same thing With another NAND gate and hook up all the inputs for that so that we’re able to detect the number 200 Ok, so now we should be able to detect all 4 of these numbers So let’s test it out if I reset. We aren’t on any of these numbers We’re hopefully at 0 cuz I just reset it and now I’ll send 200 pulses Yeah, and there we go we got our 200 And now we’ll send another 10 to get to 210 And now we’re at 210 So I’ll send another 32 to get to 240 – that’s 240 – and I’ll send another 22 to get to 264 And there we are 264 And actually when we get to 264 What we want to do is we reset our counter so that we start back at 0 again What I’ll do is just hook the output of that over around to our reset signal So now if I just let the clock run continuously, I don’t know if you can see it But these LEDs are flicking out very briefly There they go. I’m not sure if you can tell on camera but they’re but you know, it’s going through the cycle so at 200, 210, 242 and 264 These LEDs are going off very briefly just for one clock cycle But what we really want is we want to be able to tell when we’re in the different sections of this signal So, for example, we want to know should we be displaying pixels or not, or should we be sending the sync pulse or not? and so for that what we really want is we want to know are we between pixel zero and pixel 200 or are we between pixel 210 and pixel 242 right now All we have is just a pulse when we get to each of those points but what we can use is we can use an SR latch and this is actually an inverted SR latch because Our outputs here are active low So we want the inverted set and the inverted reset and if you want to know more about the SR latch I’ve got a video on that so you can check that out up there but what we want to do is we want to be able to say ok when we get to 0 or actually Which is the same as 264 because when we get to 264, we’re going to reset and be at 0 right away Anyway, so when we get to 264, we want to set this latch and then when we get to 200 We want to reset it and then our output Q will be high if we should be displaying pixels and low if we’re in the blanking section over here and then we can use another SR latch for our Hsync or horizontal sync signal and in that case at 210, which is that guy we’ll set the latch and Then at 242 will reset the latch and then the Q will indicate whether our horizontal sync should be active or not or actually since this is a low going pulse we can just use the Inverted Q for that and that’ll actually be our Hsync signal so to build this SR latch. We’re using two NAND gates And so it gives a 74LS00 which actually has four NAND gates on it So I’ll hook up power and ground and then I’ll hook up the two cross-connects for the first SR latch so that’s just these two connections here from the outputs back around to the inputs And so for the first SR latch, we want to set it when we get to zero, but also when we get to 264 So we get to the end I want to set this so that’ll be this signal here Which actually is already kind of sneaking around here hook that up So we’ll set this latch when we get to 264 And then we want to reset it when we get to 200 which is this guy here It’ll take the output there for 200 and that’s where we’ll reset. And then if we look at the output of this What we see is that when it’s on that’s when we should be sending pixels and then it goes off That’s our blanking interval All right So that should be on from 0 to 200 and then it goes off from 200 to 264 And then it comes back on again. So now let’s do the same thing for our sync pulse I’ll hook up those cross-connects. That’s our second SR latch and this one is gonna be set at 210 and then reset at 242 and I’ll grab another these LEDs and look at the output of this one And so that’s our sync pulse so we have our display when that’s on and then we get here to our blanking and then in our blanking you see the sync pulse Okay, so we know in our display interval is we know when our blanking interval is and we’ve also got our horizontal sync pulse But the whole purpose of setting all this up is so that we get the timing right down to these Microsecond values for each of these intervals but that assumes that we’re using a 10 megahertz clock So let’s get our signal generator out of here and actually set up our 10 megahertz clock So this is the 10 megahertz oscillator And I’m just going to hook this up and these are pretty easy to use basically You just hook up power and ground So power is this pin up here on the top left and ground is the pin over on the bottom right And as long as you’ve got power and ground hooked up like that, you’ll get a 10 megahertz signal coming out of this top Right pin here that we can feed into our clock And it’s kind of hard to tell if that actually did anything because our LEDs just appear to be on but of course if we’re going at 10 megahertz, these intervals are gonna be so fast that you know, These are in microseconds the whole line it takes 26.4 microseconds, so we’re not really gonna see the LEDs doing anything So what I really need to do is get these LEDs out of here and hook up an oscilloscope where we can measure the times exactly So I’ll hook up one oscilloscope probe here to our display interval and then I’ll hook another here over to the sync pulse And now if we look at the oscilloscope, we’ll see both of those signals here So this is the display interval and then during that blank period there we see the sync pulse and you know Actually, we want the sync pulse to be high and then it goes low for that sync pulse Instead of the other way around so instead of looking at the Q output of our SR latch We can just pop over here to the NOT Q output the inverted output We should see the sync pulse that looks the right way. So this looks right but let’s actually verify each of these times So the visible area should be 20 microseconds so if I want to measure that positive going part of this signal we can use this option here just to look at that width and then shows 19.9 about 20 microseconds So that’s exactly what we would expect here is 20 microseconds And then we can look at the sync pulse as well. So that should be 23.2 microseconds so in this case, we need to go to channel 2 and then we want to look at the Negative going width. So let’s bring that up and that’s 3.2 microseconds And so that’s the negative going time of our sync pulse is 3.2 microseconds So so far it looks like we’ve got these these timings perfect If we want we can even measure the front porch and back porch times if we zoom in here a little bit We can bring up the cursors. Here we go So we can move cursor A over here to the start of the blanking interval and then cursor B we can move over to the start of the sync pulse and then cursor A minus cursor B is about 1 microsecond Which is exactly what the front porch ought to be 1 microsecond and then we can do the same thing for the back porch So move cursor B over to the end of the blanking interval and then cursor A we can bring over To the end of the sync pulse and then B minus a is 2.1 microseconds, and it’s supposed to be 2.2 although maybe that’s close enough or well, I guess it says 2.1 6. So that’s even even closer So that takes care of a horizontal sync signal we’re generating this perfectly So next we need to generate the vertical sync signal and it’s going to work pretty much the same way It’s just instead of counting pixels across the screen. We’re gonna count scan lines down the screen so every time we go through this 264 pixels across we’re going to count one line down and then we need to know when we’re between 0 and 600 so we can display stuff and then we need to know when we’re between 601 and 605 so we can output the vertical sync signal to the monitor and if we look at the timing requirements here These times are just based on the times up here So with our 10 megahertz clock, you know We’re generating these times correctly now and because each whole scan line is going to take 26.4 microseconds All of these times are going to work out as long as we just count the number of lines correctly So really we just need to build a circuit identical to what we just built that counts up to 628 and detects 600, 601, 605 and 628 And so just like before we can take the number 600 and Feed that into some inverters and a NAND gate and detect when we get there Now one difference is this time around, you know to be able to count up to 628. It’s going to take 10 bits So we’ve got a couple extra inputs here, but we’re still able to cheat a little bit We don’t need to we don’t actually need to check either of these 2 bits because again, this is though This is the 128ths place So if this were a 1 then this would be 728 and because we’re only counting to 628 we never need to check if though if these are ones as long as the other 8 bits that we are checking are correct and Then here’s how we would check for 601 basically the same except that last bit is now a 1 instead of a 0 and then 605 is just a little bit different and finally 628 and you notice with all of these That these two bits here that we don’t have ever have to check So in all of these cases just like before we can get away with that 8 input NAND gate Which is very convenient the other thing that’s kind of convenient here Is that some of these bits like this one and the first one are always one At least in the cases that we want to check and so we can save ourselves an inverter there because we Never need to check if that particular bit is zero So overall, this is what we’re going to need to build and you can see we only need five inverter for this to work These two bits. We never need to check and then these bits whenever we check them We’re only checking if they’re ever a 1 but otherwise this circuits going to be very similar to what we just built We’re just gonna have 10 bits for our counter and we’re checking now for 600, 601, 605 and 628 This is our horizontal timing circuit and I’m just gonna add a few more bread boards here where we can build our vertical timing circuit So I’ll start by building the counter that’ll let us count up to 628 and to count up to 628 we need 10 bits instead of the 9 bits we needed before but 3 74LS160’s gonna give us 12 bits to count with so that’s still more than enough and I’ll add the inverters that’ll help us decode the different values that we’re looking for. And then hook the outputs of the counter up to the inputs of those inverters Then I’ll add the 4 NAND gates that we’re going to use to decode the 4 different values that we’re looking for. So three of the bits are always ones I can just hook all three of them up to all four of the NAND gates and then I’ll just hook the rest of the counter bits up either inverted or not inverted to the 4 NAND gates to detect the 600, 601, 605 and 628 that we’re looking for. And so that should detect 600, 601, 605 and 628 and when we get to 628 we want to reset our counter It’s all hook 628 up to the reset signal for our counter and then we want the SR latch so that when we reset at 628 we set the latch and then reset it when we get to 600 So we have a signal that will tell us if we’re in our display area and then the other latch Which will set on 601 and reset on 605. So we’ll add a quad NAND gate and build our two SR latches So the bottom one’s going to keep track of when we’re displaying our image So we want to reset that or we want to set that rather when we reset the counter and we want to clear it when we get to line 600 and Then the top SR latch is going to generate our vertical sync pulse. So we want to set that when we get to 601 and Reset it when we get to 605 and so now we’ve got two timing circuits We’ve got a horizontal timing circuit that counts pixels across the screen. So this is sort of a column. We’re on that This is counting and then it generates our horizontal sync pulse and then the vertical timing circuit counts, which line on the screen We’re on and generates our vertical sync pulse now for our horizontal timing We’re using a 10 megahertz crystal because we’re essentially putting out 10 million pixels per second as we scan across the line But for a vertical timing, we don’t want that to count every time we put out a pixel We want that to count for each line that we put out So in other words when we’re done drawing a horizontal line, so we in other words would get to 264 with a horizontal counter That’s when we want to increment our vertical counter and go to the next line So the reset signal down here for a horizontal counter we can use that as the clock for the vertical counter so let’s power this up and reconnect the oscilloscope to make sure our horizontal timing is still working correctly and So this still looks pretty good Yep, that looks like about what we would expect So now let’s also hook the oscilloscope up to take a look at the vertical timing and see what that looks like And so let me turn on these other two channels here so we can see that And I have to move things around a little bit and change the scale here So let’s try to try to fit everything on the screen here Okay so here we are and it looks like something is happening with our vertical timing But of course the vertical timing is much slower than the horizontal Timing since there’s going to be six hundred and twenty eight of these pulses for every vertical frame so we’re going to need to zoom out a bit and Then I can also set this to trigger on that channel three So, there we go And if we zoom out a little bit more we should start to see the vertical timing and so just like before we can take a couple measurements just to make sure this is working right so If we want to look at the width of the visible area, that should be 15.84 milliseconds So that’s going to be this right here. And there we go 15.8 milliseconds. So that seems pretty close And then the sync pulse here should be 0.1056 milliseconds So no, we should be able to measure that as well So let’s go to channel 4 and then we want to see that negative pulse width And we may need to zoom in to get a better measurement of this. So there we go so that’s saying it’s a 108 microseconds And 108 microseconds is going to be 0.108 milliseconds So that’s probably pretty close If I zoom in even more you can see the Precision’s even better So here I’m even closer to that 0.1056 And the other thing you can see is that when the visible area ends There’s one horizontal sync pulse before we get to the vertical sync pulse and then the vertical sync pulse so you can see is 1, 2, 3, 4 horizontal sync pulses. And so all of that matches after our visible area We’ve got one line followed by our sync pulse, which is four lines long So it looks like we’re generating all of this timing properly. So let’s go ahead and actually try cooking up a VGA monitor So a VGA uses this 15 pin connector and actually five of those pins are grounds So there’s the ground and then a separate ground for red green and blue and a sync ground Plus the outer shell is actually a ground. So I’ve hooked all of those grounds together And so I’ve got a ground connection here and then pin 13 is horizontal sync And pin 14 is vertical sync So let’s actually try hooking this up to our circuit so hook the ground up and Then our horizontal sync I’ll hook up here and Then vertical sync. I’ll hook up to our vertical sync And so now if we actually plug a monitor into this You can see the monitor comes out of standby And of course the display itself is blank because we’re not sending any picture to it yet but if we go into the menu here we can actually see what mode it’s in and You can see it it thinks it’s in 800 by 600 mode and it says the horizontal frequency is 38 kilohertz and the vertical frequency Is 60 Hertz and that all matches what we’re trying to do here 800 by 600 at 60 Hertz timing and the vertical refresh rate is 37.8 kilohertz and so with our two sync signals here. We’ve managed to fool the monitor into thinking that it’s in this mode So now what we need to do is send the actual pixels the red green and blue signals You know in the right order to draw a picture and that’s what I’m going to tackle in the next video So make sure you subscribe to the channel and click that bell to turn on the notifications So you’ll be sure to know when the next video comes out and if you feel like supporting the creation of more content like this Head on over to my patreon page and sign up at whatever level feels comfortable I really do appreciate everyone who helps make these videos possible

Tags: , ,

100 Replies to “The world’s worst video card?”

  1. Duality says:

    Why are the timings not exactly the values but close enough is that due to propagation delays ?

  2. Mamodo FPS says:

    2 Hz core clock
    6 Hz mem. Clock
    24 B VRAM

    MAX resolution: 128×128¶

  3. Under A Bridge Too Far says:

    I'm just going to nod and smile! 😀

  4. Abe says:

    Every word of praise is well-deserved. This video is exceptionally good.

  5. TVG28 says:

    Intel UHD Graphics 602 Gang

  6. Mr Peco says:

    how do they video cards now days?

  7. Sreenikethan I says:

    This is your third video to cross a million views! Congratulations!!!

  8. firstname gklsodascb says:

    For the love of god, please use a microcontroller

  9. Sinder says:

    Still better than my pc

  10. Johnny Serup says:

    Really interesting and well described content – fantastic video

  11. Latinong Bulag says:

    wait. i got lost there, so the NAND gates gets a signal with the proper value. how does it know what to do with it ? i guess some fact flew over me i cant get a grip on it.

  12. Sławek B. says:

    Beautiful! Very neat

  13. iProgramInCpp says:

    Congrats for 1 million views! ☺️

  14. Don P. says:

    aight i forgot what he was doing in the first minute of the video

  15. Chris723 says:

    Wow a video in which a pearson has talent and not clickbait or drama. Keep it up

  16. Pratik Mullick says:

    Thank you Ben for simplifying how a VGA monitor actually works. For someone having no clue how circuitry and electronics work, this is perfect.

  17. yash agrawal says:

    Hi Ben! Nice Video. But i am not able to comprehend the use of 8 input NAND Gate while you could have Used 3 input And gates to pick out the values ? Loved you video.

  18. Colyn Bowman says:

    Commodore Clicker never made more sense…

  19. Google can suck my dick, I won't be using your fucking G+. GTFO says:

    Six 4-bit counters, four inverters, eight NAND gates, two SR latches… Wouldn't it be easier and cheaper to just use single 16-bit MCU?

  20. Peppa says:

    Damn, I've finally found a working educarional video, after 2 years!

  21. Simonas Pilkauskas says:

    Didn't know that you can damage CRT by wrong VGA signal. My CRT stopped working after I set refresh rate from 60 to 75Hz. It didn't recover after setting back to 60 (later found out that monitor supported up to 60Hz)

  22. Vita-Kyte says:

    The Recommended Videos Tab has blessed you

  23. G1K777 says:

    DAMN, I've learned so much from this ö.ö
    Can you do the same except with the monitor? Making a monitor?

  24. JS Diddle says:

    At 18:36 you can see the led flicker as he said

  25. Jerónimo Benavídez says:

    Important question: can you run fornite with that?

  26. Jannik Heidemann says:

    So VGA has VSYNC which doesn't cost extra?

  27. Munich FX says:

    Yeah, I didn't understand a thing but still found it amazing. 10/10 would watch more.

  28. Embeh says:

    Super complicated way to display “600*800”

  29. Richard Yan says:

    This is awesome. Easy to understand, perfectly crafted.

  30. tycse says:

    Oh man this is great.

  31. Rollmops94 says:

    Why didn't you just reset the counter whenever the highest bit turns high?

  32. Snapdeus says:

    outstanding! can't wait for the next video

  33. Alex Young says:

    Last time I did this I used a CPLD. I wouldn't even dare to start with a breadboard lol

  34. Jakob says:

    So right now I'm getting into the basics of electronics and I don't quite understand why he needs the inverted signals of the counters.
    Can someone explain to me why the inverted signals are necessary and why he can't just use the not inverted signals? Isn't there no signal anyway when it is put to a 0?

  35. Grimgore Ironhide says:

    It makes me happy to see a 1M views for this kind of video. I guess most of the views come from gamers.

  36. El Pancho says:

    i feel retarded after watching this ….

  37. Joe Yabuki says:

    I haven't seen a good video on youtube in while till i came across this one.Awesome channel.Please keep up this good work Ben!!!

  38. yanasitta says:

    Does this support SLI?

  39. gideon maina says:

    Should have chosen YouTube over a 5 year degree course

  40. Zack Schmiesing says:

    As an electrical engineering student, I found this absolutely fascinating. This stuff is just awesome.

  41. Алексей Лебедев says:

    I really like this video for it to have a clickbaity title, but then you watch it… And no, it is exactly as it titled XD

  42. DemiImp says:

    At 12:00 – You only need an and gate that checks 2 bits (256 & 8), you don't need to invert and check 8 bits! All other bits don't matter 🙂

  43. UnProfessional Gaming says:

    I really want to be a computer architecture engineer, so I love watching your videos, and I've actually learned enough that I've made a breadboard computer that can display videos from a flash drive at 1920×[email protected] Took me waaaaaay too long, but it was worth it, and I took help from your videos, so thanks for that!!

  44. Eudécio Gabriel says:

    What is the name of the VGA adapter you used in the video?

  45. A B says:

    wow, I really like your videos

  46. Latinong Bulag says:

    Hey bob, i wonder using this kind of knowledge to cluster up lousy video cards, to perform as a flagship product or reach specs well enough for gaming, would be possible??.. hmmmm…

  47. FortAle says:

    Can someone link me all the components pls i need it

  48. Abanoub Sameh says:

    You should build a better breadboard cpu and hook it to the gpu

  49. Sandwich says:

    Plot twist, this video was made on the card

  50. Ama Aje My Fren says:

    Dear Ben Eater,

    your channel is a revelation. Thanks for it and the awesome videos in it.
    I have binged for a couple of days now.

  51. Oleksii Kharkov says:

    1. Why do you use two hex-inverting chips for vertical sync? One chip would be enough (you need only 5 inverters).

    2. It is brave to use LEDs wo resistors and chips wo bypassing capacitors. And to connect them in real time!!

    3. It will be MUCH easier to use something like Arduino or stm32 to do the same whole thing.
    Or any other microcontroller with enough speed.

    But – thanks for the video, of course!
    Great job!
    You received a new subscriber)

  52. Alex Ramos says:

    You are the best

  53. That motorcycle guy says:

    You are strong with the nerd force, subscribed i have.

  54. AFNacapella says:

    hey, I went back to rewatch the whole build and was wondering about active-high and active-low. why is this different in different chips? do they just build it as easy as possible and whatever that first transistor needs decides it? or are there conventions? or is it a scam to sell inverters?

  55. Free Gmail says:

    But can it run crysis

  56. Sam Li says:

    Intel graphics division: note taking intensifies

  57. Umski says:

    Wow, super neat bread-boarding! I remember my very first self-designed circuits as a 17-year old were made up of logic gates like this for an A-level (UK) Design & Technology project – going on to Uni and studying electronics I discovered programmable microcontrollers and reflected on how crude my logic-chip method was! I see now that in hindsight these principles are used for the underlying technology that surrounds us, and actually has for decades – humbling!

  58. PhantomIsMyL0rd says:

    N V I D I A W A N T S T O K N O W Y O U R L O C AT I O N

  59. Adam F says:


  60. Modern Times says:

    I am interested in Electronics now….

  61. Tate H says:

    Can it run crysis?

  62. Cooljosh3k says:

    Technically not pixels

  63. TheSimonLP YT says:

    Couldnt you just have used an EEPROM?

  64. henk jibbe says:

    Are you secretly DangerouslyFunny?

  65. Jeff Mitchell says:

    I've built one of these myself and really really enjoyed the project; except I also had a tonne of interference (possibly due to all the wires jumpering all over ther darned place :); later I also did it using microcontrollers with interupt based counters andGPIO for colour data (so timing wasn't quite exact and you could see the image warbling a little), and FPGAs (worked a treat! just redoing the basic 74LS logic but in FPGA form.)

    Super fun stuff.

  66. Unnamed Player says:

    I had no idea what he was saying or what he was doing, but I enjoyed it anyway.

  67. johnm2012 says:

    I really enjoyed this video and the follow up. It made me subscribe and binge watch your 8-bit breadboard computer series, which is a brilliant educational series. I last played with 7400 series TTL chips back in the 1970s, before moving on to 4000 series CMOS and then microprocessors. I seem to remember that the original 7400 (non-LS) chips were very susceptible to their own switching transients and it was standard practice to decouple the power supply with a 100nF capacitor across the power pins of every chip. I notice you didn't do that but maybe these "modern" LS chips don't need it.

  68. Rohilla Records Official says:

    can you build 4k

  69. Whitson Sutherland says:

    Binary digits up to 15 (2^4 or 16 – 1) it is <(-_-)>
    0: 0000
    1: 1000
    2: 0100
    3: 1100
    4: 0010
    5: 1010
    6: 0110
    7: 1110
    8: 0001
    9: 1001
    10: 0101
    11: 1101
    12: 0011
    13: 1011
    14: 0111
    15: 1111

  70. Le Playz says:

    You're a master!

  71. Oerjan Snell says:

    That easy huh? I gotta try this sometime.

  72. Adrien COURNAND says:

    This is SOOOOO cool

  73. ryan.m says:

    16:00, prototyping with the power on! tst tsk tsk

  74. Vance Trimble says:


  75. Shine Santhosh says:

    After watching I found myself powerful,coz I've a microcontroller 😁😁

  76. V King says:

    wow its cool how an original idea could easily hit 1M vues on youtube at least he is getting the fame he deserve

  77. lindus jones says:

    who is your wire cutting guy? i need to hire him

  78. Anarchy Record Productions says:


  79. Badar Wildanie says:

    I think you should buy an i7-8700K to replace your arduino, lol .. Great video by the way, learn a lot from your channel

  80. Damisi Msanii says:


  81. skyrazer2012 says:

    ur nuts!

  82. Jonathan B says:

    What degree do I need to know how to do this kind of work. I love it but don't know where to start.

  83. TheIgnobleSavage says:

    This is beautiful

  84. TheIgnobleSavage says:

    Honestly your channel and work is an inspiration. There simply isn't anything like this level of quality education and explanation anywhere else. Should be required viewing for anyone studying computer engineering/science.

  85. Gamesational says:

    Still a video card man. Good Work! Not many people know how these bad boys work.

  86. Alkis05 says:

    So this must be pretty easy to do in a FPGA chip. Or even a controller, like a tiva c launchpad, which can run at 80Mhz.

  87. Joaquín Becerra says:


  88. ALDO CONTRERAS says:


  89. Señor Dossier [Retro reviews, Coleccionismo & más] says:

    But can it play doom? :v

  90. Harvey Kauffman says:

    He kinda sounds like Badger from Breaking Bad.

  91. first name last name says:

    Nvidia starts sweating

  92. please help me get pewdiepie subs minus 5 mil says:

    Imagine if linus seeing this

  93. Steven Hokins says:

    Great video!

  94. CJWarlock says:

    Cool! C64 era electronics looks so relaxing to watch somebody else constructing a logical circuit. 🙂

  95. Jacques Lavoie says:

    Faraday, Turing, Bardeen, Noyce, Wozniak, Eater, that's my list. Your work is invaluable.

  96. HK Electronics says:

    Thanks for these videos, I can say I have a better understanding of how GPUs work now, great

  97. Glitch Walker says:

    That cool moment when you realise, whilst watching this video, your own monitor/TV is doing this in order to provide the video describing how this technology works. I mean, obviously I knew this before, but the whole process is abstracted to such an extent that all the effort required from me was to find an interesting video and Chromecast it to my TV.

    Thank you for the video… It's great to know how the underlying technology works.

  98. christopher david robertson says:

    Can someone explain how one would use a 2 pin Crystal oscillator in this circuit?

  99. Timotheus24 says:

    When Mom calls: "My TV doesnt display the DVD. Son can you help you poor old mother…"

    This guy has no excuse.

  100. Jake Thomas says:

    No bypass caps?

Leave a Comment

Your email address will not be published. Required fields are marked *