add running the logic analyzer to the python API

This commit is contained in:
Fischer Moseley 2023-04-14 19:06:23 -04:00
parent 7bec8b15c8
commit 1c74d4a714
2 changed files with 64 additions and 21 deletions

View File

@ -1,23 +1,4 @@
from manta import Manta
m = Manta('manta.yaml')
# setup trigger to trigger when moe = 1:
m.my_logic_analyzer.interface.write_register(0, 0) # set state to IDLE
m.my_logic_analyzer.interface.write_register(6, 8) # set operation to eq
m.my_logic_analyzer.interface.write_register(7, 1) # set argument to 1
# read that back
print(m.my_logic_analyzer.interface.read_register(0))
print(m.my_logic_analyzer.interface.read_register(6))
print(m.my_logic_analyzer.interface.read_register(7))
# start the capture
m.my_logic_analyzer.interface.write_register(0, 1) # set state to START_CAPTURE
print(m.my_logic_analyzer.interface.read_register(0))
# display sample data
for i in range(m.my_logic_analyzer.sample_depth):
data = m.my_logic_analyzer.interface.read_register(i)
print(f"addr: {i} data: {data}")
print(m.my_logic_analyzer.run())

View File

@ -438,6 +438,21 @@ class LogicAnalyzerCore:
self.block_memory_base_addr = self.trigger_block_base_addr + (2*len(self.probes))
self.max_addr = self.block_memory_base_addr + (n_brams * self.sample_depth)
# build out self register map:
# these are also defined in logic_analyzer_fsm_registers.v, and should match
self.state_reg_addr = self.base_addr
self.trigger_loc_reg_addr = self.base_addr + 1
self.current_loc_reg_addr = self.base_addr + 2
self.request_start_reg_addr = self.base_addr + 3
self.request_stop_reg_addr = self.base_addr + 4
self.read_pointer_reg_addr = self.base_addr + 5
self.IDLE = 0
self.MOVE_TO_POSITION = 1
self.IN_POSITION = 2
self.CAPTURING = 3
self.CAPTURED = 4
def hdl_inst(self):
la_inst = VerilogManipulator("logic_analyzer_inst_tmpl.v")
@ -566,8 +581,55 @@ class LogicAnalyzerCore:
return ports
#return VerilogManipulator().net_dec(self.probes, "input wire")
# functions for actually using the core:
def run(self):
pass
# Check state - if it's in anything other than IDLE,
# request to stop the existing capture
print(" -> Resetting core...")
state = self.interface.read_register(self.state_reg_addr)
if state != self.IDLE:
self.interface.write_register(self.request_stop_reg_addr, 0)
self.interface.write_register(self.request_stop_reg_addr, 1)
state = self.interface.read_register(self.state_reg_addr)
assert state == self.IDLE, "Logic analyzer did not reset to correct state when requested to."
# Configure trigger settings and positions - highkey don't really know how we're going to do this
# for now, let's just trigger on a changing value of the first probe
print(" -> Configuring triggers...")
self.interface.write_register(self.trigger_block_base_addr, 3)
trigger_setting = self.interface.read_register(self.trigger_block_base_addr)
assert trigger_setting == 3, "Trigger did not save the value written to it."
# Configure the trigger_pos, but we'll skip that for now
print(" -> Setting trigger location...")
# Start the capture by pulsing request_start
print(" -> Starting capture...")
self.interface.write_register(self.request_start_reg_addr, 1)
self.interface.write_register(self.request_start_reg_addr, 0)
# Wait for core to finish capturing data
print(" -> Waiting for capture to complete...")
state = self.interface.read_register(self.state_reg_addr)
while(state != self.CAPTURED):
state = self.interface.read_register(self.state_reg_addr)
# Read out contents from memory
print(" -> Reading sample memory contents...")
block_mem_contents = []
for i in range(self.block_memory_base_addr, self.max_addr):
block_mem_contents.append(self.interface.read_register(i))
# Revolve BRAM contents around so the data pointed to by the read_pointer
# is at the beginning
print(" -> Reading read_pointer and revolving memory...")
read_pointer = self.interface.read_register(self.read_pointer_reg_addr)
return block_mem_contents[read_pointer:] + block_mem_contents[:read_pointer]
def part_select(self, data, width):
top, bottom = width