A virtual analog organ in a Spartan 3E FPGA in VHDL
(c) 2006 Jürgen Schuhmacher
Subject
This project intends to reveal my physical organ built first in 2001 with a Xilinx XC4000 PLD and analog environment. See the PLD organ page. All hardware was totally replaced by VHDL and moved to a current Spartan 3 FPGA. A virtual keyboard controller is established by adding a wave player module to obtain automatic song performance. The RAM holds around 3900 music events which are processed and mapped to the virtual keyboard, which provides 7 x 5 = 35 notes and thus covers all the white keys of 5 octaves altogether. The tuning is C-Major. 2 Organ registers are available. Both registers can be enhanced with an analog boost option to emulate the individual analog configuration of the sub modules. For more information about this strategy see the Virtual PLD organ page.
Hardware
Digilent Spartan 3E Starter Kit with Xilinx FPGA.
.
Block Diagram of the Organ FPGA
One main Organ Module drives 5 sub circuits. Here 5 channel groups are used and placed on a discrete stereo base. Find more information at the S3E Audio Page: PLD ORGAN V2001.
.
Logical Data Flow of the Spartan 3E organ
Usage
The 4 buttons and the 4 switches of the Digilent PCB are used to control the music player:
Button N : Increase Loudness
Button S : Decrease Loudness
Button W : Increase Speed
Button E : Decrease Speed
Switch 0 : Swap Stereo Channels of Organ Register 1
Switch 1 : Switch on / off the Organ Register 2
Switch 2 : AnalogBoostFilter of Organ Register 1
Switch 3 : AnalogBoostFilter of Organ Register 2
Rotary Knob / Push button : Restart the Song.
With the restart button, the source selector also progresses one step and the next option is applied: 4 options are available:
Keyboard 00: Song RAM 1
Keyboard 01: Song RAM with octave overlay
Keyboard 10: Generic Tones
Keyboard 01: Generic Chords
The octave overlay is done that way, that the keyboard is moved one octave and added to the originally keys pressed. This leads to a fuller sound but also suppresses some notes the same time. The song in the RAM provided in this version is called "mysong", similar to that version I once composed for a VC20 video game in 1981. Hard to believe that this is already 25 years ago :-)
Output
Since the Digilent PCB does not have an audio out, a dual PDM (pulse density modulation) module is used to generate a 1-Bit-Data Stream similar to audio-PCM. The frequency is 15 MHz like with the original PLD design. To be able to hear the sound, a RC-Filter has to be added to the two output PINs of the Digilent Port Pins. One can find them at the upper MOD-Connector. Use Pin "A4" for LEFT and Pin "B4" for RIGHT. The RC Filter should be made of R=470 Ohm and C= 10nF(ceramic) / 1uF(Tantal) in parallel.
A HIGH-Q Stereo PCM-to-Analog Conversion Circuit for best audio result. Use light blue oxygen free wires only :-)
Programfile
Download a bit file with an example song for Digilent Spartan 3SE FPGA board: spartan s3e organ.zipPlease note, that in this demo, only one RAM is available. See the included readme.txt file for details.
Listen to a snap shot of the original song here: enthusiasm.mp3
J.S. 2006