USB 1.1 Device IP Core Success Story

[This is a sucess story about our Free USB 1.1 Device IP Core that was donated to OpenCores.org]

OpenCores.Org USB1.1 Function Controller Success Story

As part of the undergraduate program in Computer Engineering at the University of Waterloo, all students must participate in a fourth year design project. Our team created a PC Oscilloscope, since we had frequently encountered problems with a lack of access to oscilloscopes when working on our own personal projects. Real oscilloscopes are expensive, and definitely outside our student budgets. Our concept was to create a cheap, full featured oscilloscope by harnessing a PC's computing power and display ability.

When designing the oscilloscope, we quickly concluded that we needed a relatively high bandwidth, common and affordable connection between a PC and our device. USB was the natural choice. Our school had provided us with an Altera Excalibur FPGA development kit, so we began by searching for USB Core IP. After a few promising leads, none of the companies were willing to donate a USB function controller to our project.

At this point, Evan Jones remembered hearing about OpenCores, and immediately discovered the USB1.1 function controller. We began by reading the little documentation that was available. Since the author of the component used a Phillips USB tranceiver and Philips does not provide samples of that particular part, we ordered samples of a nearly pin USB tranceiver from Fairchild Semiconductor. Meanwhile, we compiled the component with the Altera Quartus tools.

Once the trancievers arrived, we soldered up a quick circuit to connect the USB cable to our prototype board. The very first time we connected the device to our PC, the PC crashed. We assumed that this was a good sign, as at least the PC was seeing the USB device. After some more debugging using another computer running Linux, we determined that while the device and the PC were communicating, something was going wrong. The PC was reporting that the device was sending "babble".

We spent the next few days debugging. First we resoldered our USB interface circuit to reduce noise. We manually decoded the signals on the USB bus using an oscilloscope. We were stumped. It looked like the beginning of the USB enumeration was working correctly, but it would still fail and reset the bus.

We took a break and returned to it in a few days and redid absolutely everything from scratch. This time the PC detected an unknown USB device. It turns out that our problem was that we set an incorrect setting in the VHDL header for our particular FPGA. With the default settings and a recompile, the device worked.

It took us a few more weeks until we worked out our software device driver and the remainder of the device logic, but that was all relatively straightforward. The OpenCores USB function controller worked as advertised. If we were to do the project again, we would easily be able to get it up and running in a few hours.

Evan Jones               http://www.eng.uwaterloo.ca/~ejones/
Mauro Loconsolo      4ydp_waterloo@rogers.com
Evan Robinson          e2robins@uwaterloo.ca
Sahand Sojoodi         sahands@hotmail.com