ZYNQ 7000 : AXI4-Lite based MMCM dynamic configuration

Start my hardware project on Xilinx ZYNQ 7000 MPSoC device!

I have got a Z-turn board (designed by Myir Technology) equipped with XC7Z020 SoC chip.

To briefly introduce the ZYNQ devices, we can define it as a combination of FPGA and a dual-core ARM Cortex-A9 processor(also called hard core compared to soft core like MicroBlaze) with on-chip programmable interconnection. The internal connection make the data transfer easier and faster than the previous scheme that place an external ARM processor near a FPGA chip. In the ZYNQ scheme, they call the ARM part Processing System(PS), and the FPGA part Processing Logic(PL). Many convenient implementation of AXI4 bus is provided by Xilinx as IP cores. With the block design function in Vivado, we can quickly integrate our IP cores into the system. Also thanks to the powerful ARM core, we can run Linux operating systems on the PS and directly control all the hardware implementation on the PL.

In Xilinx devices, the clock can be generated by a module called Mixed-Mode Clock Manager(MMCM), which includes a PLL. This module have fractional multiplier and divider thus is quite versatile to meet any need for digital clock generation. Another good thing is that it can be dynamically reconfigured through a set of registers.

The MCMM_DRP is connected to the PS GP0 port through an AXI-interconnection module. I have allocated a small 4KB virtual space for the registers starting at 0x40000000(which is right after my 1GB DDR3 RAM). Because of the limited bandwidth of my Mini-DSO, I have put a 1/4096 clock divider at the output.

In the Linux side, I have two choices to make modifications on registers. The first way is to write a kernel driver that well handles the requests from user space and do the reconfiguration on registers. However, this is not so easy to implement. The another way is to use mmap to map the registers to a virtual address and modify that. This way is easy and can be done in the user space(root privilege is required, though), but not safe. As a simple test and our ‘Hello world!’ project to ZYNQ, I chose the second plan.


Digital Temperature Control

Temperature control again 🙂

We have been customed to fully analog controlled temperature controllers like those made by Toptica in the past. The parameters(proportion, integral time, etc) of those controllers should be adjusted with the assist of an oscilloscope. You cannot use those experience formula because you cannot set a multi-turn potentiometer to 1/2.2 value. And if you don’t have an expensive monitor module, you don’t even know the temperature set point! How can these modules be used in an experiment?

In order to address this problem, I decide to make this digital version temperature controller.

Here is the photo of my final controller.


This temperature controller is designed to be compatible with three kinds of common temperature sensors – NTC sensor, PT100 RTD sensor, Thermocouple. With this powerful design, the controller can manage temperature from as low  as several kelvin to a thousand degree celsius.

Three analog frond ends provide adequate working condition for the sensors as well as amplify the signal and scale them to fit into ADC’s input range.

The ADC in this project is AD7793, a low cost two channels (if you use external reference as I did) 24bit delta-sigma ADC, connected to the main processor through high speed SPI protocol. The ADC is running on a 64kHz clock generated by main processor’s timer. The main processor’s PID calculation and output refresh is synchronized by the ADC’s ready signal.

Digital PID for temperature is never a tricky problem for those high speed micro controllers. I even use double precision float type for all variables and the controller still works great. 72MHz/90DMIPS is a monster for the tiny task!

The DAC is AD5689, a two channels 16bit DAC, is definitely sufficient to drive any TEC or heater. A instrumental amplifier shift the middle level to zero voltage and drive a push-pull output stage with feedback to provide a maximum of 25W power.

The output is monitored all the time, you can check the output voltage, output current, output power as needed. Warning functions such as sensor fault, output short circuit, output over current, output open circuit, can be easily implemented in this hardware design.

Based on my OLED driver and graphic library written years ago, I can quickly developed the firmware for this controller with gorgeous OLED display and fancy user interface.


The interaction can be done through a couple of buttons and a rotatory encoder, which definitely provide a smooth user experience.

I have tested this controller under many circumstance, vacuum chamber, ECDL housing for example. With proper heat insulation  design and careful PID adjustment, <1mK temperature stability can be easily achieved with NTC sensor near room temperature.

This controller has been successfully deployed into my ECDL project, and helped a great deal pushing a 690nm laser diode for a 698nm output, which will be used in Sr experiment in the future.

Digital Precision Current Source for Laser Diode


A precision current source is important for laser diode in ECDL configuration. Extra current noise may cause bad line width performance. Some AR-coated laser diodes used in ECDL are also expensive and need proper protection circuit to ensure safety.

This is a digital controlled precision current source, with extremely low current drift, very low current noise, a user friendly interface, I2C bus control, hardware protection. I will discuss several key point in this design.



The core of this current source is similar to the Hall design. However, some improvements are added to the circuit to increase stability , drift performance and noise performance.

An AVR microcontroller takes over all the digital works. I also implement a very considerable idea in this current source to avoid ANY digital clock noise. I programmed the microcontroller that it will automatically turn off its oscillator (aka digital clock) after a period of time with no user interruption. When user turn the rotatory knob, the system will quickly recover its clock and handle the interruption without noticeable delay. This mechanism works really well that no any sign of digital noise can be seen in the current spectrum near clock frequency(16MHz in our system).


If you want a low drift instrument, a low drift standard is the most important components. Here I choose the famous LM399H (from Linear Technology) as my main voltage standard. Its data sheet declaims that it can achieve temperature drift down to 0.5ppm/C. As for DAC, the LTC2756A becomes a economic and high performance choice with 18bit resolution and low temperature drift. Unlike digital current source design (Erickson) which rise the ground of a DAC to arbitrary level, I decide to use ordinary analog subtractor to subtract the DAC output from the input value. There are several considerations. LTC2756A together with its I-V converter is not as low-power designed as some nanoDACs, the floating ground provided by ordinary operational amplifier may not be sufficiently low resistance. And the ground level shift amplifier also brings in ground noise non-uniformly distributed in frequency domain and all kinds of drift.


Not like those high power multi-mode laser diodes, low power single-mode laser diodes are fragile, any surge current kills them. I designed a signal in the circuit to control two relays. These two relays will short the diode and the current source whenever current limit or voltage limit reaches. To avoid the EMI from the relay, a RC damping circuit is introduced.  The error signal simultaneously cuts off main supply and asynchronously clear the DAC (only propagation delay). The protection circuit also lock the system for several seconds to ensure that all the capacitors are  discharged to safe level before reset button is activated.

The protection functions mentioned above are all hardware level protection. I also implement software level protection in microcontroller. Usually when you are doing experiment, the microcontroller runs perfectly and software protection plays a role. The microcontroller will just refuse any action of adding current beyond maximum current. The maximum current is also programmable in software.

User Interface

Fancy OLED display just as the one used in the digital temperature controller.

Adjust resolution is down to 10uA with very good repeatability.


Stepper Motor Controller for Scanning Raman Spectrometer

We have a fairly old Raman spectrometer (from 1980s) in modern physics laboratory. The model is SPEX1403 with spectral resolution 0.15cm^-1. This is not a modern CCD spectrometer which just readout all the pixels to get the spectrum in a second. This spectrometer need to rely on a stepper motor moving gratings scanning across the desirable spectrum range.

IMG_4216 4
SPEX1403 Spectrometer


However, the controller of this spectrometer is too old and finally fails. Thanks to the carefully protection and maintenance of professors, the optical and mechanical parts of the spectrometer are still working smoothly. Instead of throwing it away, I decided to design a new generation of controller to give it a second life.

IMG_4222 3
Specontrol for SPEX1403/4

I choose STM32 as the microcontroller, using USB CDC (AKA: Virtual COM Port, VCP) as the communication interface. The system is really simple and mostly bases on a piece of cheap STM32F3-Discovery board.

I also rewrite the LabVIEW driver for this homemade controller.

IMG_4223 3
Experiment Setup

Digital PID TEC temperature controller for DPSSL+SHG experiment

This is a very simple and low cost TEC PID controller. Here is a simple schematic of it.


The controller is based on Arduino (AVR ATMega series 8bit MCU), so I haven’t spend a lot time programming it. The temperature sensor is a very cheap 10K thermistor and direct sampled by AVR’s internal ADC. The DAC part is actually a low-pass filtered PWM. The controller is connected to the computer through a USB-USART adapter.

A photo of the TEC controller is shown below. I use the power stage from my 3A CC driver in the same project as you can see from the photoTEC_controller_photo


I design a simple serial command line interface for system monitoring and parameter adjustment. You can simply type ‘P10’ and press enter to set parameter P to 10 for PID controller. It is same for other command such as ‘I0.5’ for setting I=0.5, ‘D1.24’ for setting D=1.24. The power stage can be turned off with command ‘OFF’ and be turned on again with ‘ON’. system states including output power, target temperature, PID parameters will be continuously updated on the serial interface.