Commit e8300be2 authored by Matthieu Cattin's avatar Matthieu Cattin

test28: Optimise ddr clear, converts raw data to volts for every dma.

Instead of doing it at the end after all dma.
parent 1130a49f
......@@ -138,17 +138,36 @@ def volt2digital_without_offset(value, full_scale, nb_bit):
# Clear DDR memory (fill with zeros)
def clear_ddr(carrier, verbose=False):
if verbose:
print("Clearing DDR memory")
# dma item size = 4096 bytes
# max linked items = 128
# max linked items per page= 128
# 2**28/(4096*128) = 512
pattern = 0x0
carrier.set_irq_en_mask(0x1)
length = 2**27-(128*4096)
# Enable "DMA done" interrupt
carrier.set_irq_dma_done_mask(1)
#carrier.print_irq_controller_regs()
# Test number of dma transfer required (max dma size limitation of gnurabbit driver)
dma_required = int(math.ceil((MEMORY_SIZE<<3)/float(254*DMA_ITEM_SIZE*DMA_MAX_ITEMS)))
start_byte_addr = 0
if verbose:
print("Clearing DDR memory")
for i in range(512):
carrier.put_data(i*DMA_ITEM_SIZE*DMA_MAX_ITEMS, pattern, DMA_ITEM_SIZE*DMA_MAX_ITEMS)
print("%d DMA are required"%(dma_required))
data = []
for dma in range(dma_required):
if dma+1 == dma_required:
dma_length = (MEMORY_SIZE<<3) - (dma * DMA_ITEM_SIZE * DMA_MAX_ITEMS * 254)
else:
dma_length = DMA_ITEM_SIZE * DMA_MAX_ITEMS * 254
if verbose:
print("DMA #%d"%i)
print("DMA #%d: start: %d, end %d, length: %d"%(dma, start_byte_addr, start_byte_addr+dma_length, dma_length))
# Perform dma transfer
dma_data = carrier.clear_ddr(start_byte_addr, pattern, dma_length, False)
# Incerment dma start address
start_byte_addr += dma_length
# Disable "DMA done" interrupt
carrier.set_irq_dma_done_mask(0)
# Set AWG (sine wave)
def set_awg(awg, freq, ampl, offset, verbose=False):
......@@ -164,6 +183,7 @@ def set_awg(awg, freq, ampl, offset, verbose=False):
awg.play(sine)
awg.output = True
awg.sync = True
time.sleep(AWG_SET_SLEEP)
# Get best adc input range for a given amplitude
def get_best_input_range(in_ampl, term, verbose=False):
......@@ -229,7 +249,11 @@ def make_acq(fmc, verbose=False):
if verbose:
print("Starting acquisition...")
fmc.start_acq()
time.sleep(0.01)
# Random time before trigger
time_to_trig = rdm.randrange(1, 1000)/1000.0
if verbose:
print("Time between acquisition start and trigger: %fs"%(time_to_trig))
time.sleep(time_to_trig)
fmc.sw_trig()
# Wait end of acquisition
timeout = 0
......@@ -243,12 +267,11 @@ def make_acq(fmc, verbose=False):
print("Acquisition finished.")
# Make a linked list dma
def make_dma(carrier, start_byte_addr, length_bytes, verbose=False):
def make_dma(carrier, start_byte_addr, length_bytes, in_range, verbose=False):
# Enable "DMA done" interrupt
carrier.set_irq_dma_done_mask(1)
#carrier.print_irq_controller_regs()
# Test number of dma transfer required (max dma size limitation of gnurabbit driver)
# Perform data retrieve from DDR memory
dma_required = int(math.ceil(length_bytes/float(DMA_ITEM_SIZE*DMA_MAX_ITEMS)))
if verbose:
print("%d DMA are required"%(dma_required))
......@@ -258,9 +281,14 @@ def make_dma(carrier, start_byte_addr, length_bytes, verbose=False):
dma_length = length_bytes-(dma * DMA_ITEM_SIZE * DMA_MAX_ITEMS)
else:
dma_length = DMA_ITEM_SIZE * DMA_MAX_ITEMS
if verbose:
print("DMA #%d: start: %d, end %d, length: %d"%(dma, start_byte_addr, start_byte_addr+dma_length, dma_length))
data += carrier.get_data(start_byte_addr, dma_length)
#if verbose:
# print("DMA #%d: start: %d, end %d, length: %d"%(dma, start_byte_addr, start_byte_addr+dma_length, dma_length))
# Perform dma transfer
dma_data = carrier.get_data(start_byte_addr, dma_length)
# Converts raw data to volts
fs = RANGES[in_range]
data += [digital2volt(hex2signed(sample), fs, ADC_NBITS) for sample in dma_data]
# Incerment dma start address
start_byte_addr += dma_length
# Disable "DMA done" interrupt
carrier.set_irq_dma_done_mask(0)
......@@ -270,6 +298,11 @@ def make_dma(carrier, start_byte_addr, length_bytes, verbose=False):
# Get data from DDR memory
def get_acq_data(carrier, fmc, samples, pre_trig_samples, nb_shots, in_range, verbose=False):
#######################################
#pre_trig_samples += 100
samples += 1000
######################################
if nb_shots == 1:
#-----------------------------------------------------------------------
# Single shot case
......@@ -288,9 +321,9 @@ def get_acq_data(carrier, fmc, samples, pre_trig_samples, nb_shots, in_range, ve
start_pos = trig_pos - pre_trig_samples
if verbose:
print("Trigger position (samples) : 0x%8X %d" % (trig_pos,trig_pos))
print("Trigger position (samples) : %d" % (trig_pos))
print("Acqisition start position (samples): %d" % (start_pos))
print("Samples + start position (samples) : %d" % (start_pos+samples))
print("Total number of samples : %d" % (samples))
# Check if acquisition is overlapping ddr memory
if start_pos + samples > MEMORY_SIZE:
......@@ -301,20 +334,20 @@ def get_acq_data(carrier, fmc, samples, pre_trig_samples, nb_shots, in_range, ve
length = (MEMORY_SIZE - start_pos)<<3
if verbose:
print("DMA start: %d(bytes), length: %d(bytes)"%(start, length))
data = make_dma(carrier, start, length, True)
data = make_dma(carrier, start, length, in_range, True)
# Second dma from 0 to end acq address
start = 0
length = (sample - (MEMORY_SIZE - start_pos))<<3
length = (samples - (MEMORY_SIZE - start_pos))<<3
if verbose:
print("DMA start: %d(bytes), length: %d(bytes)"%(start, length))
data += make_dma(carrier, start, length, True)
data += make_dma(carrier, start, length, in_range, True)
else:
start = start_pos<<3
length = samples<<3
if verbose:
print("Acquisition is not overlapping")
print("DMA start: %d(bytes) %d, length: %d(bytes)"%(start, start%4, length))
data = make_dma(carrier, start, length, True)
data = make_dma(carrier, start, length, in_range, True)
else:
#-----------------------------------------------------------------------
# Single shot case
......@@ -322,10 +355,10 @@ def get_acq_data(carrier, fmc, samples, pre_trig_samples, nb_shots, in_range, ve
pass
# Converts raw data to signed
data = [hex2signed(item) for item in data]
#data = [hex2signed(item) for item in data]
# Converts signed data to volts
fs = RANGES[in_range]
data = [digital2volt(item, fs, ADC_NBITS) for item in data]
#fs = RANGES[in_range]
#data = [digital2volt(item, fs, ADC_NBITS) for item in data]
return data
......@@ -397,7 +430,7 @@ def main (default_directory='.'):
# Clear DDR
t1 = time.time()
#clear_ddr(carrier, False)
clear_ddr(carrier, True)
t2 = time.time()
print "elapsed time: %.2f seconds\n" % (t2-t1)
......@@ -442,13 +475,15 @@ def main (default_directory='.'):
acq_samples = rdm.randrange(acq_min_samples, MULTISHOT_MAX_SIZE+1)
acq_nb_shots = rdm.randrange(1, (MEMORY_SIZE/acq_samples)+1)
else:
acq_samples = rdm.randrange(acq_min_samples, MEMORY_SIZE+1)
#acq_samples = rdm.randrange(acq_min_samples, MEMORY_SIZE+1)
acq_samples = rdm.randrange(acq_min_samples, (MEMORY_SIZE/4)+1)
acq_nb_shots = 1
############################################################################
acq_samples = 50000
###########################################################################
print("Final number of samples: %d"%acq_samples)
#####################################
#acq_samples = 100000
#####################################
# Choose the trigger position randomly
acq_pre_trig_samples = rdm.randrange(0, acq_samples+1)
acq_post_trig_samples = acq_samples - acq_pre_trig_samples
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment