In this project, we created a digital Etch-a-Sketch with a VGA output. In order to build it, we needed:
We wired knobs into our FPGA board and coded the board to handle knob, switch, and push-button inputs, and to output our sketches to the VGA. Here’s how all the components are connected:
Our circuit has two knob inputs and four switch inputs and outputs to a VGA display. One knob controls the horizontal motion and the other controls the vertical motion of a current pixel location that we track and draw on the screen. The switches control the drawing color — each switch correspond to a color: red, green, and blue. The color that the Etch-a-Sketch draws in and clears to is the combination of whichever color switches are in the ON position. Our fourth switch clears the screen to whatever color is currently active from the three color switches when it is in the on position, writing every address in the visible portion of the Block RAM (BRAM) to the new color.
FUNCTIONALITY & DOCUMENTATION
At a high level, this is the logic we programmed in VHDL. You can follow the the control flow across the screen from left to right, from the inputs through the internal logic, to the VGA output. After synthesis, this is the final generated schematic.
For more detail on the top level functional blocks and specific VHDL code, see:
JUSTIFICATION & EVALUATION
Our final product is a fully functional Etch-a-Sketch displaying on a VGA. As such, there are very few improvements that could be made to the design, other than potentially adding other functionality. Analysis on resource utilization and critical timing path can be found in the additional assets folder, and both of these indicate that our Etch-a-Sketch is efficient and behaves properly.
In short, we achieved all the goals we set out for ourselves at the beginning of the process. In our proposal we stated that we planned to have two knobs to control the x and y motion of drawing, and a button input to clear the screen. We followed the proposed knob operation exactly, though we decided that a switch, which would keep the screen cleared while in the on position, would be more practical for clearing. We also added three switches to control the color, both for the color in which Etch-a-Sketch draws, as well as the color that the screen is cleared to.
For anyone creating a digital Etch-a-Sketch in the future, our largest recommendation would be to fully test each module of the program before implementing it. We did this for the most part and it paid large dividends, allowing us to often have the hardware behave correctly the first time we generated a bitstream for our FPGA. Particularly with the Etch-a-Sketch, almost all components are relatively straightforward to test bench, so there is no excuse for not making sure that a module works exactly as expected before converting it to hardware. The one time that we did not test bench a module effectively was with our controller, and this caused us to search for a long time without being able to find exactly what the error was. We had used a test bench, but the test bench did not accurately represent the behavior of the hardware inputs, and because of the ineffectiveness of our test bench we struggled to find the error. The most important piece of our success in this project was testing often and efficiently.
The next component we plan to add is a starting screen. We’ll develop this feature by using Matlab to create a COE file that would initialize the BRAM to “more welcoming values”. You can follow this project as it unfolds: