Deployed dc0f793 to dev with MkDocs 1.6.1 and mike 2.1.3
This commit is contained in:
parent
88f263c6e0
commit
bf1ea345aa
159
dev/404.html
159
dev/404.html
|
|
@ -46,6 +46,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/manta/dev/assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="/manta/dev/stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("/manta/dev",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -136,7 +138,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -146,7 +148,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -156,7 +158,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -168,43 +170,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -332,11 +297,11 @@
|
|||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="/manta/dev/alternatives/" class="md-nav__link">
|
||||
<a href="/manta/dev/use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -371,6 +336,26 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="/manta/dev/similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -386,24 +371,24 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -470,6 +455,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -540,10 +574,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -554,8 +588,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -567,27 +601,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="/manta/dev/repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
|
|||
|
|
@ -15,10 +15,10 @@
|
|||
<link rel="canonical" href="https://fischermoseley.github.io/manta/dev/architecture/">
|
||||
|
||||
|
||||
<link rel="prev" href="../alternatives/">
|
||||
<link rel="prev" href="../use_cases/">
|
||||
|
||||
|
||||
<link rel="next" href="../io_core/">
|
||||
<link rel="next" href="../similar_tools/">
|
||||
|
||||
|
||||
<link rel="icon" href="../assets/logo_ray_only_with_shadow.png">
|
||||
|
|
@ -52,6 +52,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="../stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -147,7 +149,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -157,7 +159,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -167,7 +169,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -179,43 +181,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -343,11 +308,11 @@
|
|||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../alternatives/" class="md-nav__link">
|
||||
<a href="../use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -496,6 +461,26 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -511,24 +496,24 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -595,6 +580,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -665,10 +699,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -679,8 +713,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -692,27 +726,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,119 @@
|
|||
|
||||
/* Avoid breaking parameter names, etc. in table cells. */
|
||||
.doc-contents td code {
|
||||
word-break: normal !important;
|
||||
}
|
||||
|
||||
/* No line break before first paragraph of descriptions. */
|
||||
.doc-md-description,
|
||||
.doc-md-description>p:first-child {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* Max width for docstring sections tables. */
|
||||
.doc .md-typeset__table,
|
||||
.doc .md-typeset__table table {
|
||||
display: table !important;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.doc .md-typeset__table tr {
|
||||
display: table-row;
|
||||
}
|
||||
|
||||
/* Defaults in Spacy table style. */
|
||||
.doc-param-default {
|
||||
float: right;
|
||||
}
|
||||
|
||||
/* Backward-compatibility: docstring section titles in bold. */
|
||||
.doc-section-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Symbols in Navigation and ToC. */
|
||||
:root,
|
||||
[data-md-color-scheme="default"] {
|
||||
--doc-symbol-attribute-fg-color: #953800;
|
||||
--doc-symbol-function-fg-color: #8250df;
|
||||
--doc-symbol-method-fg-color: #8250df;
|
||||
--doc-symbol-class-fg-color: #0550ae;
|
||||
--doc-symbol-module-fg-color: #5cad0f;
|
||||
|
||||
--doc-symbol-attribute-bg-color: #9538001a;
|
||||
--doc-symbol-function-bg-color: #8250df1a;
|
||||
--doc-symbol-method-bg-color: #8250df1a;
|
||||
--doc-symbol-class-bg-color: #0550ae1a;
|
||||
--doc-symbol-module-bg-color: #5cad0f1a;
|
||||
}
|
||||
|
||||
[data-md-color-scheme="slate"] {
|
||||
--doc-symbol-attribute-fg-color: #ffa657;
|
||||
--doc-symbol-function-fg-color: #d2a8ff;
|
||||
--doc-symbol-method-fg-color: #d2a8ff;
|
||||
--doc-symbol-class-fg-color: #79c0ff;
|
||||
--doc-symbol-module-fg-color: #baff79;
|
||||
|
||||
--doc-symbol-attribute-bg-color: #ffa6571a;
|
||||
--doc-symbol-function-bg-color: #d2a8ff1a;
|
||||
--doc-symbol-method-bg-color: #d2a8ff1a;
|
||||
--doc-symbol-class-bg-color: #79c0ff1a;
|
||||
--doc-symbol-module-bg-color: #baff791a;
|
||||
}
|
||||
|
||||
code.doc-symbol {
|
||||
border-radius: .1rem;
|
||||
font-size: .85em;
|
||||
padding: 0 .3em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
code.doc-symbol-attribute {
|
||||
color: var(--doc-symbol-attribute-fg-color);
|
||||
background-color: var(--doc-symbol-attribute-bg-color);
|
||||
}
|
||||
|
||||
code.doc-symbol-attribute::after {
|
||||
content: "attr";
|
||||
}
|
||||
|
||||
code.doc-symbol-function {
|
||||
color: var(--doc-symbol-function-fg-color);
|
||||
background-color: var(--doc-symbol-function-bg-color);
|
||||
}
|
||||
|
||||
code.doc-symbol-function::after {
|
||||
content: "func";
|
||||
}
|
||||
|
||||
code.doc-symbol-method {
|
||||
color: var(--doc-symbol-method-fg-color);
|
||||
background-color: var(--doc-symbol-method-bg-color);
|
||||
}
|
||||
|
||||
code.doc-symbol-method::after {
|
||||
content: "meth";
|
||||
}
|
||||
|
||||
code.doc-symbol-class {
|
||||
color: var(--doc-symbol-class-fg-color);
|
||||
background-color: var(--doc-symbol-class-bg-color);
|
||||
}
|
||||
|
||||
code.doc-symbol-class::after {
|
||||
content: "class";
|
||||
}
|
||||
|
||||
code.doc-symbol-module {
|
||||
color: var(--doc-symbol-module-fg-color);
|
||||
background-color: var(--doc-symbol-module-bg-color);
|
||||
}
|
||||
|
||||
code.doc-symbol-module::after {
|
||||
content: "mod";
|
||||
}
|
||||
|
||||
.doc-signature .autorefs {
|
||||
color: inherit;
|
||||
border-bottom: 1px dotted currentcolor;
|
||||
}
|
||||
|
|
@ -18,8 +18,6 @@
|
|||
<link rel="prev" href="../uart_interface/">
|
||||
|
||||
|
||||
<link rel="next" href="../repository_structure/">
|
||||
|
||||
|
||||
<link rel="icon" href="../assets/logo_ray_only_with_shadow.png">
|
||||
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.39">
|
||||
|
|
@ -52,6 +50,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="../stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -147,7 +147,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -157,7 +157,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -167,7 +167,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -179,43 +179,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -343,11 +306,11 @@
|
|||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../alternatives/" class="md-nav__link">
|
||||
<a href="../use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -380,7 +343,25 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -393,28 +374,30 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -481,6 +464,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" checked>
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="true">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -566,6 +598,39 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Configuration">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#amaranth-native-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Amaranth-Native Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.EthernetInterface" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code> EthernetInterface
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -605,10 +670,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -619,8 +684,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -632,27 +697,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
@ -715,6 +759,39 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Configuration">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#amaranth-native-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Amaranth-Native Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.EthernetInterface" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code> EthernetInterface
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -738,15 +815,16 @@
|
|||
<h1>Ethernet Interface</h1>
|
||||
|
||||
<h2 id="overview">Overview</h2>
|
||||
<p>For scenarios where UART is not available or higher bandwidth is desired, Manta provides an Ethernet interface for communicating between the host and FPGA. This interface uses UDP for communication, and leverages the builtin Python <code>sockets</code> module on the host side, and the open-source <a href="https://github.com/enjoy-digital/liteeth">LiteEth</a> Ethernet core on the FPGA side.</p>
|
||||
<p>For applications where UART is too slow or isn't available, Manta provides the option to run over Ethernet. This is done via UDP, so the FPGA can be anywhere on the same network as the host machine - as opposed to MAC-based Ethernet interfaces, which usually require a point-to-point network connection between the FPGA and the host. Although UDP does not guaruntee reliable, in-order packet delivery, this generally tends to be the case on uncongested networks. In the future, Manta will enforce this at the <a href="https://github.com/fischermoseley/manta/issues/10">application layer</a>.</p>
|
||||
<div class="admonition info">
|
||||
<p class="admonition-title">Not every device is supported!</p>
|
||||
<p>Although Manta aims to be as platform-agnostic as possible, Ethernet PHYs and FPGA clock primitives are very particular devices. As a result, the supported devices are loosely restricted to those on <a href="https://github.com/enjoy-digital/liteeth?tab=readme-ov-file#-features">this list</a>. If a device you'd like to use isn't on the list, the community would love your help!</p>
|
||||
<p>Internally, the Ethernet Interface uses <a href="https://github.com/enjoy-digital/liteeth">LiteEth</a> to generate cross-platform RTL for the FPGA. As a result, the supported devices are loosely restricted to those <a href="https://github.com/enjoy-digital/liteeth?tab=readme-ov-file#-features">supported by LiteEth</a>. If a device you'd like to use isn't on the list, the community would love your help.</p>
|
||||
</div>
|
||||
<p>Although UDP does not guarantee reliable packet delivery, this usually doesn't pose an issue in practice. Manta will throw a runtime error if packets are dropped, and the UDP checksum and Ethernet FCS guarantee that any data delivered is not corrupted. Together, these two behaviors prevent corrupted data from being provided to the user, as Manta will error before returning invalid data. As long as your network is not terribly congested, Manta will operate without issue.</p>
|
||||
<p>Both the <a href="../use_cases">Use Cases</a> page and the repository's <a href="https://github.com/fischermoseley/manta/tree/main/examples">examples</a> folder contain examples of the Ethernet Interface for your reference.</p>
|
||||
<h2 id="configuration">Configuration</h2>
|
||||
<p>The configuration of the Ethernet core is best shown by example:
|
||||
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nt">ethernet</span><span class="p">:</span>
|
||||
<h3 id="verilog-based-workflows">Verilog-Based Workflows</h3>
|
||||
<p>The UART interface is used by adding a <code>ethernet</code> entry at the bottom of the configuration file. This is best shown by example:</p>
|
||||
<p><div class="language-yaml highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nt">ethernet</span><span class="p">:</span>
|
||||
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="w"> </span><span class="nt">phy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">LiteEthPHYRMII</span>
|
||||
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="nt">vendor</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">xilinx</span>
|
||||
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="w"> </span><span class="nt">toolchain</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">vivado</span>
|
||||
|
|
@ -757,35 +835,172 @@
|
|||
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="w"> </span><span class="nt">fpga_ip_addr</span><span class="p">:</span><span class="w"> </span><span class="s">"192.168.0.110"</span>
|
||||
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="w"> </span><span class="nt">host_ip_addr</span><span class="p">:</span><span class="w"> </span><span class="s">"192.168.0.100"</span>
|
||||
</span></code></pre></div>
|
||||
This snippet at the end of the configuration file defines the interface. The following parameters must be set:</p>
|
||||
Inside this configuration, the following parameters may be set:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><code>phy</code> <em>(required)</em>: The name of the LiteEth PHY class to use. Valid values consist of any of the names in <a href="https://github.com/enjoy-digital/liteeth/blob/b4e28506238c5340f2ade7899c2223424cabd410/liteeth/phy/__init__.py#L25-L45">this list</a>. Select the appropriate one for your FPGA vendor and family.</p>
|
||||
<p><code>phy</code> <em>(required)</em>: The name of the LiteEth PHY class to use. Select the appropriate one from <a href="https://github.com/enjoy-digital/liteeth/blob/b4e28506238c5340f2ade7899c2223424cabd410/liteeth/phy/__init__.py#L25-L45">this list</a> for your FPGA vendor and family.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>vendor</code> <em>(required)</em>: The vendor of the FPGA being designed for. Currently only values of <code>xilinx</code> and <code>lattice</code> are supported. Used to generate timing constraints files, which are currently unused.</p>
|
||||
<p><code>vendor</code> <em>(required)</em>: The vendor of your FPGA. Currently only values of <code>xilinx</code> and <code>lattice</code> are supported. This is used to generate (currently unused) timing constraints files.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>toolchain</code> <em>(required)</em>: The toolchain being used. Currently only values of <code>vivado</code> and <code>diamond</code> are supported.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>clk_freq</code> <em>(required)</em>: The frequency of the clock provided to the Manta instance.</p>
|
||||
<p><code>clk_freq</code> <em>(required)</em>: The frequency of the clock provided to the Manta module on the FPGA, in Hertz (Hz).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>refclk_freq</code> <em>(required)</em>: The frequency of the reference clock to be provided to the Ethernet PHY. This frequency must match the MII variant supported by the PHY, as well as speed that the PHY is being operated at. For instance, a RGMII PHY may be operated at either 125MHz in Gigabit mode, or 25MHz in 100Mbps mode.</p>
|
||||
<p><code>refclk_freq</code> <em>(required)</em>: The frequency of the reference clock to be provided to the Ethernet PHY, in Hertz (Hz). This frequency must match the MII variant used by the PHY, and speed it is being operated at. For instance, a RGMII PHY may be operated at either 125MHz in Gigabit mode, or 25MHz in 100Mbps mode.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>fpga_ip_addr</code> <em>(required)</em>: The IP address the FPGA will attempt to claim. Upon power-on, the FPGA will issue a DHCP request for this IP address. The easiest way to check if this was successful is by pinging the FPGA's IP, but if you have access to your network's router it may report a list of connected devices.</p>
|
||||
<p><code>fpga_ip_addr</code> <em>(required)</em>: The IP address the FPGA will attempt to claim. Upon power-on, the FPGA will issue a DHCP request for this IP address. Ping this address after power-on to check if this request was successful, or check your router for a list of connected devices.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>host_ip_addr</code> <em>(required)</em>: The IP address of the host machine, which the FPGA will send packets back to.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>udp_port</code> <em>(optional)</em>: The UDP port to communicate over. Defaults to 2001.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Lastly, any additonal arguments provided in the <code>ethernet</code> section of the config file will be passed to the LiteEth standalone core generator. As a result, the <a href="https://github.com/enjoy-digital/liteeth/tree/master/examples">examples</a> provided by LiteEth may be of some service to you if you're bringing up a different FPGA!</p>
|
||||
<div class="admonition warning">
|
||||
<p class="admonition-title">LiteEth doesn't always generate its own <code>refclk</code>!</p>
|
||||
<p>Although LitEth is built on Migen and LiteX which support PLLs and other clock generation primitives, I haven't seen it instantiate one to synthesize a suitable <code>refclk</code> at the appropriate frequency from the input clock. As a result, for now it's recommended to generate your <code>refclk</code> outside Manta, and then use it to clock your Manta instance.</p>
|
||||
</div>
|
||||
<h3 id="amaranth-native-designs">Amaranth-Native Designs</h3>
|
||||
<p>Since Amaranth modules are Python objects, the configuration of the IO Core is given by the arguments given during initialization. See the documentation for the <code>EthernetInterface</code> <a href="#manta.EthernetInterface">class constructor</a> below, as well as the Amaranth <a href="https://github.com/fischermoseley/manta/tree/main/examples/amaranth">examples</a> in the repo.</p>
|
||||
|
||||
|
||||
<div class="doc doc-object doc-class">
|
||||
|
||||
|
||||
|
||||
<h3 id="manta.EthernetInterface" class="doc doc-heading">
|
||||
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">manta.EthernetInterface</span>
|
||||
|
||||
|
||||
</h3>
|
||||
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">EthernetInterface</span><span class="p">(</span><span class="n">phy</span><span class="p">,</span> <span class="n">clk_freq</span><span class="p">,</span> <span class="n">fpga_ip_addr</span><span class="p">,</span> <span class="n">host_ip_addr</span><span class="p">,</span> <span class="n">udp_port</span><span class="o">=</span><span class="mi">2001</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||||
</span></code></pre></div>
|
||||
|
||||
<div class="doc doc-contents first">
|
||||
|
||||
|
||||
<p>A synthesizable module for Ethernet (UDP) communication between a host
|
||||
machine and the FPGA.</p>
|
||||
|
||||
<p>This function is the main mechanism for configuring an Ethernet
|
||||
Interface in an Amaranth-native design.</p>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Parameters:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>phy</code></b>
|
||||
(<code>str</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The name of the LiteEth PHY class to use. Select the
|
||||
appropriate one from <a href="https://github.com/enjoy-digital/liteeth/blob/main/liteeth/phy/__init__.py#L25-L45">this list</a>
|
||||
for your FPGA vendor and family.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>clk_freq</code></b>
|
||||
(<code>int | float</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The frequency of the clock provided to the
|
||||
Manta module on the FPGA, in Hertz (Hz).</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>fpga_ip_addr</code></b>
|
||||
(<code>str</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The IP address the FPGA will attempt to claim.
|
||||
Upon power-on, the FPGA will issue a DHCP request for this IP
|
||||
address. Ping this address after power-on to check if this
|
||||
request was successful, or check your router for a list of
|
||||
connected devices.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>host_ip_addr</code></b>
|
||||
(<code>str</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The IP address of the host machine, which the
|
||||
FPGA will send packets back to.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>udp_port</code></b>
|
||||
(<code>Optional[int]</code>, default:
|
||||
<code>2001</code>
|
||||
)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The UDP port to communicate over.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>**kwargs</code></b>
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>Any additional keyword arguments to this function will
|
||||
be passed to the LiteEth RTL generator. Some examples are
|
||||
provided below:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>mac_address (int): A 48-bit integer representing the MAC
|
||||
address the FPGA will assume. If not provided, an address
|
||||
within the <a href="https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses">Locally Administered, Administratively Assigned group</a>
|
||||
will be randomly generated.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>vendor (str): The vendor of your FPGA. Currently only values
|
||||
of <code>xilinx</code> and <code>lattice</code> are supported. This is used to
|
||||
generate (currently unused) timing constraints files.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>toolchain (str): The toolchain being used. Currently only
|
||||
values of <code>vivado</code> and <code>diamond</code> are supported.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>refclk_freq (int | float): The frequency of the reference
|
||||
clock to be provided to the Ethernet PHY, in Hertz (Hz).
|
||||
This frequency must match the MII variant used by the PHY,
|
||||
and speed it is being operated at. For instance, a RGMII
|
||||
PHY may be operated at either 125MHz in Gigabit mode, or
|
||||
25MHz in 100Mbps mode.</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="doc doc-children">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
<link rel="prev" href="../installation/">
|
||||
|
||||
|
||||
<link rel="next" href="../alternatives/">
|
||||
<link rel="next" href="../use_cases/">
|
||||
|
||||
|
||||
<link rel="icon" href="../assets/logo_ray_only_with_shadow.png">
|
||||
|
|
@ -52,6 +52,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="../stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -147,7 +149,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -157,7 +159,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -167,7 +169,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -179,43 +181,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -374,21 +339,51 @@
|
|||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example-configuration" class="md-nav__link">
|
||||
<a href="#usage-in-traditional-verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Example Configuration
|
||||
Usage in Traditional Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Usage in Traditional Verilog-Based Workflows">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Example
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example-instantiation" class="md-nav__link">
|
||||
<a href="#usage-in-amaranth-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Example Instantiation
|
||||
Usage in Amaranth Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Usage in Amaranth Designs">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#adding-manta-as-an-instance-variable" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Adding Manta as an Instance Variable
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -406,11 +401,11 @@
|
|||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../alternatives/" class="md-nav__link">
|
||||
<a href="../use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -445,6 +440,26 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -460,24 +475,24 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -544,6 +559,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -614,10 +678,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -628,8 +692,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -641,27 +705,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
@ -718,21 +761,51 @@
|
|||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example-configuration" class="md-nav__link">
|
||||
<a href="#usage-in-traditional-verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Example Configuration
|
||||
Usage in Traditional Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Usage in Traditional Verilog-Based Workflows">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Example
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example-instantiation" class="md-nav__link">
|
||||
<a href="#usage-in-amaranth-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Example Instantiation
|
||||
Usage in Amaranth Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Usage in Amaranth Designs">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#adding-manta-as-an-instance-variable" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Adding Manta as an Instance Variable
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -756,78 +829,96 @@
|
|||
<h1>Getting Started</h1>
|
||||
|
||||
<h2 id="overview">Overview</h2>
|
||||
<p>To use Manta, you'll need a host machine with a FPGA board connected over UART, or a FPGA board connected to the same network via Ethernet. You'll then:</p>
|
||||
<p>Regardless of if you use it in a traditional Verilog-based workflow or natively in an Amaranth design, using Manta consists of the following steps:</p>
|
||||
<ul>
|
||||
<li><em>Specify a set of debug cores you wish to include in your design.</em> This is done by writing a configuration file, typically called <code>manta.yaml</code>. Specifying files in JSON is also supported, as long as the hierarchy in the file is equivalent. Just make sure that your YAML files end in <code>.yaml</code> or <code>.yml</code>, and that JSON files end in <code>.json</code>.</li>
|
||||
<li><em>Invoke Manta to generate Verilog from the configuration provided.</em> This is done by running <code>manta gen [config_file] [verilog_file]</code> at the command line, which generates a Verilog file (typically named <code>manta.v</code>) from the provided configuration file. This Verilog file contains a definition for a Verilog module named <code>manta</code>, and all its constituent modules.</li>
|
||||
<li><em>Instantiate <code>manta</code> in your design, and connecting it to the logic you'd like to debug.</em> Manta will provide an example instantiation if you run <code>manta inst [config_file]</code>, which you can copy-paste into your source code. You'll connect its ports to the logic you're trying to debug, as well as to whatever interface you're using to communicate with the host. This will be a serial transciever on your development board if you're using UART, or it's RMII PHY if you're using Ethernet.</li>
|
||||
<li><em>Build and upload the design to your FPGA using your preferred toolchain.</em></li>
|
||||
<li><em>Use the debug core(s) through the Python API or the command line.</em> The functions availble to each core are described in their documentation.</li>
|
||||
<li><em>Repeat!</em> As you debug, you'll probably want to change exactly how Manta is configured. This means tweaking the configuration file, regenerating the Verilog module, and so on.</li>
|
||||
<li>Specify and configure the cores you wish to include in your FPGA design.</li>
|
||||
<li>Generate RTL for these cores, and include this RTL in your design.</li>
|
||||
<li>Build the design, and upload it to your device.</li>
|
||||
<li>Operate the cores from the host machine.</li>
|
||||
</ul>
|
||||
<h2 id="example-configuration">Example Configuration</h2>
|
||||
<p>An example config file is provided below. If this file was named <code>manta.yaml</code> then running <code>manta gen manta.yaml manta.v</code> would generate Verilog for a <code>manta</code> module that matched the config file.</p>
|
||||
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nn">---</span>
|
||||
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nt">cores</span><span class="p">:</span>
|
||||
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="nt">my_io_core</span><span class="p">:</span>
|
||||
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">io</span>
|
||||
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>
|
||||
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="w"> </span><span class="nt">inputs</span><span class="p">:</span>
|
||||
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="w"> </span><span class="nt">probe_0_in</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">6</span>
|
||||
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="nt">probe_1_in</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">12</span>
|
||||
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>
|
||||
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="w"> </span><span class="nt">outputs</span><span class="p">:</span>
|
||||
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="w"> </span><span class="nt">probe_2_out</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">20</span>
|
||||
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a><span class="w"> </span><span class="nt">probe_3_out</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
|
||||
</span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a>
|
||||
</span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a><span class="w"> </span><span class="nt">my_logic_analyzer</span><span class="p">:</span>
|
||||
</span><span id="__span-0-15"><a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">logic_analyzer</span>
|
||||
</span><span id="__span-0-16"><a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a><span class="w"> </span><span class="nt">sample_depth</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">4096</span>
|
||||
</span><span id="__span-0-17"><a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a><span class="w"> </span><span class="nt">trigger_location</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1000</span>
|
||||
</span><span id="__span-0-18"><a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a>
|
||||
</span><span id="__span-0-19"><a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a><span class="w"> </span><span class="nt">probes</span><span class="p">:</span>
|
||||
</span><span id="__span-0-20"><a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a><span class="w"> </span><span class="nt">larry</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
|
||||
</span><span id="__span-0-21"><a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a><span class="w"> </span><span class="nt">curly</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3</span>
|
||||
</span><span id="__span-0-22"><a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a><span class="w"> </span><span class="nt">moe</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">9</span>
|
||||
</span><span id="__span-0-23"><a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a>
|
||||
</span><span id="__span-0-24"><a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a><span class="w"> </span><span class="nt">triggers</span><span class="p">:</span>
|
||||
</span><span id="__span-0-25"><a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">moe RISING</span>
|
||||
</span><span id="__span-0-26"><a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">curly FALLING</span>
|
||||
</span><span id="__span-0-27"><a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a>
|
||||
</span><span id="__span-0-28"><a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a><span class="nt">uart</span><span class="p">:</span>
|
||||
</span><span id="__span-0-29"><a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a><span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="s">"auto"</span>
|
||||
</span><span id="__span-0-30"><a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a><span class="w"> </span><span class="nt">baudrate</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3000000</span>
|
||||
</span><span id="__span-0-31"><a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a><span class="w"> </span><span class="nt">clock_freq</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">100000000</span>
|
||||
</span></code></pre></div>
|
||||
<p>Although it's just an example, this config file shows the two things every Manta configuration needs, namely:</p>
|
||||
<p>Manta’s cores are small, configurable blocks that each provide some functionality. More information on each core can be found on their respective documentation pages. Manta supports an arbitrary amount of unique cores, limited only by the available resources of your device.</p>
|
||||
<h2 id="usage-in-traditional-verilog-based-workflows">Usage in Traditional Verilog-Based Workflows</h2>
|
||||
<p>Although modern HDLs are rising in popularity, most existing FPGA designs use a Verilog-based workflow. This consists of synthesizing a number of Verilog files into a single design. Manta can easily be used in such a workflow, as described below:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong><em>Cores</em></strong>: A list of the debug cores Manta should place on your FPGA. The behavior and configuration of the cores is described in more detail on their documentation pages, but this list contains each core you'd like included in your <code>manta</code> module. This list can have as many entires as your FPGA can support, so long as Manta can address them all. If it can't, it'll throw an error when it tries to generate Verilog.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong><em>Interface</em></strong>: The way data gets on and off the FPGA. At present, Manta only supports UART and Ethernet interfaces. These are described in more detail on their documentation pages, but the interface of choice is specified with either a <code>uart</code> or <code>ethernet</code> at the end of the configuration file.</p>
|
||||
</li>
|
||||
<li>The cores and interface used to communicate with them is specified in a configuration file, written in YAML. This file is typically named <code>manta.yaml</code> .</li>
|
||||
<li>A Verilog file containing the cores specified in the configuration file is generated. This is most often done at the command line with the <code>manta gen</code> command (for example, <code>manta gen manta.yaml manta.v</code>) but can also be done with the <code>generate_verilog</code>method of the <code>Manta</code> Python class. This file contains the definition of a Verilog module named <code>manta</code>, which includes all the cores specified in the configuration file.</li>
|
||||
<li>This <code>manta</code> module is instantiated in your design, and the signals to each core are connected to your logic. Connections are also made to the signals of the interface specified in the configuration file. The <code>manta inst</code> command can also be used to generate a Verilog instantiation that can be copy-pasted into your source.</li>
|
||||
<li>After the design is built and uploaded to the FPGA, the cores are operated from the host machine. Each core exposes a Python API containing methods that can be invoked from a Python script. These are described in great detail in the documentation for each core.</li>
|
||||
</ul>
|
||||
<p>This Manta instance has an IO Core and a Logic Analyzer, each containing a number of probes at variable widths. The Manta module itself is provided a 100MHz clock, and communicates with the host over UART running at 3Mbaud. This is just an example, and more details are available in the documentation page for each core.</p>
|
||||
<h2 id="example-instantiation">Example Instantiation</h2>
|
||||
<p>Lastly, we Manta can automatically generate a copy-pasteable Verilog snippet to instantiate Manta in your design by running <code>manta inst [config_file]</code>. For example, the following snippet is generated for the configuration above:</p>
|
||||
<div class="admonition note">
|
||||
<p class="admonition-title">Reset is active high!</p>
|
||||
<p>The Manta instance will reset while <code>rst</code> is held high. If you want to share reset logic with an active low reset signal (for example, <code>rst_n</code>), be sure to invert it first.</p>
|
||||
<div class="admonition success">
|
||||
<p class="admonition-title">VHDL works too!</p>
|
||||
<p>If your FPGA design is VHDL-based, fret not! Most synthesis tools support mixed-language projects, and will happily ingest both a Verilog-based Manta module inside of a VHDL-based design. Just take care to ensure that interfaces match between the VHDL and Verilog modules.</p>
|
||||
</div>
|
||||
<h3 id="example">Example</h3>
|
||||
<p>A minimal example of a <code>manta.yaml</code> file may be observed below:</p>
|
||||
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nt">cores</span><span class="p">:</span>
|
||||
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="w"> </span><span class="nt">my_io_core</span><span class="p">:</span>
|
||||
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">io</span>
|
||||
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
|
||||
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="w"> </span><span class="nt">inputs</span><span class="p">:</span>
|
||||
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="w"> </span><span class="nt">my_input_signal</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">6</span>
|
||||
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>
|
||||
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="nt">outputs</span><span class="p">:</span>
|
||||
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="w"> </span><span class="nt">my_output_signal</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">12</span>
|
||||
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a>
|
||||
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="nt">uart</span><span class="p">:</span>
|
||||
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a><span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="s">"auto"</span>
|
||||
</span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a><span class="w"> </span><span class="nt">baudrate</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3e6</span>
|
||||
</span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a><span class="w"> </span><span class="nt">clock_freq</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">100e6</span>
|
||||
</span></code></pre></div>
|
||||
<p>This includes a single IO core in the <code>manta</code> module, which communicates with the host machine over a 3Mbaud UART link. Instantiating this core in your design might look like the following, as generated by <code>manta inst</code>:</p>
|
||||
<div class="language-verilog highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="n">manta</span><span class="w"> </span><span class="n">manta_inst</span><span class="w"> </span><span class="p">(</span>
|
||||
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span><span class="p">.</span><span class="n">clk</span><span class="p">(</span><span class="n">clk</span><span class="p">),</span>
|
||||
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span><span class="p">.</span><span class="n">rst</span><span class="p">(</span><span class="n">rst</span><span class="p">),</span>
|
||||
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="p">.</span><span class="n">rx</span><span class="p">(</span><span class="n">rx</span><span class="p">),</span>
|
||||
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="p">.</span><span class="n">tx</span><span class="p">(</span><span class="n">tx</span><span class="p">),</span>
|
||||
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="p">.</span><span class="n">probe_0_in</span><span class="p">(</span><span class="n">probe_0_in</span><span class="p">),</span>
|
||||
</span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="p">.</span><span class="n">probe_1_in</span><span class="p">(</span><span class="n">probe_1_in</span><span class="p">),</span>
|
||||
</span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="w"> </span><span class="p">.</span><span class="n">probe_2_out</span><span class="p">(</span><span class="n">probe_2_out</span><span class="p">),</span>
|
||||
</span><span id="__span-1-9"><a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="w"> </span><span class="p">.</span><span class="n">probe_3_out</span><span class="p">(</span><span class="n">probe_3_out</span><span class="p">),</span>
|
||||
</span><span id="__span-1-10"><a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="w"> </span><span class="p">.</span><span class="n">larry</span><span class="p">(</span><span class="n">larry</span><span class="p">),</span>
|
||||
</span><span id="__span-1-11"><a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a><span class="w"> </span><span class="p">.</span><span class="n">curly</span><span class="p">(</span><span class="n">curly</span><span class="p">),</span>
|
||||
</span><span id="__span-1-12"><a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="w"> </span><span class="p">.</span><span class="n">moe</span><span class="p">(</span><span class="n">moe</span><span class="p">));</span>
|
||||
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="p">.</span><span class="n">my_input_signal</span><span class="p">(</span><span class="n">my_input_signal</span><span class="p">),</span>
|
||||
</span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="p">.</span><span class="n">my_output_signal</span><span class="p">(</span><span class="n">my_output_signal</span><span class="p">));</span>
|
||||
</span></code></pre></div>
|
||||
<div class="admonition note">
|
||||
<p class="admonition-title">Reset is active high!</p>
|
||||
<p>The Manta instance will reset while <code>rst</code> is held high. If you want to share reset logic with an active low reset signal (for example, <code>rst_n</code>), be sure to invert it first.</p>
|
||||
</div>
|
||||
<p>More examples of Verilog-based designs can be found in the <a href="https://github.com/fischermoseley/manta/tree/main/examples/verilog">examples/verilog</a> folder of the repo.</p>
|
||||
<h2 id="usage-in-amaranth-designs">Usage in Amaranth Designs</h2>
|
||||
<p>Since Manta itself is written in <a href="https://github.com/amaranth-lang/amaranth">Amaranth</a>, it’s very easy to use Manta in an Amaranth design. In this flow, the RTL build and generation are offloaded to Amaranth’s build system, such that you need only to configure and operate the core, which is done from Python.</p>
|
||||
<p>Configuration is done by creating a Manta object in Python, adding cores to it, and adding it to your design as an Amaranth submodule:</p>
|
||||
<div class="language-python highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kn">from</span> <span class="nn">amaranth</span> <span class="kn">import</span> <span class="o">*</span>
|
||||
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="kn">from</span> <span class="nn">manta</span> <span class="kn">import</span> <span class="o">*</span>
|
||||
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>
|
||||
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="k">class</span> <span class="nc">ExampleDesign</span><span class="p">(</span><span class="n">Elaborateable</span><span class="p">):</span>
|
||||
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
</span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="bp">self</span><span class="o">.</span><span class="n">manta</span> <span class="o">=</span> <span class="n">Manta</span><span class="p">()</span>
|
||||
</span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> <span class="bp">self</span><span class="o">.</span><span class="n">manta</span><span class="o">.</span><span class="n">interface</span> <span class="o">=</span> <span class="n">UARTInterface</span><span class="p">(</span><span class="s2">"auto"</span><span class="p">,</span> <span class="mf">2e6</span><span class="p">,</span> <span class="mf">12e6</span><span class="p">)</span>
|
||||
</span><span id="__span-2-8"><a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> <span class="bp">self</span><span class="o">.</span><span class="n">manta</span><span class="o">.</span><span class="n">cores</span><span class="o">.</span><span class="n">my_io_core</span> <span class="o">=</span> <span class="n">IOCore</span><span class="p">(</span><span class="n">inputs</span><span class="o">=</span><span class="p">[],</span> <span class="n">outputs</span><span class="o">=</span><span class="p">[])</span>
|
||||
</span><span id="__span-2-9"><a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a>
|
||||
</span><span id="__span-2-10"><a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a>
|
||||
</span><span id="__span-2-11"><a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a> <span class="k">def</span> <span class="nf">elaborate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">platform</span><span class="p">):</span>
|
||||
</span><span id="__span-2-12"><a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a> <span class="n">m</span> <span class="o">=</span> <span class="n">Module</span><span class="p">()</span>
|
||||
</span><span id="__span-2-13"><a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a> <span class="n">m</span><span class="o">.</span><span class="n">submodules</span><span class="o">.</span><span class="n">manta</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">manta</span>
|
||||
</span><span id="__span-2-14"><a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a>
|
||||
</span><span id="__span-2-15"><a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a> <span class="k">return</span> <span class="n">m</span>
|
||||
</span><span id="__span-2-16"><a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a>
|
||||
</span><span id="__span-2-17"><a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a> <span class="k">def</span> <span class="nf">operate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
</span><span id="__span-2-18"><a id="__codelineno-2-18" name="__codelineno-2-18" href="#__codelineno-2-18"></a> <span class="bp">self</span><span class="o">.</span><span class="n">manta</span><span class="o">.</span><span class="n">cores</span><span class="o">.</span><span class="n">my_io_core</span><span class="o">.</span><span class="n">set_probe</span><span class="p">(</span><span class="s2">"foo"</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||
</span><span id="__span-2-19"><a id="__codelineno-2-19" name="__codelineno-2-19" href="#__codelineno-2-19"></a> <span class="bp">self</span><span class="o">.</span><span class="n">manta</span><span class="o">.</span><span class="n">cores</span><span class="o">.</span><span class="n">my_io_core</span><span class="o">.</span><span class="n">get_probe</span><span class="p">(</span><span class="n">bar</span><span class="p">)</span>
|
||||
</span></code></pre></div>
|
||||
<p>Using this <code>ExampleDesign</code> in the configure-build-operate flow might look like the following:</p>
|
||||
<div class="language-python highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="o">>>></span> <span class="kn">from</span> <span class="nn">amaranth_boards.icestick</span> <span class="kn">import</span> <span class="n">ICEStickPlatform</span>
|
||||
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="o">>>></span> <span class="n">design</span> <span class="o">=</span> <span class="n">ExampleDesign</span><span class="p">()</span>
|
||||
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="o">>>></span> <span class="n">ICEStickPlatform</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">design</span><span class="p">,</span> <span class="n">do_program</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="o">>>></span> <span class="n">design</span><span class="o">.</span><span class="n">operate</span><span class="p">()</span>
|
||||
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="o">>>></span> <span class="n">design</span><span class="o">.</span><span class="n">manta</span><span class="o">.</span><span class="n">my_io_core</span><span class="o">.</span><span class="n">get_probe</span><span class="p">(</span><span class="n">bar</span><span class="p">)</span>
|
||||
</span></code></pre></div>
|
||||
<p>Here, Amaranth’s board definitions and build system are being used to build and program an iCEstick development board. More examples of Amaranth-based designs can be found in the <a href="https://github.com/fischermoseley/manta/tree/main/examples/amaranth">examples/amaranth</a> folder of the repo.</p>
|
||||
<div class="admonition warning">
|
||||
<p class="admonition-title">Usage with older versions of Amaranth</p>
|
||||
<p>Unfortunately, Manta has a hard dependency on Amaranth 0.5 (due to <a href="https://github.com/amaranth-lang/amaranth/issues/1011">this</a> bugfix), and it may not work correctly in projects built upon older versions of Amaranth. If this is the case for your project, you may need to generate a standalone Verilog module from the Verilog-based flow, and then include in your project as an <a href="https://amaranth-lang.org/docs/amaranth/latest/guide.html#instances">Instance</a>. Alternatively, you may upgrade your project’s version of Amaranth by following the <a href="https://amaranth-lang.org/docs/amaranth/latest/changes.html#migrating-from-version-0-4">migration guides</a>.</p>
|
||||
</div>
|
||||
<h3 id="adding-manta-as-an-instance-variable">Adding Manta as an Instance Variable</h3>
|
||||
<p>It’s worth noting that this usage represents a slight departure from typical Amaranth style. Typically, submodules would be defined and added to a <code>Module</code> in the <code>elaborate</code> method. Here, the Manta module is instead defined as an instance variable in the <code>__init__</code> function, and then later added as a submodule in the <code>elaborate</code> method.</p>
|
||||
<p>This is necessary as the <code>Manta</code> object contains both HDL needed for build and methods for operating the cores. Saving the <code>Manta</code> instance in the class and re-using it later removes the need to define and configure separate instances when elaborating and operating the cores.</p>
|
||||
<p>Lastly, including <code>manta</code> as an instance variable also allows it to be directly accessed from an interpreter, as shown above. This allows for a more interactive debugging session, as the definition of the <code>operate</code> method doesn’t have to change when you wish to use Manta’s cores differently.</p>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
271
dev/index.html
271
dev/index.html
|
|
@ -50,6 +50,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -145,7 +147,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -155,7 +157,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -165,7 +167,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -177,43 +179,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -329,39 +294,6 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Manta: A Configurable and Approachable Tool for FPGA Debugging and Rapid Prototyping">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#logic-analyzer-core" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Logic Analyzer Core
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#io-core" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
I/O Core
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#memory-cores" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Memory Cores
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
|
|
@ -428,11 +360,11 @@
|
|||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="alternatives/" class="md-nav__link">
|
||||
<a href="use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -467,6 +399,26 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -482,24 +434,24 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -566,6 +518,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -636,10 +637,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -650,8 +651,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -663,27 +664,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
@ -737,39 +717,6 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Manta: A Configurable and Approachable Tool for FPGA Debugging and Rapid Prototyping">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#logic-analyzer-core" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Logic Analyzer Core
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#io-core" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
I/O Core
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#memory-cores" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Memory Cores
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
|
|
@ -803,48 +750,12 @@
|
|||
|
||||
<p><img alt="" src="assets/logo.png" /></p>
|
||||
<h2 id="manta-a-configurable-and-approachable-tool-for-fpga-debugging-and-rapid-prototyping">Manta: A Configurable and Approachable Tool for FPGA Debugging and Rapid Prototyping</h2>
|
||||
<p>Manta is a tool for moving data between a host machine and a FPGA over UART or Ethernet. It's primarily intended for debugging and rapid prototyping of FPGA designs, but it's robust enough to be used as a simple, reliable transport layer.</p>
|
||||
<p>Manta works by generating a number of cores that are instantiated in the FPGA design. These allow for a variety of functions, such as reading and writing to registers and memory, or capturing data with a logic analyzer. These cores are operated by the connected host machine through either the Manta CLI, or a simple Python API.</p>
|
||||
<p>Manta is written in Amaranth HDL, and the generated designs may be used natively in other Amaranth designs, or exported to vendor-agnostic Verilog-2001. All dependencies are cross-platform, so Manta can be used on any machine that has at least Python 3.8 or newer installed.</p>
|
||||
<p>Manta's capabilities are best reflected in its cores, for which a brief description of each is provided below:</p>
|
||||
<h3 id="logic-analyzer-core"><strong>Logic Analyzer Core</strong></h3>
|
||||
<p><em>More details available on the <a href="logic_analyzer_core/">full documentation page</a>.</em></p>
|
||||
<p>This core captures a timeseries of digital signals from within the FPGA, much like a benchtop logic analyzer would. This captures data on the FPGA's native clock and presents it as a waveform, making it very useful for debugging logic cycle-by-cycle. This concept is very similar to the Xilinx <a href="https://docs.xilinx.com/r/en-US/ug908-vivado-programming-debugging/ILA">Integrated Logic Analyzer (ILA)</a> and Intel <a href="https://www.intel.com/content/www/us/en/docs/programmable/683819/21-3/logic-analyzer-introduction.html">SignalTap</a> utilities.</p>
|
||||
<p>You may find this core useful for:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><em>Verifying specification adherence for connected hardware</em> - for instance, you're writing a S/PDIF decoder that works in simulation, but fails in hardware. The logic analyzer core can record a cycle-by-cycle capture of what's coming off the cable, letting you verify that your input signals are what you expect. Even better, Manta will let you play that capture back in your preferred simulator, letting you feed the exact same inputs to your module in simulation and check your logic.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Capturing arbitrary data</em> - you're working on a DSP project, and you'd like to grab some test data from your onboard ADCs to start prototyping your signal processing with. Manta will grab that data, and export it for you.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3 id="io-core"><strong>I/O Core</strong></h3>
|
||||
<p><em>More details available on the <a href="io_core/">full documentation page</a>.</em></p>
|
||||
<p>This core presents a series of user-accessbile registers to the FPGA fabric, which may be configured as either inputs or outputs. The value of an input register can be read off the FPGA by the host machine, and the value of an output register on the FPGA may be set by the host machine. This is handy for getting small amounts of information into and out of the FPGA, debugging, configuration, or experimentation. This concept is very similar to the Xilinx <a href="https://docs.xilinx.com/v/u/en-US/pg159-vio">Virtual IO</a> and Intel <a href="https://www.intel.com/content/www/us/en/docs/programmable/683552/18-1/in-system-sources-and-probes-66964.html">In-System Sources and Probes</a> tools.</p>
|
||||
<p>You may find this core useful for:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><em>Prototyping designs in Python, and incrementally migrating them to hardware</em> - you're working on some real-time signal processing, but you want to prototype it with some sample data in Numpy before meticulously implementing everything in Verilog.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Making dashboards</em> - you'd like to get some telemetry out of your existing FPGA design and display it nicely, but you don't want to implement an interface, design a packetization scheme, and write a library.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3 id="memory-cores"><strong>Memory Cores</strong></h3>
|
||||
<p><em>More details available on the <a href="memory_core/">full documentation page</a>.</em></p>
|
||||
<p>This core creates a two-port block memory on the FPGA, and gives one port to the host machine, and the other to your logic on the FPGA. The width and depth of this block memory is configurable, allowing large chunks of arbitrarily-sized data to be shuffled onto and off of the FPGA by the host machine, via the Python API. This lets you establish a transport layer between the host and FPGA, that treats the data as exactly how it exists on the FPGA.</p>
|
||||
<p>You may find this core useful for:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><em>Moving data between a host and connected FPGA</em> - you're working on a cool new machine learning accelerator, but you don't want to think about how to get training data and weights out of TensorFlow, and into your core.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Hand-tuning ROMs</em> - you're designing a digital filter for a DSP project and would like to tune it in real-time, or you're developing a soft processor and want to upload program code without rebuilding a bitstream.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Manta is a tool for rapidly prototyping and debugging FPGA designs. It works by providing a Manta module which is included in a FPGA design, which itself contains a number of <em>cores</em> - small, configurable debugging blocks that each provide some functionality. These cores are then connected to your design, and allow you to interface with it from a connected host machine.</p>
|
||||
<p>These cores include functionality such as register reads/writes, memory accesses, and an embedded logic analyzer. Manta includes both a UART and Ethernet (via UDP) interface for communication between the host and FPGA.</p>
|
||||
<p>For more information on how Manta can be used, please refer to the <a href="../use_cases">Use Cases</a> page and the repository's <a href="https://github.com/fischermoseley/manta/tree/main/examples">examples</a> folder.</p>
|
||||
<p>Manta specifies its RTL logic with <a href="https://github.com/amaranth-lang/amaranth">Amaranth</a> which allows it to target nearly any FPGA device, regardless of vendor. Manta itself is written in pure Python, which allows it to run on Windows, macOS, Linux, and BSD across a variety of CPU architectures. Manta can be included natively in Amaranth-based designs, or export Verilog-2001 for use in traditional Verilog-based workflows.</p>
|
||||
<h2 id="about">About</h2>
|
||||
<p>Manta and its source code are released under a <a href="https://github.com/fischermoseley/manta/blob/main/LICENSE.txt">GPLv3 license</a>, and it was originally developed as part of my <a href="https://hdl.handle.net/1721.1/151223">Master's Thesis at MIT</a> in 2023, done under the supervision of <a href="https://www.jodalyst.com/">Dr. Joe Steinmeyer</a>. The thesis itself is copyrighted by Fischer Moseley (me!), but feel free to use the following Bibtex if you'd like to cite it:</p>
|
||||
<p>Manta and its source code are released under a <a href="https://github.com/fischermoseley/manta/blob/main/LICENSE.txt">GPLv3 license</a>, and it was originally developed as part of my <a href="https://hdl.handle.net/1721.1/151223">Master's Thesis at MIT</a> in 2023, done under the supervision of <a href="https://www.jodalyst.com/">Dr. Joe Steinmeyer</a>. The following Bibtex is available if you wish to cite it:</p>
|
||||
<div class="language-bibtex highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nc">@misc</span><span class="p">{</span><span class="nl">manta2023</span><span class="p">,</span>
|
||||
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="w"> </span><span class="na">author</span><span class="p">=</span><span class="s">{Fischer Moseley}</span><span class="p">,</span>
|
||||
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="na">title</span><span class="p">=</span><span class="s">{Manta: An In-Situ Debugging Tool for Programmable Hardware}</span><span class="p">,</span>
|
||||
|
|
|
|||
|
|
@ -52,6 +52,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="../stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -80,7 +82,7 @@
|
|||
<div data-md-component="skip">
|
||||
|
||||
|
||||
<a href="#latest-version" class="md-skip">
|
||||
<a href="#latest-release-recommended" class="md-skip">
|
||||
Skip to content
|
||||
</a>
|
||||
|
||||
|
|
@ -147,7 +149,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -157,7 +159,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -167,7 +169,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -179,43 +181,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -345,9 +310,18 @@
|
|||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#latest-version" class="md-nav__link">
|
||||
<a href="#latest-release-recommended" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Latest Version
|
||||
Latest Release (Recommended)
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#development-snapshot" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Development Snapshot
|
||||
</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -363,18 +337,9 @@
|
|||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#adding-manta-to-path-recommended" class="md-nav__link">
|
||||
<a href="#adding-manta-to-path-optional" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Adding Manta to Path (Recommended)
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#dependencies" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Dependencies
|
||||
Adding Manta to PATH (Optional)
|
||||
</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -415,11 +380,11 @@
|
|||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../alternatives/" class="md-nav__link">
|
||||
<a href="../use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -454,6 +419,26 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -469,24 +454,24 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -553,6 +538,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -623,10 +657,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -637,8 +671,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -650,27 +684,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
@ -718,9 +731,18 @@
|
|||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#latest-version" class="md-nav__link">
|
||||
<a href="#latest-release-recommended" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Latest Version
|
||||
Latest Release (Recommended)
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#development-snapshot" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Development Snapshot
|
||||
</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -736,18 +758,9 @@
|
|||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#adding-manta-to-path-recommended" class="md-nav__link">
|
||||
<a href="#adding-manta-to-path-optional" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Adding Manta to Path (Recommended)
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#dependencies" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Dependencies
|
||||
Adding Manta to PATH (Optional)
|
||||
</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -776,39 +789,38 @@
|
|||
<p>Before installing, make sure to upgrade your <code>pip</code> to the latest version:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>pip<span class="w"> </span>install<span class="w"> </span>--upgrade<span class="w"> </span>pip
|
||||
</span></code></pre></div>
|
||||
<h2 id="latest-version">Latest Version</h2>
|
||||
<p>You can install the latest version of Manta directly from source with:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>pip<span class="w"> </span>install<span class="w"> </span>--upgrade<span class="w"> </span>git+https://github.com/fischermoseley/manta.git
|
||||
<h2 id="latest-release-recommended">Latest Release (Recommended)</h2>
|
||||
<p>The latest release of Manta can be installed from PyPI with:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>pip<span class="w"> </span>install<span class="w"> </span>--upgrade<span class="w"> </span>manta-python
|
||||
</span></code></pre></div>
|
||||
<h2 id="development-snapshot">Development Snapshot</h2>
|
||||
<p>The latest development snapshot of Manta can be installed with:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>pip<span class="w"> </span>install<span class="w"> </span>--upgrade<span class="w"> </span>git+https://github.com/fischermoseley/manta.git
|
||||
</span></code></pre></div>
|
||||
<h2 id="editable-development-install">Editable Development Install</h2>
|
||||
<p>If you're working on the source, you might want an editable installation with some extra dependencies used for development:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/fischermoseley/manta.git
|
||||
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="nb">cd</span><span class="w"> </span>manta
|
||||
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>pip<span class="w"> </span>install<span class="w"> </span>-e<span class="w"> </span><span class="s2">".[dev]"</span>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/fischermoseley/manta.git
|
||||
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="nb">cd</span><span class="w"> </span>manta
|
||||
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>pip<span class="w"> </span>install<span class="w"> </span>-e<span class="w"> </span><span class="s2">".[dev]"</span>
|
||||
</span></code></pre></div>
|
||||
<p>Manta's hardware-in-the-loop tests rely on Amaranth's build system for programming FPGAs, which in turn rely on the open-source <code>xc3sprog</code> and <code>iceprog</code> tools for programming Xilinx and ice40 devices, respecitvely. If you'd like to run these tests locally, you may need to install these tools and have them available on your <code>PATH</code>. If you're on Linux, you may also need to add a new udev rule to give non-superuser accounts access to any connected FTDI devices. This can be done by making a new file at <code>/etc/udev/rules.d/99-ftdi-devices.rules</code>, which contains:</p>
|
||||
<div class="language-text highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>ACTION=="add", ATTR{idVendor}=="0403", ATTR{idProduct}=="6010", MODE:="666"
|
||||
<p>Manta's hardware-in-the-loop tests rely on Amaranth's build system for programming FPGAs, which in turn rely on the open-source <code>xc3sprog</code> and <code>iceprog</code> tools for programming Xilinx and ice40 devices, respecitvely. If you'd like to run these tests locally, you may need to install these tools and have them available on your <code>PATH</code>.</p>
|
||||
<p>If you're on Linux, you may also need to add a new udev rule to give non-superuser accounts access to any connected FTDI devices. This can be done by making a new file at <code>/etc/udev/rules.d/99-ftdi-devices.rules</code>, which contains:</p>
|
||||
<div class="language-text highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>ACTION=="add", ATTR{idVendor}=="0403", ATTR{idProduct}=="6010", MODE:="666"
|
||||
</span></code></pre></div>
|
||||
<p>Be sure to reload your udev rules after saving the file.</p>
|
||||
<h2 id="adding-manta-to-path-recommended">Adding Manta to Path (Recommended)</h2>
|
||||
<p>It's recommended to place Manta on your system path by adding <code>export PATH="~/.local/bin:$PATH"</code> to your <code>.bashrc</code> or <code>.zshrc</code>. This isn't strictly necessary, but it means that Manta (and any other executable Python modules) can be run as just <code>manta</code> on the command line, instead of <code>python3 -m manta</code>. If you're on Windows, this location will likely be different.</p>
|
||||
<p>Later Manta will be availabe on the PyPI lists, and you'll be able to just <code>pip install mantaray</code>, but that's not configured quite yet.</p>
|
||||
<h2 id="dependencies">Dependencies</h2>
|
||||
<p>Manta requires the following dependencies:</p>
|
||||
<p>Be sure to reload your udev rules after saving the file. On most distributions, this is accomplished with:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>udevadm<span class="w"> </span>control<span class="w"> </span>--reload-rules<span class="w"> </span><span class="o">&&</span><span class="w"> </span>udevadm<span class="w"> </span>trigger
|
||||
</span></code></pre></div>
|
||||
<h2 id="adding-manta-to-path-optional">Adding Manta to PATH (Optional)</h2>
|
||||
<p>Although optional, it is convenient to add the <code>manta</code> executable to your system's path. This allows you to invoke Manta's CLI with <code>manta</code>, rather than the more verbose <code>python3 -m manta</code>. The location of this executable depends on both your platform and if you're using a virtual environment. For example:</p>
|
||||
<ul>
|
||||
<li><a href="https://amaranth-lang.org/docs/amaranth/latest/">Amaranth HDL</a>, which comes with it's own built-in copy of Yosys.</li>
|
||||
<li><a href="https://github.com/enjoy-digital/liteeth">LiteEth</a>, for sending and receiving UDP packets on the FPGA.</li>
|
||||
<li><a href="https://pyserial.readthedocs.io/en/latest/index.html">pySerial</a>, for communicating with the FPGA over UART.</li>
|
||||
<li><a href="https://pyyaml.org/">pyYAML</a>, for parsing configuration files written in YAML.</li>
|
||||
<li><a href="https://github.com/westerndigitalcorporation/pyvcd">pyVCD</a>, for writing waveforms captured by the Logic Analyzer Core to standard Value Change Dump (VCD) files.</li>
|
||||
</ul>
|
||||
<p>As well as these dependencies for development, which are installed with the <code>[dev]</code> argument:</p>
|
||||
<ul>
|
||||
<li><a href="https://pytest.org/">Pytest</a>, for unit testing.</li>
|
||||
<li><a href="https://black.readthedocs.io/en/stable/">Black</a>, for formatting the Python source.</li>
|
||||
<li><a href="https://squidfunk.github.io/mkdocs-material/">mkdocs-material</a>, for generating the documentation site.</li>
|
||||
<li><a href="https://github.com/amaranth-lang/amaranth-boards">amaranth_boards</a>, for building designs for hardware-in-the-loop testing done by the CI.</li>
|
||||
<li>
|
||||
<p>Windows: <code>%APPDATA%\Python\Scripts</code>, or <code>path\to\venv\Scripts</code> if using a virtual environment.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>macOS/Linux/BSD: <code>$HOME/.local/bin</code>, or <code>path\to\venv\bin</code> if using a virtual environment.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>This also adds any other Python scripts exposed by your installed packages to your PATH.</p>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
<link rel="canonical" href="https://fischermoseley.github.io/manta/dev/io_core/">
|
||||
|
||||
|
||||
<link rel="prev" href="../architecture/">
|
||||
<link rel="prev" href="../similar_tools/">
|
||||
|
||||
|
||||
<link rel="next" href="../logic_analyzer_core/">
|
||||
|
|
@ -52,6 +52,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="../stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -147,7 +149,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -157,7 +159,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -167,7 +169,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -179,43 +181,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -343,11 +308,11 @@
|
|||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../alternatives/" class="md-nav__link">
|
||||
<a href="../use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -380,6 +345,26 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -397,24 +382,24 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
|
||||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -482,22 +467,22 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#python-api" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Python API
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Python API">
|
||||
<nav class="md-nav" aria-label="Configuration">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example" class="md-nav__link">
|
||||
<a href="#verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Example
|
||||
Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#amaranth-native-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Amaranth-Native Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -509,12 +494,60 @@
|
|||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#limitations" class="md-nav__link">
|
||||
<a href="#operation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Limitations
|
||||
Operation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#python-api-documentation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Python API Documentation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Python API Documentation">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.IOCore" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code> IOCore
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label=" IOCore">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.IOCore.get_probe" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code> get_probe
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.IOCore.set_probe" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code> set_probe
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -568,6 +601,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -638,10 +720,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -652,8 +734,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -665,27 +747,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
@ -748,22 +809,22 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#python-api" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Python API
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Python API">
|
||||
<nav class="md-nav" aria-label="Configuration">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example" class="md-nav__link">
|
||||
<a href="#verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Example
|
||||
Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#amaranth-native-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Amaranth-Native Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -775,12 +836,60 @@
|
|||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#limitations" class="md-nav__link">
|
||||
<a href="#operation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Limitations
|
||||
Operation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#python-api-documentation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Python API Documentation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Python API Documentation">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.IOCore" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code> IOCore
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label=" IOCore">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.IOCore.get_probe" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code> get_probe
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.IOCore.set_probe" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code> set_probe
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -804,82 +913,267 @@
|
|||
<h1>IO Core</h1>
|
||||
|
||||
<h2 id="overview">Overview</h2>
|
||||
<p>Registers are a fundamental building block of digital hardware, and the IO core provides a simple way of interacting with them from the host machine. It allows you to define a set of inputs and outputs of arbitrary width, and then set values to the outputs and read values from the inputs.</p>
|
||||
<p>This is a very, very simple task - and while configuration is straightforward, there are a few caveats. More on both topics below:</p>
|
||||
<p>Registers are a fundamental building block of digital hardware, and the IO core provides a simple way of interacting with them from the host machine. It allows you to define inputs and outputs of arbitrary width, and then write values to the outputs and read values from the inputs.</p>
|
||||
<p>This is a very, very simple task - however it's surprisingly useful in practice. Both the <a href="../use_cases">Use Cases</a> page and the repository's <a href="https://github.com/fischermoseley/manta/tree/main/examples">examples</a> folder contain examples of the IO Core for your reference.</p>
|
||||
<div class="admonition warning">
|
||||
<p class="admonition-title">It's not instantaneous!</p>
|
||||
<p>If you're trying to read or write values in your design with cycle-accurate timing, this will not do that for you. The time taken by Python to evaluate an expression is not constant, nor is the amount of time it takes for your OS to put bytes on the wire. If you need cycle-accurate timing, the <a href="../logic_analyzer_core/">Logic Analyzer Core</a> and it's <a href="../logic_analyzer_core/#playback">Playback feature</a> may be helpful.</p>
|
||||
</div>
|
||||
<h2 id="configuration">Configuration</h2>
|
||||
<p>Just like the rest of the cores, the IO core is configured via an entry in a project's configuration file. This is easiest to show by example:</p>
|
||||
<p>As explained in the <a href="../getting_started">getting started</a> page, the IO Core must be configured and included in the FPGA design before it can be operated. Configuration is performed differently depending on if you're using a traditional Verilog-based workflow, or if you're building an Amaranth-native design.</p>
|
||||
<h3 id="verilog-based-workflows">Verilog-Based Workflows</h3>
|
||||
<p>The IO Core is used by adding an entry in a <code>cores</code> section of a configuration file. This is best shown by example:</p>
|
||||
<p><div class="language-yaml highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nn">---</span>
|
||||
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nt">my_io_core</span><span class="p">:</span>
|
||||
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">io</span>
|
||||
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
|
||||
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="w"> </span><span class="nt">inputs</span><span class="p">:</span>
|
||||
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="w"> </span><span class="nt">kermit</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3</span>
|
||||
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="w"> </span><span class="nt">piggy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
|
||||
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="nt">animal</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">38</span>
|
||||
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="w"> </span><span class="nt">scooter</span><span class="p">:</span>
|
||||
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="w"> </span><span class="nt">width</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">4</span>
|
||||
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="w"> </span><span class="nt">initial_value</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">13</span>
|
||||
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>
|
||||
</span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a><span class="w"> </span><span class="nt">outputs</span><span class="p">:</span>
|
||||
</span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a><span class="w"> </span><span class="nt">fozzy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
|
||||
</span><span id="__span-0-15"><a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a><span class="w"> </span><span class="nt">gonzo</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3</span>
|
||||
</span><span id="__span-0-16"><a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a>
|
||||
</span><span id="__span-0-17"><a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a><span class="w"> </span><span class="nt">user_clock</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">True</span>
|
||||
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nt">cores</span><span class="p">:</span>
|
||||
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="nt">my_io_core</span><span class="p">:</span>
|
||||
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">io</span>
|
||||
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>
|
||||
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="w"> </span><span class="nt">inputs</span><span class="p">:</span>
|
||||
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="w"> </span><span class="nt">kermit</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3</span>
|
||||
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="nt">piggy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
|
||||
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="w"> </span><span class="nt">animal</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">38</span>
|
||||
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="w"> </span><span class="nt">scooter</span><span class="p">:</span>
|
||||
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="w"> </span><span class="nt">width</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">4</span>
|
||||
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a><span class="w"> </span><span class="nt">initial_value</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">13</span>
|
||||
</span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a>
|
||||
</span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a><span class="w"> </span><span class="nt">outputs</span><span class="p">:</span>
|
||||
</span><span id="__span-0-15"><a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a><span class="w"> </span><span class="nt">fozzy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
|
||||
</span><span id="__span-0-16"><a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a><span class="w"> </span><span class="nt">gonzo</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3</span>
|
||||
</span></code></pre></div>
|
||||
Inside this configuration, the following parameters may be configured:</p>
|
||||
Inside this configuration, the following parameters may be set:</p>
|
||||
<ul>
|
||||
<li><code>name</code> <em>(required)</em>: The name of the IO core. This name is used to reference the core when working with the API, and can be whatever you'd like.</li>
|
||||
<li><code>name</code> <em>(required)</em>: The name of the IO core, which is used when working with the API.</li>
|
||||
<li><code>type</code> <em>(required)</em>: This denotes that this is an IO core. All cores contain a <code>type</code> field, which must be set to <code>io</code> to be recognized as an IO core.</li>
|
||||
<li><code>inputs</code> <em>(optional)</em>: This lists all inputs from from the FPGA fabric to the host machine. Signals in this list may be read by the host, but <strong><em>cannot</em></strong> be written to. Technically specifying input probes is totally optional - it's perfectly fine to have an IO core with only output probes.</li>
|
||||
<li><code>outputs</code> <em>(optional)</em>: This lists all outputs from the host machine to the FPGA fabric. Signals in this list are usually written to by the host, but they can also be read from. Doing so returns the value last written to the register. Just like the <code>inputs</code> parameter, this list is technically optional, and it's perfectly valid to have an IO core with input probes only.<ul>
|
||||
<li><code>initial_value</code> <em>(optional)</em>: This sets an initial value for an output probe to take after the FPGA powers on. This is done with an <code>initial</code> statement in Manta's Verilog, and is independent of the input clock or resets elsewhere in the FPGA. This parameter is optional, and if it isn't provided the probe will initialize to zero.</li>
|
||||
<li><code>inputs</code> <em>(optional)</em>: This lists all inputs from from the FPGA fabric to the host machine. Signals in this list may be read by the host, but <strong><em>cannot</em></strong> be written to. This parameter is somewhat optional as an IO Core must have at least one probe, but it need not be an input.</li>
|
||||
<li><code>outputs</code> <em>(optional)</em>: This lists all outputs from the host machine to the FPGA fabric. Signals in this list are usually written to by the host, but they can also be read from. Doing so returns the value last written to the register. This parameter is somewhat optional as an IO Core must have at least one probe, but it need not be an output.<ul>
|
||||
<li><code>initial_value</code> <em>(optional)</em>: This sets an initial value for an output probe to take after the FPGA powers on. This is done with an <code>initial</code> statement in Manta's Verilog, and is independent of the input clock or resets elsewhere in the FPGA. This parameter is optional, and defaults to zero.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code>user_clock</code> <em>(optional)</em>: If set to True, an extra input port will be added to the <code>manta</code> module for an clock input to run the IO core on. This lets the IO Core handle clock domain crossing through its internal buffers. If set to False, Manta will run the IO core from its internal clock (the one provided through <code>manta</code>'s <code>clk</code> port). More information on this is available in the <a href="#how-it-works">diagram</a> below. This parameter is optional, and defaults to False.</li>
|
||||
</ul>
|
||||
<!-- - `user_clock` _(optional)_: If set to True, an extra input port will be added to the `manta` module for an clock input to run the IO core on. This lets the IO Core handle clock domain crossing through its internal buffers. If set to False, Manta will run the IO core from its internal clock (the one provided through `manta`'s `clk` port). This parameter is optional, and defaults to False. More information is available in the [architecture](../architecture#io-core) page. -->
|
||||
|
||||
<div class="admonition warning">
|
||||
<p class="admonition-title">Name things carefully!</p>
|
||||
<p>The names of the core and its probes are referenced in the autogenerated Verilog. This means that while the names can be arbitrary, they must be unique within your project and not contain any characters that your synthesis engine won't appreciate.</p>
|
||||
</div>
|
||||
<h2 id="python-api">Python API</h2>
|
||||
<p>The IO core functionality is stored in the <code>Manta.IOCore</code> class in <a href="https://github.com/fischermoseley/manta/blob/main/src/manta/io_core.py">src/manta/io_core/__init__.py</a>, and it may be controlled with the two functions:</p>
|
||||
<hr />
|
||||
<p><code>Manta.IOCore.set_probe(name, data)</code></p>
|
||||
<ul>
|
||||
<li>[<code>string</code>] <em>name</em>: The probe to write to. Must not be an output port, and must match the name provided in the config file.</li>
|
||||
<li>[<code>int</code>, <code>bool</code>] <em>data</em>: The value to write to an output probe. May be signed or unsigned, but will raise an exception if the value is too large for the width of the port.</li>
|
||||
<li><em>returns</em>: None</li>
|
||||
</ul>
|
||||
<p>This method is blocking. When called it will dispatch a request to the FPGA, and halt execution until the request has been sent.</p>
|
||||
<hr />
|
||||
<p><code>Manta.IOCore.get_probe(name)</code></p>
|
||||
<ul>
|
||||
<li>[<code>string</code>] <em>name</em>: The probe to read from. May be either an input or an output port, and must match the name provided in the config file.</li>
|
||||
<li><em>returns</em>: The value of an input or output probe. In the case of an output probe, the value returned will be the last value written to the probe.</li>
|
||||
</ul>
|
||||
<p>This method is blocking. When called it will dispatch a request to the FPGA, and halt execution until the request has been sent and a response has been received.</p>
|
||||
<hr />
|
||||
<h3 id="example">Example</h3>
|
||||
<p>A small example is shown below, using the <a href="#configuration">example configuration</a> above. More extensive examples can also be found in the repository's <a href="https://github.com/fischermoseley/manta/tree/main/examples">examples/</a> folder.</p>
|
||||
<div class="language-python highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="o">>>></span> <span class="kn">import</span> <span class="nn">Manta</span>
|
||||
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="o">>>></span> <span class="n">m</span> <span class="o">=</span> <span class="n">Manta</span>
|
||||
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="o">>>></span> <span class="n">m</span><span class="o">.</span><span class="n">my_io_core</span><span class="o">.</span><span class="n">set_probe</span><span class="p">(</span><span class="s2">"fozzy"</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="o">>>></span> <span class="n">m</span><span class="o">.</span><span class="n">my_io_core</span><span class="o">.</span><span class="n">get_probe</span><span class="p">(</span><span class="s2">"fozzy"</span><span class="p">)</span>
|
||||
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="kc">True</span>
|
||||
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="o">>>></span> <span class="n">m</span><span class="o">.</span><span class="n">my_io_core</span><span class="o">.</span><span class="n">set_probe</span><span class="p">(</span><span class="s2">"gonzo"</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
|
||||
</span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="o">>>></span> <span class="n">m</span><span class="o">.</span><span class="n">my_io_core</span><span class="o">.</span><span class="n">get_probe</span><span class="p">(</span><span class="s2">"scooter"</span><span class="p">)</span>
|
||||
</span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="mi">5</span>
|
||||
<h3 id="amaranth-native-designs">Amaranth-Native Designs</h3>
|
||||
<p>Since Amaranth modules are Python objects, the configuration of the IO Core is given by the arguments given during initialization. See the documentation for the <code>IOCore</code> <a href="#manta.IOCore">class constructor</a> below, as well as the Amaranth <a href="https://github.com/fischermoseley/manta/tree/main/examples/amaranth">examples</a> in the repo.</p>
|
||||
<h2 id="operation">Operation</h2>
|
||||
<p>Regardless of the technique you used to configure your IO Core, it is operated using the <a href="#manta.IOCore.set_probe"><code>set_probe()</code></a> and <a href="#manta.IOCore.get_probe"><code>get_probe()</code></a> methods. Documentation for these methods is available below.</p>
|
||||
<p>These methods are members of the <code>IOCore</code> class, so if you're using Manta in a Verilog-based workflow, you'll first need to obtain a <code>Manta</code> object that contains an <code>IOCore</code> member. This is done with <code>Manta.from_config()</code>, as shown in the Verilog <a href="https://github.com/fischermoseley/manta/tree/main/examples/verilog">examples</a>.</p>
|
||||
<h2 id="python-api-documentation">Python API Documentation</h2>
|
||||
|
||||
|
||||
<div class="doc doc-object doc-class">
|
||||
|
||||
|
||||
|
||||
<h3 id="manta.IOCore" class="doc doc-heading">
|
||||
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">manta.IOCore</span>
|
||||
|
||||
|
||||
</h3>
|
||||
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">IOCore</span><span class="p">(</span><span class="n">inputs</span><span class="o">=</span><span class="p">[],</span> <span class="n">outputs</span><span class="o">=</span><span class="p">[])</span>
|
||||
</span></code></pre></div>
|
||||
<h2 id="limitations">Limitations</h2>
|
||||
<p>While the IO core performs a very, very simple task, it carries a few caveats.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>First, <strong>it's not instantaneous</strong>. Manta has designed to be as fast as possible, but setting and querying registers relies on passing messages between the host and FPGA, which is slow relative to FPGA clock speeds! If you're trying to set values in your design with cycle-accurate timing, this will not do that for you. However, the <a href="../logic_analyzer_core/#playback">Logic Analyzer's playback feature</a> might be helpful.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Second, <strong>the API methods are blocking</strong>, and will wait for a response from the FPGA before resuming program execution. Depending on your application, you might want to run your IO Core operations in a separate thread, but you can also decrease the execution time by using a faster interface between the host and FPGA. This means using a higher UART baudrate, or using Ethernet.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="doc doc-contents first">
|
||||
|
||||
|
||||
<p>A synthesizable module for setting and getting the values of registers of
|
||||
arbitrary size.</p>
|
||||
|
||||
<p>Create an IO Core, with the given input and output probes.</p>
|
||||
<p>This function is the main mechanism for configuring an IO Core in an
|
||||
Amaranth-native design.</p>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Parameters:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>inputs</code></b>
|
||||
(<code>Optional[List[<span title="amaranth.Signal">Signal</span>]]</code>, default:
|
||||
<code>[]</code>
|
||||
)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>A list of
|
||||
Amaranth Signals to use as inputs. Defaults to an empty list.
|
||||
This parameter is somewhat optional as an IO Core must have
|
||||
at least one probe, but it need not be an input.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>outputs</code></b>
|
||||
(<code>Optional[List[<span title="amaranth.Signal">Signal</span>]]</code>, default:
|
||||
<code>[]</code>
|
||||
)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>A list of
|
||||
Amaranth Signals to use as outputs. Defaults to an empty list.
|
||||
This parameter is somewhat optional as an IO Core must have
|
||||
at least one probe, but it need not be an output.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="doc doc-children">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="doc doc-object doc-function">
|
||||
|
||||
|
||||
<h4 id="manta.IOCore.get_probe" class="doc doc-heading">
|
||||
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">get_probe</span>
|
||||
|
||||
|
||||
</h4>
|
||||
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">get_probe</span><span class="p">(</span><span class="n">probe</span><span class="p">)</span>
|
||||
</span></code></pre></div>
|
||||
|
||||
<div class="doc doc-contents ">
|
||||
|
||||
<p>Get the value of an input or output probe on the FPGA.</p>
|
||||
<p>If called on an output probe, this function will return the last value
|
||||
written to the output probe. If no value has been written to the output
|
||||
probe, then it will return the probe's initial value. This method is
|
||||
blocking.</p>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Parameters:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>probe</code></b>
|
||||
(<code>str | <span title="amaranth.Signal">Signal</span></code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The probe to get the value of. This
|
||||
may be either a string containing the name of the probe, or the
|
||||
Amaranth Signal representing the probe itself. Strings are
|
||||
typically used in Verilog-based workflows, and Amaranth Signals
|
||||
are typically used in Amaranth-native designs.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Returns:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>value</code></b> ( <code>int</code>
|
||||
) –
|
||||
<div class="doc-md-description">
|
||||
<p>The value of the probe, interpreted as an unsigned
|
||||
integer.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Raises:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<code>ValueError</code>
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The probe was not found in the IO Core, or many probes
|
||||
were found with the same name.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="doc doc-object doc-function">
|
||||
|
||||
|
||||
<h4 id="manta.IOCore.set_probe" class="doc doc-heading">
|
||||
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">set_probe</span>
|
||||
|
||||
|
||||
</h4>
|
||||
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">set_probe</span><span class="p">(</span><span class="n">probe</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
||||
</span></code></pre></div>
|
||||
|
||||
<div class="doc doc-contents ">
|
||||
|
||||
<p>Set the value of an output probe on the FPGA.</p>
|
||||
<p>This method is blocking.</p>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Parameters:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>probe</code></b>
|
||||
(<code>str | <span title="amaranth.Signal">Signal</span></code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The output probe to set the value
|
||||
of. This may be either a string containing the name of the
|
||||
probe, or the Amaranth Signal representing the probe itself.
|
||||
Strings are typically used in Verilog-based workflows, and
|
||||
Amaranth Signals are typically used in Amaranth-native designs.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>value</code></b>
|
||||
(<code>int</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The value to set the probe to. This may be either
|
||||
positive or negative, but must fit within the width of the
|
||||
probe.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Returns:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>None</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Raises:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<code>ValueError</code>
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The probe was not found to be an output of the IO Core,
|
||||
or many probes were found with the same name.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -52,6 +52,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="../stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -147,7 +149,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -157,7 +159,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -167,7 +169,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -179,43 +181,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -343,11 +308,11 @@
|
|||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../alternatives/" class="md-nav__link">
|
||||
<a href="../use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -380,6 +345,26 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -397,24 +382,24 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
|
||||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -515,6 +500,15 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#on-chip-implementation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
On-Chip Implementation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
|
|
@ -528,27 +522,70 @@
|
|||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#on-chip-implementation" class="md-nav__link">
|
||||
<a href="#verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
On-Chip Implementation
|
||||
Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#python-api" class="md-nav__link">
|
||||
<a href="#amaranth-native-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Python API
|
||||
Amaranth-Native Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#operation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Operation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#python-api-documentation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Python API Documentation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Python API Documentation">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.MemoryCore" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code> MemoryCore
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label=" MemoryCore">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.MemoryCore.read" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code> read
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#synchronicity" class="md-nav__link">
|
||||
<a href="#manta.MemoryCore.write" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Synchronicity
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code> write
|
||||
</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -557,6 +594,11 @@
|
|||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -568,6 +610,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -638,10 +729,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -652,8 +743,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -665,27 +756,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
@ -739,6 +809,15 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#on-chip-implementation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
On-Chip Implementation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
|
|
@ -752,27 +831,70 @@
|
|||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#on-chip-implementation" class="md-nav__link">
|
||||
<a href="#verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
On-Chip Implementation
|
||||
Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#python-api" class="md-nav__link">
|
||||
<a href="#amaranth-native-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Python API
|
||||
Amaranth-Native Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#operation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Operation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#python-api-documentation" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Python API Documentation
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Python API Documentation">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.MemoryCore" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code> MemoryCore
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label=" MemoryCore">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.MemoryCore.read" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code> read
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#synchronicity" class="md-nav__link">
|
||||
<a href="#manta.MemoryCore.write" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Synchronicity
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code> write
|
||||
</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -781,6 +903,11 @@
|
|||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -804,10 +931,19 @@
|
|||
<h1>Memory Core</h1>
|
||||
|
||||
<h2 id="overview">Overview</h2>
|
||||
<p>Memory is the de facto means of storing data on FPGAs when the space needed exceeds a few registers. As a result, Manta provides a Memory core, which instantiates a dual-port RAM on the FPGA. One port is provided to the host, and the other is connected to your logic with the standard RAM interface (<code>addr</code>, <code>data_in</code>, <code>data_out</code>, <code>write_enable</code>). This allows the host to provide reasonably large amounts of data to user logic - or the other way around, or a mix of both!</p>
|
||||
<p>This is a very, very simple task - and while configuration is straightforward, there are a few caveats. More on both topics below:</p>
|
||||
<p>Memory is used to store data when the space needed exceeds a few registers. As a result, Manta provides a Memory core, which instantiates a dual-port RAM on the FPGA. One port is provided to the host, and the other is connected to your logic with a simple <code>addr</code>/<code>data_in</code>/<code>data_out</code>/<code>write_enable</code> interface. This allows the host machine to exchange larger amounts of data with your logic on the FPGA.</p>
|
||||
<p>This is a very, very simple task - however it's surprisingly useful in practice. Both the <a href="../use_cases">Use Cases</a> page and the repository's <a href="https://github.com/fischermoseley/manta/tree/main/examples">examples</a> folder contain examples of the Memory Core for your reference.</p>
|
||||
<p>Manta won't impose any limit on the width or depth of the memory you instantiate, but you will be limited by the available resources and timing properties of your FPGA.</p>
|
||||
<div class="admonition warning">
|
||||
<p class="admonition-title">Words update 16 bits at a time!</p>
|
||||
<p>Due to the structure of Manta's internal bus, the Memory core only updates 16 bits of a word at a time. For instance, writing a new value to a 33-bit wide memory would update bits 0-15 on one clock cycle, bits 16-31 on another, and bit 32 on another still. Manta makes no guaruntees about the time taken between each of these updates. If this is a problem for your application, consider using an IO Core as a doorbell to signal when the memory is valid, or ping-pong between two Memory Cores.</p>
|
||||
</div>
|
||||
<h2 id="on-chip-implementation">On-Chip Implementation</h2>
|
||||
<p>Manta will make a best-effort attempt to implement the memory in Block RAM, if it is available on the device. This is done by exporting Verilog that synthesis tools should infer as Block RAMs, however this inference is not guarunteed. Depending on your toolchain and the FPGA's architecture, the Verilog produced by Manta may be implemented as FF RAM, LUT (Distributed) RAM, or something else. These memory types are well explained in the <a href="https://yosyshq.readthedocs.io/projects/yosys/en/latest/using_yosys/synthesis/memory.html">Yosys documentation</a>, but be sure to check your toolchain's documentation as well.</p>
|
||||
<h2 id="configuration">Configuration</h2>
|
||||
<p>Just like the rest of the cores, the Memory core is configured via an entry in a project's configuration file. This is easiest to show by example:</p>
|
||||
<p>As explained in the <a href="../getting_started">getting started</a> page, the Memory Core must be configured and included in the FPGA design before it can be operated. Configuration is performed differently depending on if you're using a traditional Verilog-based workflow, or if you're building an Amaranth-native design.</p>
|
||||
<h3 id="verilog-based-workflows">Verilog-Based Workflows</h3>
|
||||
<p>The Memory Core is used by adding an entry in a <code>cores</code> section of a configuration file. This is best shown by example:</p>
|
||||
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nn">---</span>
|
||||
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nt">cores</span><span class="p">:</span>
|
||||
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="nt">my_memory</span><span class="p">:</span>
|
||||
|
|
@ -816,42 +952,232 @@
|
|||
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="w"> </span><span class="nt">width</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">12</span>
|
||||
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="w"> </span><span class="nt">depth</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">16384</span>
|
||||
</span></code></pre></div>
|
||||
<p>There's a few parameters that get configured here, including:</p>
|
||||
<p>Inside this configuration, the following parameters may be set:</p>
|
||||
<ul>
|
||||
<li><code>name</code>: The name of the Memory core. This name is used to reference the core when working with the API, and can be whatever you'd like.</li>
|
||||
<li><code>name</code>: The name of the Memory core, which is used when working with the API.</li>
|
||||
<li><code>type</code>: This denotes that this is a Memory core. All cores contain a <code>type</code> field, which must be set to <code>memory</code> to be recognized as an Memory core.</li>
|
||||
<li><code>mode</code>: The mode for the Memory core to operate in. This must be one of <code>bidirectional</code>, <code>host_to_fpga</code>, or <code>fpga_to_host</code>. Bidirectional memories can be both read or written to by the host and FPGA, but they require the use of a True Dual Port RAM, which is not available on all platforms (most notably, the ice40). Host-to-fpga and fpga-to-host RAMs only require a Simple Dual Port RAM, which is available on nearly all platforms.</li>
|
||||
<li><code>width</code>: The width of the Memory core, in bits.</li>
|
||||
<li><code>depth</code>: The depth of the Memory core, in entries.</li>
|
||||
</ul>
|
||||
<p>Manta won't impose any limit on the width or depth of the memory you instantiate, but since Manta instantiates BRAM primitives on the FPGA, you will be limited by what your FPGA can support. It helps to know your particular FPGA's architecture here.</p>
|
||||
<h3 id="on-chip-implementation">On-Chip Implementation</h3>
|
||||
<p>For most use cases, Manta will choose to implement the memory in Block RAM, if it is available on the device. However, the Verilog produced by Manta may be inferred to a number of memory types, including FF RAM or LUT (Distributed) RAM. For more information on how this is chosen, please refer to the <a href="https://yosyshq.readthedocs.io/projects/yosys/en/latest/CHAPTER_Memorymap.html">Yosys documentation</a>.</p>
|
||||
<h3 id="python-api">Python API</h3>
|
||||
<p>The Memory core functionality is stored in the <code>Manta.MemoryCore</code> classes in <a href="https://github.com/fischermoseley/manta/blob/main/src/manta/memory_core.py">src/manta/memory_core.py</a>, and it may be controlled with the two functions:</p>
|
||||
<p>Just like with the other cores, interfacing with the Memory with the Python API is simple:</p>
|
||||
<div class="language-python highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kn">from</span> <span class="nn">manta</span> <span class="kn">import</span> <span class="n">Manta</span>
|
||||
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="n">m</span> <span class="o">=</span> <span class="n">manta</span><span class="p">(</span><span class="s1">'manta.yaml'</span><span class="p">)</span>
|
||||
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
|
||||
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="n">m</span><span class="o">.</span><span class="n">my_memory</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">addr</span><span class="o">=</span><span class="mi">38</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="mi">600</span><span class="p">)</span>
|
||||
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="n">m</span><span class="o">.</span><span class="n">my_memory</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">addr</span><span class="o">=</span><span class="mh">0x1234</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="mb">0b100011101011</span><span class="p">)</span>
|
||||
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="n">m</span><span class="o">.</span><span class="n">my_memory</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="mh">0x0612</span><span class="p">,</span> <span class="mh">0x2001</span><span class="p">)</span>
|
||||
</span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a>
|
||||
</span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="n">foo</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">my_memory</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">addr</span><span class="o">=</span><span class="mi">38</span><span class="p">)</span>
|
||||
</span><span id="__span-1-9"><a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="n">foo</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">my_memory</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">addr</span><span class="o">=</span><span class="mi">1234</span><span class="p">)</span>
|
||||
</span><span id="__span-1-10"><a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="n">foo</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">my_memory</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="mh">0x0612</span><span class="p">)</span>
|
||||
<h3 id="amaranth-native-designs">Amaranth-Native Designs</h3>
|
||||
<p>Since Amaranth modules are Python objects, the configuration of the Memory Core is given by the arguments given during initialization. See the documentation for the <code>MemoryCore</code> <a href="#manta.MemoryCore">class constructor</a> below, as well as the Amaranth <a href="https://github.com/fischermoseley/manta/tree/main/examples/amaranth">examples</a> in the repo.</p>
|
||||
<h2 id="operation">Operation</h2>
|
||||
<p>Regardless of the technique you used to configure your Memory Core, it is operated using the <a href="#manta.MemoryCore.read"><code>read()</code></a> and <a href="#manta.MemoryCore.write"><code>write()</code></a> methods. Documentation for these methods is available below.</p>
|
||||
<p>These methods are members of the <code>MemoryCore</code> class, so if you're using Manta in a Verilog-based workflow, you'll first need to obtain a <code>Manta</code> object that contains an <code>MemoryCore</code> member. This is done with <code>Manta.from_config()</code>, as shown in the Verilog <a href="https://github.com/fischermoseley/manta/tree/main/examples/verilog">examples</a>.</p>
|
||||
<h2 id="python-api-documentation">Python API Documentation</h2>
|
||||
|
||||
|
||||
<div class="doc doc-object doc-class">
|
||||
|
||||
|
||||
|
||||
<h3 id="manta.MemoryCore" class="doc doc-heading">
|
||||
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">manta.MemoryCore</span>
|
||||
|
||||
|
||||
</h3>
|
||||
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">MemoryCore</span><span class="p">(</span><span class="n">mode</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">depth</span><span class="p">)</span>
|
||||
</span></code></pre></div>
|
||||
<p>Reading/writing in batches is also supported. This is recommended where possible, as reads are massively sped up by performing them in bulk:</p>
|
||||
<div class="language-python highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="n">addrs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1234</span><span class="p">))</span>
|
||||
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="n">datas</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">1234</span><span class="p">,</span> <span class="mi">2468</span><span class="p">))</span>
|
||||
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="n">m</span><span class="o">.</span><span class="n">my_memory</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">addrs</span><span class="p">,</span> <span class="n">datas</span><span class="p">)</span>
|
||||
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>
|
||||
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="n">foo</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">my_memory</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">addrs</span><span class="p">)</span>
|
||||
|
||||
<div class="doc doc-contents first">
|
||||
|
||||
|
||||
<p>A synthesizable module for accessing a memory. This is accomplished by
|
||||
instantiating a dual-port memory with one end tied to Manta's internal bus,
|
||||
and the other provided to user logic.</p>
|
||||
|
||||
<p>Create a Memory Core with the given width and depth.</p>
|
||||
<p>This function is the main mechanism for configuring a Memory Core in an
|
||||
Amaranth-native design.</p>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Parameters:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>mode</code></b>
|
||||
(<code>str</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>Must be one of <code>bidirectional</code>, <code>host_to_fpga</code>, or
|
||||
'fpga_to_host'. Bidirectional memories can be both read or
|
||||
written to by the host and FPGA, but they require the use
|
||||
of a True Dual Port RAM, which is not available on all
|
||||
platforms (most notably, the ice40). Host-to-fpga and
|
||||
fpga-to-host RAMs only require a Simple Dual Port RAM, which
|
||||
is available on nearly all platforms.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>width</code></b>
|
||||
(<code>int</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The width of the memory, in bits.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>depth</code></b>
|
||||
(<code>int</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The depth of the memory, in entries.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="doc doc-children">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="doc doc-object doc-function">
|
||||
|
||||
|
||||
<h4 id="manta.MemoryCore.read" class="doc doc-heading">
|
||||
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">read</span>
|
||||
|
||||
|
||||
</h4>
|
||||
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">read</span><span class="p">(</span><span class="n">addrs</span><span class="p">)</span>
|
||||
</span></code></pre></div>
|
||||
<h3 id="synchronicity">Synchronicity</h3>
|
||||
<p>Since Manta's <a href="../architecture/#data-bus">data bus</a> is only 16-bits wide, it's only possible to manipulate the Memory core in 16-bit increments. This means that if you have a RAM that's ≤16 bits wide, you'll only need to issue a single bus transaction to read/write one entry in the RAM. However, if you have a RAM that's ≥16 bits wide, you'll need to issue a bus transaction to update each 16-bit slice of it. For instance, updating a single entry in a 33-bit wide RAM would require sending 3 messages to the FPGA: one for bits 1-16, another for bits 17-32, and one for bit 33. If your application expects each RAM entry to update instantaneously, this could be problematic.</p>
|
||||
<p>There's a few different ways to solve this - you could use an IO core to signal when a RAM's contents or valid - or you could ping-pong between two RAMs while one is being modified. The choice is yours, and Manta makes no attempt to prescribe any particular approach.</p>
|
||||
<p>Lastly, the interface you use (and to a lesser extent, your operating system) will determine the space between bus transactions. For instance, 100Mbit Ethernet is a thousand times faster than 115200bps UART, so the time where the RAM is invalid is a thousand times smaller.</p>
|
||||
|
||||
<div class="doc doc-contents ">
|
||||
|
||||
<p>Read the data stored in the Memory Core at one or many address.</p>
|
||||
<p>This function can read from either one or multiple addresses at a time.
|
||||
Due to the the IO latency in most OSes, a single multi-address read is
|
||||
significantly faster than multiple single-address reads. Prefer their
|
||||
usage where possible. This method is blocking.</p>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Parameters:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>addrs</code></b>
|
||||
(<code>int | List[int]</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The memory address (or addresses) to read
|
||||
from.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Returns:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>datas</code></b> ( <code>int | List[int]</code>
|
||||
) –
|
||||
<div class="doc-md-description">
|
||||
<p>The data stored at the address (or
|
||||
addresses), represented as an unsigned integer.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Raises:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<code>TypeError</code>
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>addrs is not an integer or list of integers.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="doc doc-object doc-function">
|
||||
|
||||
|
||||
<h4 id="manta.MemoryCore.write" class="doc doc-heading">
|
||||
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">write</span>
|
||||
|
||||
|
||||
</h4>
|
||||
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">write</span><span class="p">(</span><span class="n">addrs</span><span class="p">,</span> <span class="n">datas</span><span class="p">)</span>
|
||||
</span></code></pre></div>
|
||||
|
||||
<div class="doc doc-contents ">
|
||||
|
||||
<p>Write data to the Memory core at one or many addresses.</p>
|
||||
<p>This function can write to either one or multiple addresses at a time.
|
||||
Due to the the IO latency in most OSes, a single multi-address write is
|
||||
significantly faster than multiple single-address write. Prefer their
|
||||
usage where possible. This method is blocking.</p>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Parameters:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>addrs</code></b>
|
||||
(<code>int | List[int]</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The memory address (or addresses) to write
|
||||
to.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>datas</code></b>
|
||||
(<code>int | List[int]</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The data to store at the address (or
|
||||
addresses). This may be either positive or negative, but must
|
||||
fit within the width of the memory.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Returns:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>None</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Raises:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<code>TypeError</code>
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>addrs or datas is not an integer or list of integers.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Binary file not shown.
File diff suppressed because one or more lines are too long
|
|
@ -12,13 +12,13 @@
|
|||
<meta name="author" content="Fischer Moseley">
|
||||
|
||||
|
||||
<link rel="canonical" href="https://fischermoseley.github.io/manta/dev/alternatives/">
|
||||
<link rel="canonical" href="https://fischermoseley.github.io/manta/dev/similar_tools/">
|
||||
|
||||
|
||||
<link rel="prev" href="../getting_started/">
|
||||
<link rel="prev" href="../architecture/">
|
||||
|
||||
|
||||
<link rel="next" href="../architecture/">
|
||||
<link rel="next" href="../io_core/">
|
||||
|
||||
|
||||
<link rel="icon" href="../assets/logo_ray_only_with_shadow.png">
|
||||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
|
||||
|
||||
<title>Alternatives - Manta Documentation</title>
|
||||
<title>Similar Tools - Manta Documentation</title>
|
||||
|
||||
|
||||
|
||||
|
|
@ -52,6 +52,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="../stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -131,7 +133,7 @@
|
|||
<div class="md-header__topic" data-md-component="header-topic">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Alternatives
|
||||
Similar Tools
|
||||
|
||||
</span>
|
||||
</div>
|
||||
|
|
@ -147,7 +149,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -157,7 +159,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -167,7 +169,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -179,43 +181,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -340,6 +305,46 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../architecture/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Architecture
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -354,7 +359,7 @@
|
|||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -365,7 +370,7 @@
|
|||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -518,26 +523,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../architecture/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Architecture
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -553,24 +538,24 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -637,6 +622,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -707,10 +741,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -721,8 +755,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -734,27 +768,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
@ -939,9 +952,11 @@
|
|||
|
||||
|
||||
|
||||
<h1>Alternatives</h1>
|
||||
<h1>Similar Tools</h1>
|
||||
|
||||
<p>There's quite a few FPGA debugging tools out there, and it may happen that your needs are better met by another tool! This section aims to provide a list of alternatives, in hopes that you're able to be confident in your debugging flow.</p>
|
||||
<p>This page contains a list of tools similar to Manta, either in function or intention. This is meant to provide a useful comparison to other tools that you may be more familiar with, in hopes of a smoother experience integrating Manta into your project.</p>
|
||||
<p>That said, Manta is by no means feature-complete, and there may be an alternative tool listed on this page that better fits your use case. If that is the case, we encourage you to use that tool (although do consider filing a <a href="https://github.com/fischermoseley/manta/issues/new">feature request</a> - we’d love to hear about your workflow!). The goal of this project is to make working with FPGAs easier, and maintaining this list serves that end.</p>
|
||||
<p>If you're aware of a tool missing from this list, please <a href="https://github.com/fischermoseley/manta/issues/new">let us know</a>!</p>
|
||||
<h2 id="open-source-tools">Open Source Tools</h2>
|
||||
<h3 id="litescope">LiteScope</h3>
|
||||
<p>An embedded logic analyzer written in Migen, primarily for use in LiteX SoC designs. Also includes IO peek and poke, as well as UART, Ethernet, and PCIe interfaces with a host machine. Includes VCD, Sigrok, CSV, and Python data export.</p>
|
||||
|
|
@ -2,46 +2,46 @@
|
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/alternatives/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/architecture/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/ethernet_interface/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/getting_started/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/installation/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/io_core/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/logic_analyzer_core/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/memory_core/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/repository_structure/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/similar_tools/</loc>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/uart_interface/</loc>
|
||||
<lastmod>2024-10-07</lastmod>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://fischermoseley.github.io/manta/dev/use_cases/</loc>
|
||||
<lastmod>2024-10-08</lastmod>
|
||||
</url>
|
||||
</urlset>
|
||||
Binary file not shown.
|
|
@ -52,6 +52,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="../stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -147,7 +149,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -157,7 +159,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -167,7 +169,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -179,43 +181,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -343,11 +308,11 @@
|
|||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../alternatives/" class="md-nav__link">
|
||||
<a href="../use_cases/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
|
|
@ -380,7 +345,25 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -393,28 +376,30 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -481,6 +466,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" checked>
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="true">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -545,6 +579,39 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Configuration">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#amaranth-native-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Amaranth-Native Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.UARTInterface" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code> UARTInterface
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -605,10 +672,10 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -619,8 +686,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -632,27 +699,6 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../repository_structure/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="https://github.com/fischermoseley/manta/milestones" class="md-nav__link">
|
||||
|
||||
|
|
@ -715,6 +761,39 @@
|
|||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Configuration">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#verilog-based-workflows" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Verilog-Based Workflows
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#amaranth-native-designs" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Amaranth-Native Designs
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manta.UARTInterface" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
<code class="doc-symbol doc-symbol-toc doc-symbol-class"></code> UARTInterface
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
|
@ -738,26 +817,165 @@
|
|||
<h1>UART Interface</h1>
|
||||
|
||||
<h2 id="overview">Overview</h2>
|
||||
<p>Manta needs an interface to pass data between the host machine and FPGA, and UART is a convenient option. When configured to use UART, Manta will shuffle data back and forth using generic 8N1 serial with no flow control. This happens through a series of read and write transactions, which are specified using a messaging format described <a href="../architecture/#message-format">here</a>.</p>
|
||||
<p>The ubiquity and simplicity of UART makes it a convenient mechanism for sharing data between the host machine and FPGA. As a result, Manta provides the option to run over UART, where operating the cores can often take place over the same USB cable used to program the FPGA.</p>
|
||||
<p>Both the <a href="../use_cases">Use Cases</a> page and the repository's <a href="https://github.com/fischermoseley/manta/tree/main/examples">examples</a> folder contain examples of the UART Interface for your reference.</p>
|
||||
<h2 id="configuration">Configuration</h2>
|
||||
<p>The configuration of the UART interface is best shown by example:</p>
|
||||
<h3 id="verilog-based-workflows">Verilog-Based Workflows</h3>
|
||||
<p>The UART interface is used by adding a <code>uart</code> entry at the bottom of the configuration file. This is best shown by example:</p>
|
||||
<p><div class="language-yaml highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nt">uart</span><span class="p">:</span>
|
||||
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="s">"auto"</span>
|
||||
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="nt">baudrate</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3000000</span>
|
||||
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="w"> </span><span class="nt">clock_freq</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">100000000</span>
|
||||
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="w"> </span><span class="nt">stall_interval</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">16</span>
|
||||
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="w"> </span><span class="nt">chunk_size</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">256</span>
|
||||
</span></code></pre></div>
|
||||
This snippet at the end of the configuration file defines the interface. The following parameters must be set:</p>
|
||||
Inside this configuration, the following parameters may be set:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><code>port</code> <em>(required)</em>: The name of the serial port on the host machine that's connected to the FPGA. Depending on your platform, this could be <code>/dev/ttyUSBXX</code>, <code>/dev/tty.usbserialXXX</code>, or <code>COMX</code>. If set to <code>auto</code>, then Manta will try to find the right serial port by looking for a USB device with the same VID and PID as a FT2232 - a USB/UART converter chip that's super popular on FPGA dev boards. This doesn't always work, but it's super convenient when it does. If your port isn't automatically detected, then just specify the port manually.</p>
|
||||
<p><code>port</code> <em>(required)</em>: The name of the serial port on the host machine that's connected to the FPGA. Depending on your platform, this could be <code>/dev/ttyUSBXX</code>, <code>/dev/tty.usbserialXXX</code>, or <code>COMX</code>. If set to <code>auto</code>, then Manta will try to find the right serial port by looking for a connected FTDI chip. This doesn't always work, so if your port isn't automatically detected then just specify the port manually.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>baudrate</code> <em>(required)</em>: The baudrate of the serial port. Generally you want to configure this at the maximum speed of your USB/UART chip such that data transfers as fast as possible. The ubiquitous FT2232 supports up to 3Mbaud.</p>
|
||||
<p><code>baudrate</code> <em>(required)</em>: The baudrate of the serial port. Generally, this should be set to the maximum baudrate supported by the USB/UART chip on your dev board for fastest operation. Manta will throw an error if this baudrate is not achievable with your FPGA's clock frequency.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>clock_freq</code> <em>(required)</em>: The frequency of the clock being provided to the <code>manta</code> module, in Hertz (Hz). This speed doesn't matter much to the logic itself, it's only used to calculate the correct baud timing for the provided baudrate. However, this frequency does have to be fast enough to ensure a good agreement between the onboard prescaler and the requested baudrate - and Manta will throw an error during code generation if that is not the case.</p>
|
||||
<p><code>clock_freq</code> <em>(required)</em>: The frequency of the clock provided to the <code>manta</code> module, in Hertz (Hz). This is used to calculate an appropriate prescaler onboard the FPGA to acheive the desired baudrate. Manta will throw an error if this clock frequency does not allow you to achieve your desired baudrate.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>stall_interval</code> <em>(optional)</em>: The number of read requests to send before sending a stall byte. This prevents packets from being dropped if the FPGA's baudrate is less than the USB-Serial adapter's baudrate. This is usually caused by a mismatch between the clock frequency of the USB-Serial adapter and the FPGA fabric. See issue <a href="https://github.com/fischermoseley/manta/issues/18">#18</a> on GitHub. Defaults to 16, reduce this if Manta reports that bytes are being dropped.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><code>chunk_size</code> <em>(optional)</em>: The number of read requests to send at a time. Since the FPGA responds to read requests almost instantly, sending them in batches prevents the host machine's input buffer from overflowing. Defaults to 256, Reduce this if Manta reports that bytes are being dropped, and decreasing <code>stall_interval</code> did not work.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3 id="amaranth-native-designs">Amaranth-Native Designs</h3>
|
||||
<p>Since Amaranth modules are Python objects, the configuration of the IO Core is given by the arguments given during initialization. See the documentation for the <code>UARTInterface</code> <a href="#manta.UARTInterface">class constructor</a> below, as well as the Amaranth <a href="https://github.com/fischermoseley/manta/tree/main/examples/amaranth">examples</a> in the repo.</p>
|
||||
|
||||
|
||||
<div class="doc doc-object doc-class">
|
||||
|
||||
|
||||
|
||||
<h3 id="manta.UARTInterface" class="doc doc-heading">
|
||||
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">manta.UARTInterface</span>
|
||||
|
||||
|
||||
</h3>
|
||||
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">UARTInterface</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="n">baudrate</span><span class="p">,</span> <span class="n">clock_freq</span><span class="p">,</span> <span class="n">stall_interval</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span> <span class="n">chunk_size</span><span class="o">=</span><span class="mi">256</span><span class="p">)</span>
|
||||
</span></code></pre></div>
|
||||
|
||||
<div class="doc doc-contents first">
|
||||
|
||||
|
||||
<p>A synthesizable module for UART communication between a host machine and
|
||||
the FPGA.</p>
|
||||
|
||||
<p>This function is the main mechanism for configuring a UART Interface
|
||||
in an Amaranth-native design.</p>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Parameters:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>port</code></b>
|
||||
(<code>str</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The name of the serial port on the host machine that's
|
||||
connected to the FPGA. Depending on your platform, this could
|
||||
be <code>/dev/ttyUSBXX</code>, <code>/dev/tty.usbserialXXX</code>, or <code>COMX</code>. If set
|
||||
to <code>auto</code>, then Manta will try to find the right serial port by
|
||||
looking for a connected FTDI chip. This doesn't always work, so
|
||||
if your port isn't automatically detected then just specify the
|
||||
port manually.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>baudrate</code></b>
|
||||
(<code>float | int</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The baudrate of the serial port. Generally,
|
||||
this should be set to the maximum baudrate supported by the
|
||||
USB/UART chip on your dev board for fastest operation.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>clock_freq</code></b>
|
||||
(<code>float | int</code>)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The frequency of the clock provided to
|
||||
this module, in Hertz (Hz). This is used to calculate an
|
||||
appropriate prescaler onboard the FPGA to acheive the desired
|
||||
baudrate.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>stall_interval</code></b>
|
||||
(<code>Optional[int]</code>, default:
|
||||
<code>16</code>
|
||||
)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The number of read requests to send
|
||||
before sending a stall byte. This prevents packets from being
|
||||
dropped if the FPGA's baudrate is less than the USB-Serial
|
||||
adapter's baudrate. This is usually caused by a mismatch
|
||||
between the clock frequency of the USB-Serial adapter and the
|
||||
FPGA fabric. See issue #18 on GitHub. Reduce this if Manta
|
||||
reports that bytes are being dropped.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="doc-section-item field-body">
|
||||
<b><code>chunk_size</code></b>
|
||||
(<code>Optional[int]</code>, default:
|
||||
<code>256</code>
|
||||
)
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The number of read requests to send at
|
||||
a time. Since the FPGA responds to read requests almost
|
||||
instantly, sending them in batches prevents the host machine's
|
||||
input buffer from overflowing. Reduce this if Manta reports
|
||||
that bytes are being dropped, and decreasing <code>stall_interval</code>
|
||||
did not work.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p><span class="doc-section-title">Raises:</span></p>
|
||||
<ul>
|
||||
<li class="doc-section-item field-body">
|
||||
<code>ValueError</code>
|
||||
–
|
||||
<div class="doc-md-description">
|
||||
<p>The baudrate is not acheivable with the clock frequency
|
||||
provided, or the clock frequency or baudrate is invalid.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="doc doc-children">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -12,19 +12,21 @@
|
|||
<meta name="author" content="Fischer Moseley">
|
||||
|
||||
|
||||
<link rel="canonical" href="https://fischermoseley.github.io/manta/dev/repository_structure/">
|
||||
<link rel="canonical" href="https://fischermoseley.github.io/manta/dev/use_cases/">
|
||||
|
||||
|
||||
<link rel="prev" href="../ethernet_interface/">
|
||||
<link rel="prev" href="../getting_started/">
|
||||
|
||||
|
||||
<link rel="next" href="../architecture/">
|
||||
|
||||
|
||||
<link rel="icon" href="../assets/logo_ray_only_with_shadow.png">
|
||||
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.39">
|
||||
|
||||
|
||||
|
||||
<title>Repository Structure - Manta Documentation</title>
|
||||
<title>Use Cases - Manta Documentation</title>
|
||||
|
||||
|
||||
|
||||
|
|
@ -50,6 +52,8 @@
|
|||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
|
||||
|
||||
<link rel="stylesheet" href="../stylesheets/extra.css">
|
||||
|
||||
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
|
@ -78,7 +82,7 @@
|
|||
<div data-md-component="skip">
|
||||
|
||||
|
||||
<a href="#repository-structure" class="md-skip">
|
||||
<a href="#logic-analyzer-core" class="md-skip">
|
||||
Skip to content
|
||||
</a>
|
||||
|
||||
|
|
@ -129,7 +133,7 @@
|
|||
<div class="md-header__topic" data-md-component="header-topic">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Repository Structure
|
||||
Use Cases
|
||||
|
||||
</span>
|
||||
</div>
|
||||
|
|
@ -145,7 +149,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -155,7 +159,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -165,7 +169,7 @@
|
|||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5M7 15a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
|
@ -177,43 +181,6 @@
|
|||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://github.com/fischermoseley/manta/" title="Go to repository" class="md-source" data-md-component="source">
|
||||
|
|
@ -338,18 +305,81 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../alternatives/" class="md-nav__link">
|
||||
|
||||
<li class="md-nav__item md-nav__item--active">
|
||||
|
||||
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
||||
|
||||
|
||||
|
||||
<label class="md-nav__link md-nav__link--active" for="__toc">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<a href="./" class="md-nav__link md-nav__link--active">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Alternatives
|
||||
Use Cases
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
||||
|
||||
|
||||
|
||||
|
||||
<label class="md-nav__title" for="__toc">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Table of contents
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#logic-analyzer-core" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Logic Analyzer Core
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#io-core" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
I/O Core
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#memory-cores" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Memory Cores
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
|
@ -380,6 +410,26 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../similar_tools/" class="md-nav__link">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Similar Tools
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -395,24 +445,24 @@
|
|||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Usage
|
||||
Cores
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_6">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Usage
|
||||
Cores
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
|
@ -479,6 +529,55 @@
|
|||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Interfaces
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_8">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Interfaces
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -532,8 +631,6 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -545,14 +642,16 @@
|
|||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
||||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||||
|
||||
|
||||
|
||||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
|
||||
|
||||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
|
@ -563,8 +662,8 @@
|
|||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
|
||||
<label class="md-nav__title" for="__nav_7">
|
||||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
|
||||
<label class="md-nav__title" for="__nav_9">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
For Developers
|
||||
</label>
|
||||
|
|
@ -574,90 +673,6 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item md-nav__item--active">
|
||||
|
||||
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
||||
|
||||
|
||||
|
||||
<label class="md-nav__link md-nav__link--active" for="__toc">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<a href="./" class="md-nav__link md-nav__link--active">
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
||||
|
||||
|
||||
|
||||
|
||||
<label class="md-nav__title" for="__toc">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Table of contents
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#repository-structure" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#tools-used" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Tools Used
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#github-actions-setup" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
GitHub Actions Setup
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
|
|
@ -707,27 +722,27 @@
|
|||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#repository-structure" class="md-nav__link">
|
||||
<a href="#logic-analyzer-core" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Repository Structure
|
||||
Logic Analyzer Core
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#tools-used" class="md-nav__link">
|
||||
<a href="#io-core" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Tools Used
|
||||
I/O Core
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#github-actions-setup" class="md-nav__link">
|
||||
<a href="#memory-cores" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
GitHub Actions Setup
|
||||
Memory Cores
|
||||
</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -751,25 +766,45 @@
|
|||
|
||||
|
||||
|
||||
<h1>Repository Structure</h1>
|
||||
<h1>Use Cases</h1>
|
||||
|
||||
<h2 id="repository-structure">Repository Structure</h2>
|
||||
<p>Manta's capabilities are best reflected in its cores, for which a brief description of each is provided below:</p>
|
||||
<h3 id="logic-analyzer-core"><strong>Logic Analyzer Core</strong></h3>
|
||||
<p><em>More details available on the <a href="../logic_analyzer_core/">full documentation page</a>.</em></p>
|
||||
<p>This core captures a timeseries of digital signals from within the FPGA, much like a benchtop logic analyzer would. This captures data on the FPGA's native clock and presents it as a waveform, making it very useful for debugging logic cycle-by-cycle. This concept is very similar to the Xilinx <a href="https://docs.xilinx.com/r/en-US/ug908-vivado-programming-debugging/ILA">Integrated Logic Analyzer (ILA)</a> and Intel <a href="https://www.intel.com/content/www/us/en/docs/programmable/683819/21-3/logic-analyzer-introduction.html">SignalTap</a> utilities.</p>
|
||||
<p>You may find this core useful for:</p>
|
||||
<ul>
|
||||
<li><code>src/manta/</code> contains the Python source needed to generate and run the cores.</li>
|
||||
<li><code>test/</code> contains Manta's tests, which are a mix of functional simulations and hardware-in-the-loop testing. These tests leverage the <code>pytest</code> testing framework.</li>
|
||||
<li><code>doc/</code> contains the documentation you're reading right now!</li>
|
||||
<li><code>examples/</code> contains examples of Manta being used in designs for a handful of FPGA boards.</li>
|
||||
<li><code>.github/</code> contains GitHub Actions workflows for automatically running the tests and building the documentation site on every commit.</li>
|
||||
<li>
|
||||
<p><em>Verifying specification adherence for connected hardware</em> - for instance, you're writing a S/PDIF decoder that works in simulation, but fails in hardware. The logic analyzer core can record a cycle-by-cycle capture of what's coming off the cable, letting you verify that your input signals are what you expect. Even better, Manta will let you play that capture back in your preferred simulator, letting you feed the exact same inputs to your module in simulation and check your logic.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Capturing arbitrary data</em> - you're working on a DSP project, and you'd like to grab some test data from your onboard ADCs to start prototyping your signal processing with. Manta will grab that data, and export it for you.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h2 id="tools-used">Tools Used</h2>
|
||||
<h3 id="io-core"><strong>I/O Core</strong></h3>
|
||||
<p><em>More details available on the <a href="../io_core/">full documentation page</a>.</em></p>
|
||||
<p>This core presents a series of user-accessbile registers to the FPGA fabric, which may be configured as either inputs or outputs. The value of an input register can be read off the FPGA by the host machine, and the value of an output register on the FPGA may be set by the host machine. This is handy for getting small amounts of information into and out of the FPGA, debugging, configuration, or experimentation. This concept is very similar to the Xilinx <a href="https://docs.xilinx.com/v/u/en-US/pg159-vio">Virtual IO</a> and Intel <a href="https://www.intel.com/content/www/us/en/docs/programmable/683552/18-1/in-system-sources-and-probes-66964.html">In-System Sources and Probes</a> tools.</p>
|
||||
<p>You may find this core useful for:</p>
|
||||
<ul>
|
||||
<li>The <a href="https://github.com/YosysHQ">YosysHQ</a> tools and <a href="https://www.xilinx.com/products/design-tools/vivado.html">Vivado</a> are used for building bitstreams.</li>
|
||||
<li><a href="https://app.diagrams.net/">draw.io</a> is used for block diagrams.</li>
|
||||
<li><a href="https://pages.github.com/">GitHub Pages</a> is used to serve the documentation site, which is built with <a href="https://squidfunk.github.io/mkdocs-material/">Material for MkDocs</a>.</li>
|
||||
<li><a href="https://docs.github.com/en/actions">GitHub Actions</a> is used for continuous integration.</li>
|
||||
<li>
|
||||
<p><em>Prototyping designs in Python, and incrementally migrating them to hardware</em> - you're working on some real-time signal processing, but you want to prototype it with some sample data in Numpy before meticulously implementing everything in Verilog.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Making dashboards</em> - you'd like to get some telemetry out of your existing FPGA design and display it nicely, but you don't want to implement an interface, design a packetization scheme, and write a library.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3 id="memory-cores"><strong>Memory Cores</strong></h3>
|
||||
<p><em>More details available on the <a href="../memory_core/">full documentation page</a>.</em></p>
|
||||
<p>This core creates a two-port block memory on the FPGA, and gives one port to the host machine, and the other to your logic on the FPGA. The width and depth of this block memory is configurable, allowing large chunks of arbitrarily-sized data to be shuffled onto and off of the FPGA by the host machine, via the Python API. This lets you establish a transport layer between the host and FPGA, that treats the data as exactly how it exists on the FPGA.</p>
|
||||
<p>You may find this core useful for:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><em>Moving data between a host and connected FPGA</em> - you're working on a cool new machine learning accelerator, but you don't want to think about how to get training data and weights out of TensorFlow, and into your core.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Hand-tuning ROMs</em> - you're designing a digital filter for a DSP project and would like to tune it in real-time, or you're developing a soft processor and want to upload program code without rebuilding a bitstream.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h2 id="github-actions-setup">GitHub Actions Setup</h2>
|
||||
<p>Since Vivado is large and requires individual licenses, it is run on a private server, which is configured as a self-hosted runner in GitHub Actions. This is a virtual server hosted with KVM/QEMU and managed by libvirt, which is configured as transient so that it reloads its state from a snapshot periodically. A Nexys4 DDR and Icestick are connected to the physical machine and passthrough-ed to this VM so that continuous integration can check against real hardware.</p>
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue