428 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			428 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!doctype html>
 | 
						||
<html>
 | 
						||
 | 
						||
<head>
 | 
						||
	<meta charset="utf-8">
 | 
						||
 | 
						||
	<title>Fomu: An FPGA in your USB Port</title>
 | 
						||
 | 
						||
	<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
 | 
						||
	<meta name="author" content="Sean "xobs" Cross">
 | 
						||
 | 
						||
	<meta name="apple-mobile-web-app-capable" content="yes">
 | 
						||
	<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
 | 
						||
 | 
						||
	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
 | 
						||
 | 
						||
	<link rel="stylesheet" href="css/reveal.css">
 | 
						||
	<link rel="stylesheet" href="css/theme/solarized.css" id="theme">
 | 
						||
 | 
						||
	<!-- Theme used for syntax highlighting of code -->
 | 
						||
	<link rel="stylesheet" href="lib/css/zenburn.css">
 | 
						||
 | 
						||
	<!-- Printing and PDF exports -->
 | 
						||
	<script>
 | 
						||
		var link = document.createElement('link');
 | 
						||
		link.rel = 'stylesheet';
 | 
						||
		link.type = 'text/css';
 | 
						||
		link.href = window.location.search.match(/print-pdf/gi) ? 'css/print/pdf.css' : 'css/print/paper.css';
 | 
						||
		document.getElementsByTagName('head')[0].appendChild(link);
 | 
						||
	</script>
 | 
						||
 | 
						||
	<!--[if lt IE 9]>
 | 
						||
		<script src="lib/js/html5shiv.js"></script>
 | 
						||
		<![endif]-->
 | 
						||
 | 
						||
	<style>
 | 
						||
		/*********************************************
 | 
						||
			* ZOOM REVERSE TRANSITION (i.e. zoom out)
 | 
						||
			*********************************************/
 | 
						||
			.reveal .slides section[data-transition=zoomrev],
 | 
						||
			.reveal.zoomrev .slides section:not([data-transition]) {
 | 
						||
				transition-timing-function: ease;
 | 
						||
			}
 | 
						||
 | 
						||
			.reveal .slides > section[data-transition=zoomrev].past,
 | 
						||
			.reveal .slides > section[data-transition~=zoomrev-out].past,
 | 
						||
			.reveal.zoomrev .slides > section:not([data-transition]).past {
 | 
						||
				       visibility: hidden;
 | 
						||
				-webkit-transform: scale(0.2);
 | 
						||
						transform: scale(0.2);
 | 
						||
			}
 | 
						||
 | 
						||
			.reveal .slides > section[data-transition=zoomrev].future,
 | 
						||
			.reveal .slides > section[data-transition~=zoomrev-in].future,
 | 
						||
			.reveal.zoomrev .slides > section:not([data-transition]).future {
 | 
						||
					   visibility: hidden;
 | 
						||
				-webkit-transform: scale(16);
 | 
						||
						transform: scale(16);
 | 
						||
			}
 | 
						||
 | 
						||
			.reveal .slides > section > section[data-transition=zoomrev].past,
 | 
						||
			.reveal .slides > section > section[data-transition~=zoomrev-out].past,
 | 
						||
			.reveal.zoomrev .slides > section > section:not([data-transition]).past {
 | 
						||
				-webkit-transform: translate(0, 150%);
 | 
						||
						transform: translate(0, 150%);
 | 
						||
			}
 | 
						||
 | 
						||
			.reveal .slides > section > section[data-transition=zoomrev].future,
 | 
						||
			.reveal .slides > section > section[data-transition~=zoomrev-in].future,
 | 
						||
			.reveal.zoomrev .slides > section > section:not([data-transition]).future {
 | 
						||
				-webkit-transform: translate(0, -150%);
 | 
						||
						transform: translate(0, -150%);
 | 
						||
			}
 | 
						||
		</style>
 | 
						||
 | 
						||
</head>
 | 
						||
 | 
						||
<body>
 | 
						||
 | 
						||
	<!-- Start of main presentation -->
 | 
						||
	<div class="reveal">
 | 
						||
		<div class="footer">
 | 
						||
			<a class="url" href="https://p.xobs.io/td19/">p.xobs.io/td19</a>
 | 
						||
			<span class="theme">Teardown 2019</span><span class="hashtag"> | #teardown2019</span><span class="twitter"> |
 | 
						||
				@teardown</span>
 | 
						||
		</div>
 | 
						||
		<div class="slides">
 | 
						||
			<section>
 | 
						||
				<h2>Fomu: an FPGA in your USB Port</h2>
 | 
						||
				<img src="img/tomu-fomu-case-superwide.jpg">
 | 
						||
				<p>
 | 
						||
					Fomu (with case): an FPGA in your USB port. Crowdfunding now! One week to go. <a href="https://t.xobs.io/fomu">t.xobs.io/fomu</a>
 | 
						||
				</p>
 | 
						||
			</section>
 | 
						||
 | 
						||
			<section data-background-image="css/theme/lca2019-title-bg-transparent.svg">
 | 
						||
				<h1>Fomu: An FPGA in your USB Port</h1>
 | 
						||
				<h4>A whirlwind introduction to Fomu and FPGAs</h4>
 | 
						||
				<p align="right">
 | 
						||
					<small>Sean Cross - <a href="https://xobs.io/">https://xobs.io/</a> - @xobs</small>
 | 
						||
				</p>
 | 
						||
			</section>
 | 
						||
 | 
						||
			<section>
 | 
						||
				<h3>Outline</h3>
 | 
						||
				<ol>
 | 
						||
					<li>Fomu Firmware Layout</li>
 | 
						||
					<li>
 | 
						||
						<ol>
 | 
						||
							<li>Bootloader</li>
 | 
						||
							<li>Recovery</li>
 | 
						||
							<li>Magic constants</li>
 | 
						||
							<li>Interpreters</li>
 | 
						||
							<li>Updates</li>
 | 
						||
						</ol>
 | 
						||
					</li>
 | 
						||
					<li>Loading firmware onto Fomu</li>
 | 
						||
					<li>Blinkenlights</li>
 | 
						||
				</ol>
 | 
						||
			</section>
 | 
						||
 | 
						||
			<section>
 | 
						||
				<h2>Workshop Outline</h2>
 | 
						||
				<ol>
 | 
						||
					<li>What do I need to get started?</li>
 | 
						||
					<li>What is Fomu, and what is an FPGA?</li>
 | 
						||
					<li>What can I do with Fomu?</li>
 | 
						||
					<li>What makes Fomu special?</li>
 | 
						||
				</ol>
 | 
						||
			</section>
 | 
						||
 | 
						||
			<section>
 | 
						||
				<section>
 | 
						||
					<h2>What do I need to get started?</h2>
 | 
						||
					<ol>
 | 
						||
						<li>Synthesis</li>
 | 
						||
						<li>Place-and-Route</li>
 | 
						||
						<li>Packer</li>
 | 
						||
					</ol>
 | 
						||
				</section>
 | 
						||
			</section>
 | 
						||
 | 
						||
			<section>
 | 
						||
				<section>
 | 
						||
					<h2>What is an FPGA?</h2>
 | 
						||
					<p>
 | 
						||
						An FPGA is like a hardware emulator.  It can change itself so that it can take on the characteristics of any other digital logic.
 | 
						||
					</p>
 | 
						||
					<p>
 | 
						||
						FPGAs are measured in resources called LUTs or LCs.
 | 
						||
					</p>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>What is Fomu?</h2>
 | 
						||
					<p>
 | 
						||
						Fomu is an FPGA that fits in your USB port.  It has foru buttons, 2 MB of SPI flash, an RGB LED, and an ICE40UP5K with 5280 LCs.  It also has 128 kB of dedicated RAM, not counting the block RAM.
 | 
						||
 | 
						||
						Unlike many other PCBs, Fomu does not have a separate USB controller chip.  This means that any projects that want to use the USB port must include a USB softcore.
 | 
						||
					</p>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Fomu Block Design Diagram</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>ICE40 Features</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>What is this PCB?</h2>
 | 
						||
					<p>
 | 
						||
						This is Fomu EVT1.  This is the original stretch prototype of Fomu.  The schematics are the same, but much has changed:
 | 
						||
 | 
						||
						* Name changed from Tomu-FPGA to Fomu
 | 
						||
						* Package changed from SG48 to WLCSP32
 | 
						||
						
 | 
						||
						Additionally, some patches were needed to get this PCB working:
 | 
						||
 | 
						||
						* SO-8 for SPI flash was too small
 | 
						||
						* Crystal footprint was upside-down
 | 
						||
 | 
						||
						These are yours to take home with you!
 | 
						||
 | 
						||
						Differences between EVT1 and EVT3:
 | 
						||
 | 
						||
						* Silkscreen on Raspberry Pi header
 | 
						||
						* Populate Raspberry Pi header
 | 
						||
						* Add PMOD pins to touchpads
 | 
						||
						* Swap PMODa pins for I3C
 | 
						||
					</p>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>What modifications does it have?</h2>
 | 
						||
					<ul>
 | 
						||
						<li>Shorting out two zero-ohm resistors</li>
 | 
						||
						<li>Programming SPI flash</li>
 | 
						||
						<li>Bending SPI flash pins inward</li>
 | 
						||
						<li>Mounting crystal on its side</li>
 | 
						||
						<li>Attaching power to crystal</li>
 | 
						||
					</ul>
 | 
						||
				</section>
 | 
						||
			</section>
 | 
						||
 | 
						||
			<section>
 | 
						||
				<section>
 | 
						||
					<h2>Working with Fomu</h2>
 | 
						||
				</section>
 | 
						||
				<section>
 | 
						||
					<h2>"fail safe" bootloader</h2>
 | 
						||
					Using dfu
 | 
						||
				</section>
 | 
						||
				<section>
 | 
						||
					<h2>Updating Fomu</h2>
 | 
						||
					<code>
 | 
						||
						sean@PAZUZU  ~\Code\Fomu\foboot\releases\v1.8.1   master ≢                                                                 [10:45]
 | 
						||
❯ dfu-util -l
 | 
						||
dfu-util 0.9
 | 
						||
 | 
						||
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
 | 
						||
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
 | 
						||
This program is Free Software and has ABSOLUTELY NO WARRANTY
 | 
						||
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
 | 
						||
 | 
						||
Found DFU: [1209:5bf0] ver=0101, devnum=16, cfg=1, intf=0, path="1-1.1.2", alt=0, name="Fomu DFU Bootloader v1.7.2", serial="UNKNOWN"
 | 
						||
sean@PAZUZU  ~\Code\Fomu\foboot\releases\v1.8.1   master ≢                                                                 [10:45]
 | 
						||
❯ dfu-util -D .\pvt-installable.dfu
 | 
						||
dfu-util 0.9
 | 
						||
 | 
						||
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
 | 
						||
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
 | 
						||
This program is Free Software and has ABSOLUTELY NO WARRANTY
 | 
						||
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
 | 
						||
 | 
						||
Match vendor ID from file: 1209
 | 
						||
Match product ID from file: 5bf0
 | 
						||
Opening DFU capable USB device...
 | 
						||
ID 1209:5bf0
 | 
						||
Run-time device DFU version 0101
 | 
						||
Claiming USB DFU Interface...
 | 
						||
Setting Alternate Setting #0 ...
 | 
						||
Determining device status: state = dfuIDLE, status = 0
 | 
						||
dfuIDLE, continuing
 | 
						||
DFU mode device DFU version 0101
 | 
						||
Device returned transfer size 1024
 | 
						||
Copying data from PC to DFU device
 | 
						||
Download        [=========                ]  36%        38912 bytes
 | 
						||
Download done.
 | 
						||
state(7) = dfuMANIFEST, status(0) = No error condition is present
 | 
						||
state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present
 | 
						||
Done!
 | 
						||
sean@PAZUZU  ~\Code\Fomu\foboot\releases\v1.8.1   master ≢                                                                 [10:45]
 | 
						||
❯ dfu-util -l
 | 
						||
dfu-util 0.9
 | 
						||
 | 
						||
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
 | 
						||
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
 | 
						||
This program is Free Software and has ABSOLUTELY NO WARRANTY
 | 
						||
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
 | 
						||
 | 
						||
Found DFU: [1209:5bf0] ver=0101, devnum=14, cfg=1, intf=0, path="1-1.1.2", alt=0, name="Fomu DFU Bootloader v1.8.1", serial="UNKNOWN"
 | 
						||
sean@PAZUZU  ~\Code\Fomu\foboot\releases\v1.8.1   master ≢                                                                 [10:47]
 | 
						||
❯
 | 
						||
					</code>
 | 
						||
				</section>
 | 
						||
			</section>
 | 
						||
 | 
						||
			<section>
 | 
						||
				<h2>Levels of Fomu</h2>
 | 
						||
				<p>
 | 
						||
					Fomu aims to be accessable on three levels:
 | 
						||
					<ol>
 | 
						||
						<li>Python / Interpreted</li>
 | 
						||
						<li>RISC-V</li>
 | 
						||
						<li>Verilog / FPGA</li>
 | 
						||
					</ol>
 | 
						||
				</p>
 | 
						||
			</section>
 | 
						||
			<section>
 | 
						||
				<section>
 | 
						||
					<h2>Python / Interpreted</h2>
 | 
						||
					<ol>
 | 
						||
						<li><strong>Goal:</strong> Multiple interpreters, auto-reload, USB disk interface</li>
 | 
						||
						<li><strong>Now:</strong> MicroPython binary</li>
 | 
						||
					</ol>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Loading Programs onto Fomu</h2>
 | 
						||
					<code>dfu-util -l</code>
 | 
						||
					<code>dfu-util -D update.bin</code>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Loading MicroPython</h2>
 | 
						||
					<code>dfu-util -D micropython.dfu</code>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Connecting via serial</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Interacting with Fomu</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>RGB LEDD reference</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Future Work</h2>
 | 
						||
					CircuitPython, etc.
 | 
						||
				</section>
 | 
						||
			</section>
 | 
						||
			<section>
 | 
						||
				<section>
 | 
						||
					<h2>RISC-V code</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>LiteX Machine Model</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Wishbone Interface</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Wishbone Bridge</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Interacting with LEDD directly</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Writing RISC-V Code</h2>
 | 
						||
				</section>
 | 
						||
			</section>
 | 
						||
 | 
						||
			<section>
 | 
						||
				<section>
 | 
						||
					<h2>Hardware Description Language</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Yosys and NextPNR</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>Blinking an LED</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>LiteX and MiGen</h2>
 | 
						||
				</section>
 | 
						||
 | 
						||
				<section>
 | 
						||
					<h2>VexRiscv</h2>
 | 
						||
				</section>
 | 
						||
			</section>
 | 
						||
		</div>
 | 
						||
	</div> <!-- class="reveal" -->
 | 
						||
	<!-- End of main presentation -->
 | 
						||
 | 
						||
	<!-- Start of configuration section -->
 | 
						||
	<script src="lib/js/head.min.js"></script>
 | 
						||
	<script src="js/reveal.js"></script>
 | 
						||
 | 
						||
	<script>
 | 
						||
		var presenter = !!Reveal.getQueryHash().s;
 | 
						||
 | 
						||
		// More info https://github.com/hakimel/reveal.js#configuration
 | 
						||
		Reveal.initialize({
 | 
						||
			controls: presenter ? false : true,
 | 
						||
			progress: true,
 | 
						||
			history: true,
 | 
						||
			center: true,
 | 
						||
			controlsTutorial: presenter ? false : true,
 | 
						||
 | 
						||
			slideNumber: presenter ? null : 'c/t',
 | 
						||
 | 
						||
			// The "normal" size of the presentation, aspect ratio will be preserved
 | 
						||
			// when the presentation is scaled to fit different resolutions. Can be
 | 
						||
			// specified using percentage units.
 | 
						||
			width: 960,
 | 
						||
			height: 700,
 | 
						||
 | 
						||
			// Factor of the display size that should remain empty around the content
 | 
						||
			margin: 0.1,
 | 
						||
 | 
						||
			multiplex: {
 | 
						||
				url: 'https://p.xobs.io/',
 | 
						||
				id: 'cbd6556886c2825d',
 | 
						||
				secret: Reveal.getQueryHash().s || null
 | 
						||
			},
 | 
						||
 | 
						||
			// Bounds for smallest/largest possible scale to apply to content
 | 
						||
			minScale: 0.02,
 | 
						||
			maxScale: 5.5,
 | 
						||
 | 
						||
			transition: 'slide', // none/fade/slide/convex/concave/zoom
 | 
						||
 | 
						||
			// More info https://github.com/hakimel/reveal.js#dependencies
 | 
						||
			dependencies: [
 | 
						||
				{ src: 'lib/js/classList.js', condition: function () { return !document.body.classList; } },
 | 
						||
				{ src: 'plugin/markdown/marked.js', condition: function () { return !!document.querySelector('[data-markdown]'); } },
 | 
						||
				{ src: 'plugin/markdown/markdown.js', condition: function () { return !!document.querySelector('[data-markdown]'); } },
 | 
						||
				{ src: 'plugin/highlight/highlight.js', async: true, callback: function () { hljs.initHighlightingOnLoad(); } },
 | 
						||
				{ src: 'plugin/search/search.js', async: true },
 | 
						||
				{ src: 'plugin/zoom-js/zoom.js', async: true },
 | 
						||
				{ src: 'plugin/notes/notes.js', async: true },
 | 
						||
 | 
						||
				{ src: 'lib/js/socket.io.js', async: true },
 | 
						||
				{
 | 
						||
					src: presenter ?
 | 
						||
						'plugin/multiplex/master.js' :
 | 
						||
						'plugin/multiplex/client.js', async: true
 | 
						||
				},
 | 
						||
			]
 | 
						||
		});
 | 
						||
	</script>
 | 
						||
</body>
 | 
						||
 | 
						||
</html> |