In [1]:
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
x = np.arange(0, 101)
def tri(x):
res = x % 50
if res < 25:
return res
else:
return 50 - res
plt.plot(x, list(map(tri, x)))
Out[1]:
In [ ]:
import magma as m
m.set_mantle_target("ice40")
from loam.boards.icestick import IceStick
N = 8
icestick = IceStick()
# TODO: Configure Parts (Clock and GPIO)
In [ ]:
import mantle
main = icestick.main()
# TODO: Define main
m.EndDefine()
In [ ]:
m.compile('build/triangle', main)
In [ ]:
%%bash
cd build
cat triangle.pcf
yosys -q -p 'synth_ice40 -top main -blif triangle.blif' triangle.v
arachne-pnr -q -d 1k -o triangle.txt -p triangle.pcf triangle.blif
icepack triangle.txt triangle.bin
iceprog triangle.bin
We can wire up the GPIO pins to a logic analyzer to verify that our circuit produces the correct triangle waveform.
We can use Saleae's export data feature to output a csv file and load this data into Python to plot the results. Here we provide an example .csv, replace it with yours to check that the output you're producing is correct.
In [2]:
import csv
import magma as m
with open("data/triangle-capture.csv") as triangle_capture_csv:
csv_reader = csv.reader(triangle_capture_csv)
next(csv_reader, None) # skip the headers
rows = [row for row in csv_reader]
timestamps = [float(row[0]) for row in rows]
values = [m.bitutils.seq2int(tuple(int(x) for x in row[1:])) for row in rows]
In [5]:
import matplotlib.pyplot as plt
plt.plot(timestamps[:1000], values[:1000], ".")
Out[5]: