Objective | High Level | Hardware | Software | Results
Hardware Design
Our hardware was broken down into 4 parts - The string/fret system to read which frets you were pressing, the string pluck system which was used to detect what string was plucked, the NES Controller interface, and the LCD interface.

The hardware for the String fret system was implemented using a memory mapped register (0x2900000). Writes to this address would
determine which string was being driven. The 3bits of the output were mapped to expansion board outputs, and then wires were run into the top of the guitar strings, as a result when you wrote to the register, you would drive the corresponding string high, and that would drive the depressed fret input high. Performing a read would get you the most recently latched fret data, and then latch new fret data. We used this to read data from the first 6 frets on the first 3 strings, starting at the E string (the lowest), and the lowest fret closest to the head of the guitar.
The way we implemented this system limited us to only reading one string at a time and only allowed you to press one fret on one string at once. Failure to do so could result in a short which causes your data to be invalid. Had we had the technology, we could have worked around this in the following manner:
- The risings on the neck of the guitar would have to not be one continuous conductive piece of metal. It would have to break at some point
between each string, however would need to remain the same shape to keep the characteristics of a guitar, so fill these breaks with a nonconductor of some sort.
- The output would have mappings from each of theses segments of the risings. A tristate corresponding to what string was being driven would decide which data be driven out to the processor.
The hardware for the string pluck system was implemented using 3 condenser microphones. These condenser mics were mapped into three memory mapped registers which were readable in software (0x0330 0000 - 0x0330 0012). The vibrations of a string on the condenser mics drove its input high, which was then latched to the register, which then drove our LEVEL1 IRQ Line. The processor could then poll the condenser mic locations to find out which string was plucked. The interrupts it drives are used to check whether the depressed frets are supposed to be depressed or not.
We were unable to effectively impliment software or hardware to avoid detecting the same pluck twice. What was happening is that a pluck would drive an interrupt, the handler would be performed and reset the latch, however the still oscillating string would instantly cause another interrupt to be driven, and so until the vibration was below the detection threshold, would continually drive intterupts. What we knew to do but actually just forgot, was either implement software smart enough to avoid redetecting the pluck (by temporarily disabling the interrupt), or to design the hardware to only drive the register high at the beginning of the signal spike.
The NES hardware was implemented by generating the required latch and pulse signals using clock dividers and counters. The input data was then continually put into a memory mapped register (0x0340 0000), which could be read at any instant in time to get the most recent NES controller data. We use the controller inputs to navigate the game menus.
The LCD hardware was implemented to meet the timing and signal specifications. The hardware interface provided us two memory mapped address, one for data and one for commands. Writes to and reads from 0x0270 0000 put commands for our LCD to perform and provided us the status check data. Writes to 0x0270 0004 provided the LCD with the data to carry out the commands. We use the LCD to navigate the software and to present the guitar tabs, as well as a congratulatory screen.