I was introduced to FPGAs by a digital logic course I was required to take in college. I was a sophomore, and until that point, I had never had any theoretical or practical experience with any digital electronics. My electronics courses had all been theoretical treatments of analog concepts: resistance, capacitance, circuit modeling, etc.
As a result, of course, FPGAs were wildly confusing. Initially, the digital logic course focused strictly on logic theory, starting with an explanation of logical gates and followed by flip-flops, counters, and so on in increasing complexity.
And that was just the lecture part of the course. When we made it to the lab, we were presented with a Spartan development board and shown how to lay out a circuit we had designed using logic gates. The circuit was an ongoing project. The final goal was to design hardware that would run a seven-segment counting display. There was some Verilog involved (with very little explanation), and we were told exactly what to write in the constraints file with the explanation that it would connect certain signals to certain pins. This was all well and good, but after completing the class with a respectable B+ grade, I couldn't help thinking that the class should have been structured differently, and that I could have done a better job organizing it.
Over the years, I continued to think I could have done a better job organizing the course... all the way until I tried to do just that.
One of my professional tasks (and personal goals) right now is to build a simple bridge to the world of FPGAs for people at the same level I was in college. What I'm learning is just how enormous such a project is. Just like designing a product or component, teaching a subject like FPGAs has difficult design tradeoffs.
For example, which hardware description language should a beginner be taught -- VHDL or Verilog? If you use Google to try to answer this question, all you'll find is more questions. There are lots and lots of discussions, including a lively EE Times thread instigated by Programmable Planet's own Max Maxfield. Irrespective of all the discussions, however, it becomes obvious that there is no right answer. Verilog and VHDL have their own pros and cons, and it's up to the professor to decide which to teach.
The problems don't end with the integrated development environment or design language. The selection of a hardware development platform is even more difficult. As a teacher designing a course, do I base my choice of FPGA platform on simplicity, functionality, or cost?
A simple platform is easier to teach, but it means that, at the end of the course, the student has no experience dealing with more powerful hardware. Suppose, for example, that I'm building a counter circuit using a Digilent Basys2 board, which houses a Spartan 3E-100 FPGA:
The Digilent Basys2 DPGA-based circuit design and implementation platform.
Let's also say I'm learning about processes, and I want to use a clock signal. On the 3E-100, this requires one line of code and an addition to the constraint file. Alternatively, if I'm using the Papilio 500k, with a Spartan 3E-500, and I want to create the same counter, I have to implement one of the four digital clock managers -- a much more difficult task than writing a couple of lines of code. If I'm teaching a course, which device should I use? The simpler device will allow for a simpler, easier-to-understand lesson, but it might not teach the more important material. The more powerful device takes longer to teach and is more difficult to understand, but it makes for a more valuable learning experience.
So how does the would-be professor find the best middle ground? Should digital logic theory and FPGA implementation be taught concurrently or sequentially? What worked for you?