About a year has passed since I finished my studies and started my current job. This is a hardware/electronics engineer position, which I had very little experience with during Uni. Although my formal education is in EE, programming has always been my biggest passion, so I tried to take as many programming and CS courses as possible and worked as a student in IBM's research labs, programming in C, C++ and Perl (I still work there part-time...).
I want to try to summarize for myself how this year went, how I'm slowly learning the craft of hardware engineering.
Some of the stuff I'm doing here now are what I always wanted the most, a mix between the theoretical (software) and practical (hardware). That is, not coding just for the sake of applications, but for real things, like various devices. For me, it's much more interesting to code a program that reads/writes to serial port and talks with devices than Yet Another J2EE application with a BLAHBLAH database interface.
But first things first...
When I just came in, I was given a relatively simple task - to take some VHDL code written by another engineer and verify it, following the spec, using simulations in Modelsim. This was a good task, as it allowed me to learn VHDL (I knew it a little before, from homework and labs, but not enough to read/write real code), and get to know Modelsim, which is a great simulator. Programming skills quickly came to my rescue - it took me exactly 2 days to understand that I need a Perl installation here. I wrote scripts that generate testbenches, test vectors, compare results to expected, etc. Fun fun fun, especially to be able to help people who are not aware of such tricks at all and were doing boring manual work before.
They probably liked the way I verified those designs, as my next task was to thoroughly test a bought soft IP core (a module with VHDL code supplied).
Next, I actually got to write some VHDL code myself. I was teamed up with a senior engineer on his board that featured 4 FPGAs and 3 embedded processors (no less!). My task was to help him code the FPGA designs and verify his code. Oh, I still remember the excitement when for the first time I synthesized some VHDL I wrote, loaded it to the FPGA on-board and saw it running in the Logic Analyzer. As I mentioned earlier, these "real" applications are what I enjoy the most.
Another task I did is modify an existing program in C that was running on an old DOS PC and talking to a custom-built card to gather some data from a communication link. The program needed refreshing and some options added, so with my knowledge of C I did it. It's real fun the DOS way - the card's registers are just memory-mapped, and accessed directly (direct-memory access, uh oh, an immediate fatal exception on Windoze, but not DOS :-) with in() and out() functions.
Slowly I started to get more involved on lower levels - understanding what some analog circuits are doing on the board, to be able to better check them using a special test version of the FPGA.
In parallel, I got to fiddle with the test program of the embedded CPUs. My first taste of Ada hacking! Writing code, compiling it a loading it to a PCB (that lies on your desk) from which it runs is a whole different experience than traditional PC programming.
The task with this board and its FPGAs is quite long and still ongoing. We have some bugs to brush-out (hardware bugs are far meaner than software bugs...), and more code to write.
Later I was assigned a programming task - a program to be used in-house to decode binary data from special files. In-house means that I could choose any tool I liked to program it, as long as it works. I decided to try to use Perl for this rather large project. So far it's about 4500 lines of code, and there's still a lot to add. Perl doesn't disappoint me, except for a little slowness in Tk's GUIs.
I also began to do real low-level stuff, like designing small circuits with diodes, transistors, capacitors, etc. It's real fun building a test circuit, feeding it with a pulse generator and tracing lines with a Oscilloscope - you can actually see the little electrons moving (figuratively, of course)!
Recently I found some components we could use in one of the boards, and now it's all about designing how to incorporate them into the project. This is stuff I've never done before, hell I had to recall what a Zener diode is. A senior engineer just said "sure, use a zener here". I nodded with understanding and 5 minutes later rushed into the net and my old notebooks to recall what the hell a zener is used for. Well, now I know :-)
A little later, I'll have to test these components with a PC (communication devices). I can't wait ! We'll build a test board, connect the communication component through a RS232 converter to a PC serial port, and I'll have to code some C to talk to it (there are development kits ready, so I'll probably just have to understand how they tick and borrow code from there).
So, I'm just slowly turning from a programming geek to a hardware/electronics/embedded/programming geek. As long as I stay the geek I am, it's alright :-)