Arbitrary Waveform Generator

From MCEWiki

For running simple parameter ramps on the MCE using internal commanding, see Ramp Generator .

  • The Arbitrary Waveform Generator (AWG) permits users to configure a sequence of values which will be written at regular intervals to some MCE register. The AWG is an MCE firmware feature.
  • A RAM block has been allocated in the Clock Card FPGA to store arbitrary waveform values.
  • Commands have been implemented to read to and write from the RAM (awg_data, awg_addr).
  • A FSM has been implemented that can apply a set number of values (awg_sequence_length) from the RAM block to any internal register (ramp_card_addr, ramp_param_id, ramp_step_data_num) in the MCE at a certain rate (ramp_step_period).

Script-level support: mce_awg

The script mce_awg, in combination with mce_internal_ramp, may be used to control the AWG features of the MCE.

  • mce_awg is used to load the AWG data into CC RAM, and to start and stop the AWG loop.
  • mce_internal_ramp is used to set the timing parameters and the target register for the AWG loop.

Example

The following commands will load a triangle wave into a 400 sample buffer, and try to run it with 50 Hz updating (so an 1/8 Hz repeat frequency) on tes bias[0]:

mce_awg stop
mce_internal_ramp setup --target tes bias --count=1 --range 0 0 1 --step-frequency=50.
mce_awg setup --triangle 8000 100 --count 400
mce_awg start

Disabling the AWG loop

To disable the AWG, run either of

mce_awg stop
mce_internal_ramp stop

Setting timing parameters and target register

The timing parameters and target register are set using mce_internal_ramp. See mce_internal_ramp, or run mce_internal_ramp -h for more details.

mce_internal_ramp --stage=sa_bias --count=8 --offset 8 --step-frequency 100  --range 0 0 1  setup

Note that the --range option is a dummy parameter here, as it is our intention to run an AWG loop, not an internal ramp.

Loading a waveform

The waveform may be taken from an ascii file, read from stdin, or generated automatically. Examples:

From a file:

mce_awg setup --filename my_weird_wave.txt 

From stdin:

cat my_weird_wave.txt | mce_awg setup --stdin

(For multi-column ascii data, from either a file or stdin, pass --column=<int> to specify the source column. In both cases, blank lines and lines beginning with a # are ignored.)

A sine wave with a period of 400 steps, amplitude 1000 and offset 20000

mce_awg setup --sine 20000 1000 --count 400

A triangle wave with a period of 8192 (max, default), from 1500 to 2500 and back again:

mce_awg setup --triangle 2000 500

Starting the AWG loop

mce_awg start


Targeting TES and heater biases with mod_val

Low-Level MCE Parameters for AWG

If you are writing your own script, the following MCE parameters need to be set:

Example:

wb cc ramp_step_period 10    
wb cc ramp_param_id 153      //LED, for example
wb cc ramp_card_addr 2       //Clock Card, for example
wb cc ramp_step_data_num 1
wb cc awg_sequence_length 8192  //Currently the maximum size of the AWG RAM block

wb cc internal_cmd_mode 0    //Disable internal AWG commands BEFORE writing the data!!!
wb cc awg_addr 0             //Set the AWG RAM address to zero before writing new values
wb cc awg_data 1 2 1 2 ...   //Write AWG values
wb cc awg_data 1 2 1 2 ...   //Write more AWG values, appended to the end of the first set of values
...
wb cc awg_data 1 2 1 2 ...   //Write the last few AWG values, which must number as many as specified by awg_sequence_length above

wb cc awg_addr 0             //Set the AWG RAM address to zero before reading values
rb cc awg_data               //Read AWG values
rb cc awg_data   
...
rb cc awg_data

wb cc awg_addr 0             //Set the AWG RAM address to zero before changing the internal command mode
wb cc internal_cmd_mode 3    //Enable internal AWG commands AFTER writing the data!!!

wb cc data_rate 10
acq_config awg_test rcs
acq_go 1000
  • Note 1: The awg_addr register and awg_data are readable when internal-commanding is turned off.
  • Note 2: You need to set awg_addr to 0 to read the awg_data sequence in full.