-
Notifications
You must be signed in to change notification settings - Fork 0
Pulse Blaster
The RFbuilder Pulse Blaster (taking its name from similar products produced by SpinCore and other companies) is a control unit designed for generating TTL pulse sequences and phase/frequency modulated sine wave outputs. It has 12 TTL output lines, each of which can be toggled at 250MHz. The Pulse Blaster also contains a Direct Digital Synthesizer (DDS) which outputs a sine wave that can be controlled using a frequency word, phase offset word and amplitude word.
Like many other Pulse Blasters, the RFBuilder Pulse Blaster is controlled using a custom assembly level program written by the user before operation, and then externally triggered either via software or via a hardware trigger line. Once the start line is pulled high, the Pulse Blaster will execute the program with deterministic timing, allowing for output consistency across multiple runs of the program. Writing of these programs is done via this Python Library, and detailed instruction on how to write programs are explained in the section below.
The following section assumes you have already read the Getting Started page of this wiki. Once you have a basic system set up, you can create an instance of PulseBlaster in your code
Hardware specs
- Internal clock frequency: 500MHz
- DAC sample Frequency: 8Gsps
- Bandwidth (up to -3dB point): 3GHz
- Number of TTL lines: 12
Hardware parameters There are a number of hardware parameters it is important to be aware of when operating the pulse blaster. While some of these are already handled in python, most are left to the user to navigate. A list of these are below
- Pulse Blaster to RF Data Convertor Latency: 32ns
- Pulse Blaster to DAC output latency: UNKNOWN
- Minimum delay resolution: 2ns
- Minimum time between instruction execution: 4ns
- Trigger Latency: 2-4ns (dependent on arrival time of external trigger signal)
- Start flag latency: 0-2ns (dependent on arrival time of external run signal)
Setting up the Pulse Blaster for operation will not be covered in detail here, as it is explained for the general case in the Getting Started section. Once the Pulse Blaster has been set up, writing instructions can begin.
Individual instructions are written to the Pulse Blaster using the add_instruction() method. The add_instruction() method is used to spesify all of the input fields for each instruction. The input fields are described below, in their order within the add_instruction() method
- Setting this to 0 lets the Pulse Blaster run as normal
- Setting this to 1 will prevent the frequency of the word changing for the DDS but will step the output over by the amount spesified in freqWord (described below). This allows for a global phase offset to be applied to the DDS output
- On a positive edge of this flag, the phase accumulator inside the DDS will be set back to 0
ampWord
- This field can take on an integer between 0 and (2^16)-1, with (2^16)-1 representing the maximum amplitude output from the DDS
phaseWord
- Used to set add a consistent phase offset to the output of the DDS. Can take a value between 0 and 360 (measured in degrees)
freqWord
- Used to set the frequency of the DDS, measured in MHz, can take a value from 0-4000
ttlStates
- A 12 bit binary integer, each bit coresponds to 1 of the 12 ttl output lines. Currently the lower 8 are routed to syzygy ports and the upper 4 bits to PMOD ports
dataField
- Used to provide the necessary data depending on the choice of opcode (detailed below)
opcode
- Can take on one of CONT, LONG_DELAY, LOOP, END_LOOP, BRANCH, JSR, RTS, WAIT, STOP
- Below lists what should be put in the data field depending on your chosen opcode
- CONT: Not applicable
- LONG_DELAY: Data field will multiply the value in the delayField (described below) allowing for instructions to have larger delays between them
- LOOP: The number of times you want the loop to repeat
- END_LOOP: The instruction number that the pulse blaster should jump to once the loop is complete (This should correspond to a LOOP instruction)
- JSR: The address to jump to
- RTS: Not applicable
- WAIT: Not applicable
- STOP: Not applicable
delayField
- How long, in nanoseconds, should the Pulse Blaster wait before executing the instruction AFTER the current instruction
add_instruction(phaseWord, opcode, freqWord)
-
phaseHopFlag[0 | 1]: Setting this flag high will prevent the frequency of the word changing for the DDS but will step the output over by the amount specified in freqWord (described below). This allows for a global phase offset to be applied to the DDS output -
opcode: testawdawd
Once you have finished writing the program, running RFBuilder.update() will upload the program. To then start the program, you can either pull the external RUN pin high (TODO: note relevent SYZGY port). Alternativly, you can use the PulseBlaster.pulse_pin("run") or PulseBlaster.set_pin("run",1) and PulseBlaster.set_pin("run",0) respectivly. For a full list of pins from the pulse blaster you can call PulseBlaster.get_pins() which returns a dictionary containing valid pin names and their current state.
- List
-
List
-
List
- List 2
- List 2
- List 3
Indent Block Test
Test outside
Note
TEst
[!DANGER] TEST
Caution
TEST
Important
TEST