This week, I worked on adding some more features to the VGA display, finishing the debugging for polyphony, and looking into a basic LFO implementation.
For the VGA display, I’m working on creating a live oscilloscope, that will be reactive to the current note + effects the user is utilizing. However, this is adding additional complexity to the VGA pipeline: since the oscilloscope operates based on buffers of audio data being captured, it causes the VGA output to be delayed by one clock cycle. Although the trigger point detection and actual audio capture can be hidden by the wait times for VGA sync, the actual readout of BRAM cannot. I also plan on adding something to show the current drum pattern.
The polyphony debugging ended up being much simpler than expected. The clock domain crossing I had previously accounted for (with the difference in clock speeds for the round robin-arbiter and actual audio generation) introduced a bug where the keypresses were not being detected properly. By removing this, the arbiter worked properly and 4-voice polyphony worked!
Finally, I began implementing a basic LFO. Since we already have the existing code for our actual audio generation, it was quite simple to port it over to the LFO. Fundamentally, we are still working with the same phase accumulators and shapes. The only difference is that the frequency is now much lower, and user controllable. I have not finished implementing this feature yet, but if it works well I can also see it being viable to have multiple. Our entire 4-voice audio generation logic was only utilizing 18% of logic and 2% of memory, meaning that should be able to be fine in terms of utilization.

