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