I will start off with the projects that I have done as part of my course work at RIT. Last winter I started my Senior Design project, finishing it in the spring. For this course, we are allowed to pick our own teams and project. I teamed up with Cory Merkel and we worked on an Autonomous Weapon Turret, building the mechanical parts, hardware, and software ourselves. All of our work is very well documented on our RIT CE website. If you have some time, in addition to looking at my project, I would recommend looking at the other RIT CE Senior Design Projects, most notably Jeff Kemp, Matt Prokop, and Mike Sanfilippo’s Home Sense Project (a home sensor network/automation project using Xbee modules). Below are a couple of pictures from our project. The first picture shows an early version of the software and the second shows the finished weapon turret.
I also took a Low Power Design course, focusing on the design of low power CMOS systems using circuit level, logic level, and system level power optimization techniques. This course proved to be a very good summary of the techniques both currently used in industry and being activelly researched in academia. We used simulation tools from Synopsys and Mentor Graphics in order to implement these techniques learned in class in a few smaller projects. My group’s final project was to take an AES hardware implementation and implement the low power techniques using Synopsys Design Compiler, Power Compiler, and PrimeTime. Our optimized design (utilizing clock gating and parallelization) resulted in a 29% reduction in power consumption over the baseline architecture with an 88% increase in area. Different configurations were also used to allow for more options for power/area trade-offs. This environment and our design recommendations were used in Ken Smith’s Master’s thesis that looked at AES power-profile-based side channel attacks. Specifically, he used our work to obtain instantaneous power traces that he then used as input vectors to his algorithm in order to determine the AES encryption key value.
My Systems Programming course focused on using x86 assembly and C in order to design and implement an operating system. The projects for this class included a simple assembler written in x86, Solaris system calls, device drivers, interrupts, process/thread management, pipes and fifos, terminal I/O, System V IPC, socket programming, and filesystems.
One of the more exciting classes that I just finished a few weeks ago was Microelectronics. In this class, in addition to the lecture section, I got to suit up in a “bunny suit” and get some hands-on expereince in fabricating semiconductor devices. We used the RIT Metal Gate PMOS process with a 10 micron feature size to fabricate PMOS transistors, op-amps, and logic gates (NAND, NOR) on 6-inch, <100> n-type Si wafers. In addition to the physical manufacturing, the process was simulated using ATHENA and the electrical simulations were preformed using ATLAS in order to compare our results between the theoretical, simulated, and experimental. A cross section of a PMOS transistor manufactured through this process is shown in the picture below.
The process included many of the same techniques used in modern CMOS processes. These include oxide growth, etch, photolithography, ion implantation, metal deposition, sintering, and electrical tests to validate the device functionality. The four photolithography steps were source and drain, gate, contact cut, and metal. Unfortunately I did not think to take pictures, but I do have a picture of the testing apparatus and results from the notes, shown below. The figure on the left shows the microscopic view of the wafer, specifically a PMOS transistor. The 12 probes (along the outside of the image) are aligned to the metal (aluminum) pads along the outside of the device for testing purposes. A HP-4145 analyzer was then used in order to do a voltage sweep to obtain a ID-VG curve and a ID-VD curve.
As far as independent projects go, I have been working on a few of those as well. First of all, I bought a couple of touchscreen monitors from a local electronics recycling company. I plan on using the monitors to build a touchscreen jukebox for my parents. Unfortunately, I am having trouble finiding the right power supply that is able to power the display, which makes me think the display itself is broken. I have a few different adapters that meet the specifications on the monitor and service manuals. The speakers and touch interface both work fine when I turn the monitor on, but the display itself will not turn on. I plan to meet with the company that sold them to me this week to confirm this, primarily to see if they will replace them before I take the monitors apart to diagnosis/fix the problem myself.
For CSH, I finished a design for a networked iButton door lock system. The purpose is to allow members of CSH to unlock common room doors electronically using an iButton and a solenoid locking mechanism. This essentially consists of an ATmega168 microcontroller (arduino), a WIZ811MJ wizenet ethernet module with SPI, an iButton reader, and a power MOSFET to control the solenoid locking mechanism. A working prototype version of this is shown in the picture below. I have a PCB design finished that I plan on manufacturing later this month so that I can actually install the system on the floor. I will post a more detailed update once that project is completely installed and finished. Below is a picture of the prototype. I probably should have done a better job setting that picture up, but a picture is better than no picture.

Another somewhat related project is something Dan Lampie and I have been working on – a power meter for Dan’s wind turbine. The core of this system is essentially the same as the iButton doorlocks. It uses the same microcontroller and ethernet module. Additionally, it has a hall-effect current sensor with a couple of op-amps for signal conditioning. Another, though quite different hall-effect sensor is used to monitor the blade speed (basically the same as the bike speed sensors). The microcontroller collects this information and sends it approximately once per second to a server through a wifi router installed at the wind turbine site. The server logs all of this information in a MySQL database and displays it in pretty graphs. This project is also still in the prototype stages. A couple of weeks ago we installed it on Dan’s turbine, but we had to make a few tweaks last weekend to get it working. I think within a month or so we should have it pretty stable, considering the upcoming holiday break and the fact that it has been difficult for Dan and I to find time to work on the project. Below is a picture of our prototype. I appologize for the picture quality, I only had my cell phone on me at the time.

Finally, to end this rather long post, I have a couple projects of a much, much less technical nature. First, shown in the picture below, my room mate and I held a wine tasting as part of our Wines of the World class. We chose Australian wines as our theme since their wines are typically inexpensive and of relatively good quality (we are both still college students). Second, over Thanksgiving break I beat my favorite Super Nintendo game, NBA Jam Tournament Edition. I remember playing this game on my SNES when I was younger, but I was never able to beat the entire game. This is likely because I never had the patience to play more than a couple games at a time. Overall I think I spent just a few hours over the course of a week playing the game to beat it. An interesting trivia fact – the NBA Jam series was coded entirely in assembly.

Paper organization
First of all, especially if you’re just starting out, tools to help you organize your papers are invaluable. Use one! They can help you keep track of what you read and keep your papers and notes together in one place.
Writing
Presentations
Figures
Also, if you follow my blog, you have probably read about the wind-powered wifi repeater my friend Dan Lampie installed on campus at RIT last spring. RIT administration decided to take it down after the Imagine RIT festival, so he has been trying since the fall of this year to reinstall it in a better location. A few weeks before Christmas he finally got all of the permission he needed and I again helped him set it up. We probably couldn’t have picked a worse day to install the turbine (in the middle of a blizzard). However, it went quite well. About a week ago, disaster struck. Well, not really. The only stakes we were able to get were no more than about a foot in length. Due to the nasty weather conditions last week, one of the stakes was ripped out of the ground and the turbine fell over, snapping one of the blades as it fell to the ground. So, Dan asked RIT Facilities Management Services (FMS) to provide us with some better stakes. The stakes out there now are 6 feet long and, barring a hurricane/tornado, are not going anywhere. So, now that the wind turbine is up and running again, he has ordered a new omni-directional atenna, some bigger batteries, and a solar pannel so that the batteries will still charge on non-windy days. He has a bunch of great ideas on what to power with the turbine, so I am really looking forward to seeing what comes out of it. I’m also going to help him out with some monitoring circuitry (a microcontroller to monitor current/voltage/power). More information on his turbine is available on his website.
]]>
Great news! BarCamp Rochester 4 has confirmed the date of April 18, 2009. I registered two domain names (barcamproc.org and barcamprochester.org) and our website is up, running, and ready for attendees to sign up. So, if you or someone you know is going to be in the Rochester area, please sign up on our wiki. We’re also currently looking for sponsors. If you think your organization may be interested in helping us out, please drop me an email.
]]>First, install it
sudo apt-get install xbindkeys
Then, run the following in a console to grab input for a specific key press combination.
xbindkeys -mk
Select the window that pops up, type the key, and on the console you should see some output something like this:
"(Scheme function)"
m:0x10 + c:98
Mod2 + Up
Copy and paste that into your .xbindkeysrc and change “(Scheme function)” to “foo” where foo is the command you would like executed. Quit that, run xbindkeys, and whenever you type that key combination, foo will be executed.
So, a few months ago I bought a pair of 2.1 speakers for my computer. In the past I’ve only used headphones, so being able to lie in bed and watch movies/listen to music was very nice. However, I tend to work late into the night and my room mates don’t exactly appreciate my loud music. So, I still use headphones occasionally. The problem is I don’t want to have to unplug the speakers and plug them back in every time I want to use headphones. Luckily, my sound card has multiple line outs. So, a combination of amixer and xbindkeys allows me to simply hit a button on my keyboard to switch between the headphones and the speakers.
Here’s the snippet of my .xbindkeysrc that does this work:
# favorites button - toggle headphones/speakers
"amixer set Surround toggle; amixer set Front toggle"
m:0x10 + c:230
Mod2 + NoSymbol
]]>First, the most recently completed project – VLSI. For my project, my partner and I had to design and layout an 8-bit Brent-Kung adder with BIST using TSMC 0.35 micron N-Well process technology. What’s that? Well, an 8-bit adder is a device that adds two 8-bit numbers. Brent-Kung is a specific type of tree-adder (defining the way the circuit is organized) that is used as a basis for many other tree-adder networks as it attempts to minimize wiring tracks and fanout gate count. BIST stands for built-in self test, a mechanism that allows the circuit to test itself. The final area for the entire circuit (8-bit BK adder with BIST) was 28,757 square microns. Any one extra interested in this can read my final report. For fun, and to show how one goes about doing physical layout, here’s some pictures of our final layout. First, the adder with BIST. On the left is the adder/BIST on the I/O pad. On the right, the adder/BIST itself. For a closer view, just click on the image.
Next,the adder layout. Note: that space at the left top and bottom was on purpose: it’s for the DFF.
Next, everyone’s favorite ASCII art: the “I passed LVS check mark/smiley face.” For those not-so-familiar with VLSI/Mentor Graphics tools, LVS stand for layout versus schematic. That means it compares my wonderful layout (those colorful polygons seen above) versus my schematic to ensure the extracted netlists from both the layout and schematic match. The schematic is functionally verified to work correctly by simulating it. In theory, if the schematic works and the layout passes LVS, the circuit should work. However, post-layout simulations should be done as well.

When we finished the layout, we printed it to the 36″ plotter. Naturally, I hung my masterpiece on the wall above my bed.
The next project of interest: the heart rate monitor. The point of the project was to implement a complete automatic data acquisition system. (sensors, signal conditioning, analog-to-digital conversion, uController, and finally digital-to-analog conversion). The sensor for the system that we used was an opto-isolator. It works by emitting IR light through an LED that is then picked up by a photo transistor. So, for the heart rate sensor, a human finger rests on top of the opto-isolator that produces a varying voltage as a result of the blood flow through the finger. This signal is quite noisy and quite low in amplitude, so it was connected to an amplifier and low pass filter. Because the ATD we used requires 0 to 5V on the input, we added a final stage to level shift and amplify the signal to that range. This was then connected to the input of an HCS12 microcontroller programmed to calculate the heart rate and display it to a monitor via serial connection. If you’re interested, we made a poster displaying the schematics and a bit more detail on how the system works. You can take a look at that here. Here’s a picture of the final circuit and my beautiful finger.
And, just to prove it works, here’s the oscilloscope output.

The final project I’ve been working on is an implementation of a median filter on a FPGA. Median filters are used to remove salt and peppering effects from an image. The system interfaces an external memory chip to the FPGA and connects to a PC via a parallel port. A program from a computer sends the gray-scale PNG image to the FPGA. The FPGA then processes the image and sends it back to the PC. The project was done using VHDL and the FPGA was a Xilinx Spartan II. In addition, a histogram stretching algorithm was implemented on the FPGA. Histogram stretching is a form of contrast enhancement. Once the median filter was successfully implemented, the histogram stretching algorithm was quite easy. Unfortunately, there’s no pictures for this one. This was a long quarter, but now I get 2 weeks to relax and work on a couple of my independent projects before I dive back into the school work.
]]>
Option "TwinViewXineramaInfoOrder" "string"- When the NVIDIA X driver provides TwinViewXineramaInfo (see the NoTwinViewXineramaInfo X config option), it by default reports the currently enabled display devices in the order “CRT, DFP, TV”. The TwinViewXineramaInfoOrder X config option can be used to override this order.
The option string is a comma-separated list of display device names. The display device names can either be general (e.g, “CRT”, which identifies all CRTs), or specific (e.g., “CRT-1″, which identifies a particular CRT). Not all display devices need to be identified in the option string; display devices that are not listed will be implicitly appended to the end of the list, in their default order.
Note that TwinViewXineramaInfoOrder tracks all display devices that could possibly be connected to the GPU, not just the ones that are currently enabled. When reporting the Xinerama information, the NVIDIA X driver walks through the display devices in the order specified, only reporting enabled display devices.
Examples:
“DFP”
“TV, DFP”
“DFP-1, DFP-0, TV, CRT”In the first example, any enabled DFPs would be reported first (any enabled CRTs or TVs would be reported afterwards). In the second example, any enabled TVs would be reported first, then any enabled DFPs (any enabled CRTs would be reported last). In the last example, if DFP-1 were enabled, it would be reported first, then DFP-0, then any enabled TVs, and then any enabled CRTs; finally, any other enabled DFPs would be reported.
Default: “CRT, DFP, TV”
So, with that, it’s pretty easy to do. I set it to “DFP” and it now works great! For reference, here’s the device section of my /ect/X11/xorg.conf:
Section "Device"
Identifier "Configured Video Device"
Driver "nvidia"
BusID "PCI:1:0:0"
Option "RenderAccel"
Option "TwinView"
Option "TwinViewOrientation" "LeftOf"
Option "TwinViewXineramaInfoOrder" "DFP"
EndSection
]]>I finally actually looked into it. The fix is quite simple and painless. I had to configure mpd to use dmix (the alsa software mixer). All of the instructions are clearly laid out on the mpd wiki. Enjoy! (NOTE: For those unfamiliar with mpd it is music player daemon, my music player of choice. Check out their wiki for more information).
As an added bonus, I just learned RIT has a debian mirror: http://mirror.rit.edu! Thanks to the RITLUG, I can now fetch my upgrades much, much quicker.
]]>I wanted to be able to work on this project from home, so I went ahead and downloaded Xilinx ISE Webpack from http://www.xilinx.com. I run Linux (specifically Debian) as my primary OS, so I installed the Linux version of ISE. The install certainly could have gone smoother (it seems to be targeted more towards RedHat), but thanks to a bit of research I was able to get it running smoothly. Unfortunately, Digilent (the maker of the development board I’m using) only has a Windows version of their software for programming the FPGA. I thought I was out of luck and would have to develop on my machine and then use a Windows machine to actually program the FPGA. But, thanks to VMWare, that’s not a problem.
The only thing that I have really missed since I completely switched over to Linux about a year ago is Microsoft Office. Open Office just doesn’t do it for me 100% (especially given the amount of .doc and .docx files I get from professors here at RIT). So, I run VMWare Server with XP as a guest operating system to address that problem. This way, I don’t have to reboot to open a word document or write a paper. This is also useful as it allows me to run a bunch of other Windows-only applications without the any real hassle.
That’s definitely spiffy, but what’s even cooler is the ability to share physical hardware between the host and guest OS. I can map a USB controller to my guest OS that will give me the ability to use USB devices in my VM just as I would if I were running WIndows nativelly on the machine. Long story short – this nifty feature allows me to install Digilent’s programming software in Windows and program the FPGA without rebooting.
]]>