Skip to content

Commit 26648fb

Browse files
committed
add a max7219 based seven segment display for showing calculated pixels and core status
1 parent 6e0d116 commit 26648fb

File tree

3 files changed

+28
-7
lines changed

3 files changed

+28
-7
lines changed

gateware/arrow_deca.py

+2
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ class ArrowDECAPlatform(IntelPlatform, LUNAPlatform):
9494
pins="J21 J22",
9595
attrs=Attrs(io_standard="1.5 V")),
9696

97+
SPIResource(0, clk="P_9:11", copi="P_9:13", cipo=None, cs_n="P_9:15", attrs=Attrs(io_standard="3.3-V LVCMOS")),
98+
9799
Resource("clk60", 0, Pins("H11", dir="i"), Clock(60e6), Attrs(io_standard="1.2 V")),
98100
Resource("usb", 0, Subsignal("fault", Pins("D8", dir="i", invert=True), Attrs(io_standard="1.2 V")),
99101
Subsignal("cs", Pins("J11", dir="o", invert=False), Attrs(io_standard="1.8 V"))),

gateware/deca_mandelbrot.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from nmigen_library.debug.ila import StreamILA, ILACoreParameters
1111
from nmigen_library.stream import connect_stream_to_fifo, connect_fifo_to_stream
12+
from nmigen_library.io.max7219 import SerialLEDArray, NumberToSevenSegmentHex
1213

1314
from luna import top_level_cli
1415
from luna.usb2 import USBDevice, USBStreamInEndpoint, USBStreamOutEndpoint
@@ -76,7 +77,7 @@ def elaborate(self, platform):
7677

7778
# Generate our domain clocks/resets.
7879
m.submodules.car = platform.clock_domain_generator()
79-
# Create our USB-to-serial converter.
80+
8081
ulpi = platform.request(platform.default_usb_connection)
8182
m.submodules.usb = usb = USBDevice(bus=ulpi)
8283

@@ -178,11 +179,22 @@ def elaborate(self, platform):
178179
leds[0].eq(usb.rx_activity_led),
179180
leds[1].eq(usb.tx_activity_led),
180181
leds[2].eq(usb.suspended),
181-
Cat(leds[3:6]).eq(fractalmanager.busy),
182+
Cat(leds[3:6]).eq(fractalmanager.busy_out),
182183
leds[6].eq(result_fifo.r_en),
183184
leds[7].eq(result_fifo.r_rdy),
184185
]
185186

187+
spi = platform.request("spi")
188+
m.submodules.sevensegment = sevensegment = NumberToSevenSegmentHex(width=32)
189+
m.submodules.led_display = led_display= SerialLEDArray(divisor=8, init_delay=16e6)
190+
m.d.comb += [
191+
sevensegment.number_in.eq((fractalmanager.result_x_out << 16) | fractalmanager.result_y_out),
192+
sevensegment.dots_in.eq(fractalmanager.busy_out),
193+
*led_display.connect_to_resource(spi),
194+
Cat(led_display.digits_in).eq(sevensegment.seven_segment_out),
195+
led_display.valid_in.eq(1),
196+
]
197+
186198
return m
187199

188200
if __name__ == "__main__":

gateware/fractalmanager.py

+12-5
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ def __init__(self, *, bitwidth, fraction_bits, no_cores, test=False):
1919
# I/O
2020
self.command_stream_in = StreamInterface(name="command_stream")
2121
self.pixel_stream_out = StreamInterface(name="pixel_stream")
22-
self.busy = Signal(no_cores)
22+
self.busy_out = Signal(no_cores)
23+
24+
self.result_x_out = Signal(16)
25+
self.result_y_out = Signal(16)
2326

2427
def elaborate(self, platform: Platform) -> Module:
2528
m = Module()
@@ -103,10 +106,10 @@ def elaborate(self, platform: Platform) -> Module:
103106
start = Array([Signal( name=f"start_{n}") for n in range(no_cores)])
104107
xs = Array([Signal(signed(bitwidth), name=f"x_{n}") for n in range(no_cores)])
105108
ys = Array([Signal(signed(bitwidth), name=f"y_{n}") for n in range(no_cores)])
106-
pixel_x = Array([Signal(signed(bitwidth), name=f"pixelx_{n}") for n in range(no_cores)])
107-
pixel_y = Array([Signal(signed(bitwidth), name=f"pixely_{n}") for n in range(no_cores)])
109+
pixel_x = Array([Signal(signed(bitwidth), name=f"pixelx_{n}") for n in range(no_cores)])
110+
pixel_y = Array([Signal(signed(bitwidth), name=f"pixely_{n}") for n in range(no_cores)])
108111

109-
m.d.comb += self.busy.eq(~Cat(idle))
112+
m.d.comb += self.busy_out.eq(~Cat(idle))
110113

111114
# result collector signals
112115
done = Array([Signal( name=f"done_{n}") for n in range(no_cores)])
@@ -210,14 +213,18 @@ def elaborate(self, platform: Platform) -> Module:
210213

211214
pixel_out = self.pixel_stream_out
212215
result_iterations = Signal(32)
213-
result_color = Signal(24)
214216
result_pixel_x = Signal(16)
215217
result_pixel_y = Signal(16)
216218
result_escape = Signal()
217219
result_maxed = Signal()
218220
send_byte = Signal(8)
219221
first_result_sent = Signal()
220222

223+
m.d.comb += [
224+
self.result_x_out.eq(result_pixel_x),
225+
self.result_y_out.eq(result_pixel_y),
226+
]
227+
221228
# result collector FSM
222229
with m.FSM(name="result_collector") as fsm:
223230
with m.State("WAIT"):

0 commit comments

Comments
 (0)