adds a async ram

This commit is contained in:
hneemann 2021-03-01 08:55:14 +01:00
parent e4b900f297
commit 577de5f4ab
14 changed files with 407 additions and 235 deletions

View File

@ -98,20 +98,6 @@
</elementAttributes> </elementAttributes>
<pos x="220" y="160"/> <pos x="220" y="160"/>
</visualElement> </visualElement>
<visualElement>
<elementName>RAMDualPort</elementName>
<elementAttributes>
<entry>
<string>AddrBits</string>
<int>4</int>
</entry>
<entry>
<string>Bits</string>
<int>4</int>
</entry>
</elementAttributes>
<pos x="420" y="180"/>
</visualElement>
<visualElement> <visualElement>
<elementName>Splitter</elementName> <elementName>Splitter</elementName>
<elementAttributes> <elementAttributes>
@ -202,7 +188,7 @@
<string>1*4</string> <string>1*4</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="520" y="220"/> <pos x="620" y="200"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Out</elementName> <elementName>Out</elementName>
@ -216,7 +202,7 @@
<string>5</string> <string>5</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="580" y="220"/> <pos x="680" y="200"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Out</elementName> <elementName>Out</elementName>
@ -230,7 +216,7 @@
<string>7</string> <string>7</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="580" y="260"/> <pos x="680" y="240"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Out</elementName> <elementName>Out</elementName>
@ -244,7 +230,7 @@
<string>9</string> <string>9</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="580" y="300"/> <pos x="680" y="280"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Out</elementName> <elementName>Out</elementName>
@ -258,7 +244,7 @@
<string>11</string> <string>11</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="580" y="340"/> <pos x="680" y="320"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -324,7 +310,7 @@
<visualElement> <visualElement>
<elementName>PowerSupply</elementName> <elementName>PowerSupply</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="620" y="440"/> <pos x="680" y="40"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -342,7 +328,7 @@
<value v="1" z="false"/> <value v="1" z="false"/>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="580" y="440"/> <pos x="640" y="40"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -356,7 +342,7 @@
<string>8</string> <string>8</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="580" y="480"/> <pos x="640" y="80"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Not</elementName> <elementName>Not</elementName>
@ -366,7 +352,39 @@
<int>4</int> <int>4</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="320" y="200"/> <pos x="500" y="200"/>
</visualElement>
<visualElement>
<elementName>Driver</elementName>
<elementAttributes>
<entry>
<string>Bits</string>
<int>4</int>
</entry>
<entry>
<string>flipSelPos</string>
<boolean>true</boolean>
</entry>
</elementAttributes>
<pos x="580" y="200"/>
</visualElement>
<visualElement>
<elementName>RAMAsync</elementName>
<elementAttributes>
<entry>
<string>AddrBits</string>
<int>4</int>
</entry>
<entry>
<string>Label</string>
<string>*</string>
</entry>
<entry>
<string>Bits</string>
<int>4</int>
</entry>
</elementAttributes>
<pos x="420" y="180"/>
</visualElement> </visualElement>
</visualElements> </visualElements>
<wires> <wires>
@ -382,25 +400,17 @@
<p1 x="220" y="320"/> <p1 x="220" y="320"/>
<p2 x="260" y="320"/> <p2 x="260" y="320"/>
</wire> </wire>
<wire>
<p1 x="640" y="320"/>
<p2 x="680" y="320"/>
</wire>
<wire> <wire>
<p1 x="220" y="160"/> <p1 x="220" y="160"/>
<p2 x="260" y="160"/> <p2 x="260" y="160"/>
</wire> </wire>
<wire> <wire>
<p1 x="360" y="480"/> <p1 x="360" y="480"/>
<p2 x="400" y="480"/> <p2 x="580" y="480"/>
</wire>
<wire>
<p1 x="580" y="480"/>
<p2 x="600" y="480"/>
</wire>
<wire>
<p1 x="540" y="260"/>
<p2 x="580" y="260"/>
</wire>
<wire>
<p1 x="400" y="260"/>
<p2 x="420" y="260"/>
</wire> </wire>
<wire> <wire>
<p1 x="280" y="40"/> <p1 x="280" y="40"/>
@ -410,37 +420,49 @@
<p1 x="220" y="40"/> <p1 x="220" y="40"/>
<p2 x="260" y="40"/> <p2 x="260" y="40"/>
</wire> </wire>
<wire>
<p1 x="640" y="40"/>
<p2 x="680" y="40"/>
</wire>
<wire> <wire>
<p1 x="280" y="200"/> <p1 x="280" y="200"/>
<p2 x="320" y="200"/> <p2 x="420" y="200"/>
</wire> </wire>
<wire> <wire>
<p1 x="220" y="200"/> <p1 x="220" y="200"/>
<p2 x="260" y="200"/> <p2 x="260" y="200"/>
</wire> </wire>
<wire> <wire>
<p1 x="360" y="200"/> <p1 x="640" y="200"/>
<p2 x="420" y="200"/> <p2 x="680" y="200"/>
</wire> </wire>
<wire> <wire>
<p1 x="600" y="460"/> <p1 x="600" y="200"/>
<p2 x="620" y="460"/> <p2 x="620" y="200"/>
</wire>
<wire>
<p1 x="480" y="200"/>
<p2 x="500" y="200"/>
</wire>
<wire>
<p1 x="540" y="200"/>
<p2 x="560" y="200"/>
</wire> </wire>
<wire> <wire>
<p1 x="280" y="460"/> <p1 x="280" y="460"/>
<p2 x="300" y="460"/> <p2 x="300" y="460"/>
</wire> </wire>
<wire> <wire>
<p1 x="540" y="300"/> <p1 x="640" y="240"/>
<p2 x="580" y="300"/> <p2 x="680" y="240"/>
</wire> </wire>
<wire> <wire>
<p1 x="220" y="240"/> <p1 x="220" y="240"/>
<p2 x="260" y="240"/> <p2 x="260" y="240"/>
</wire> </wire>
<wire> <wire>
<p1 x="380" y="240"/> <p1 x="640" y="80"/>
<p2 x="420" y="240"/> <p2 x="660" y="80"/>
</wire> </wire>
<wire> <wire>
<p1 x="220" y="80"/> <p1 x="220" y="80"/>
@ -450,10 +472,6 @@
<p1 x="360" y="400"/> <p1 x="360" y="400"/>
<p2 x="380" y="400"/> <p2 x="380" y="400"/>
</wire> </wire>
<wire>
<p1 x="540" y="340"/>
<p2 x="580" y="340"/>
</wire>
<wire> <wire>
<p1 x="380" y="180"/> <p1 x="380" y="180"/>
<p2 x="420" y="180"/> <p2 x="420" y="180"/>
@ -467,16 +485,20 @@
<p2 x="280" y="500"/> <p2 x="280" y="500"/>
</wire> </wire>
<wire> <wire>
<p1 x="580" y="440"/> <p1 x="640" y="280"/>
<p2 x="620" y="440"/> <p2 x="680" y="280"/>
</wire>
<wire>
<p1 x="220" y="280"/>
<p2 x="260" y="280"/>
</wire> </wire>
<wire> <wire>
<p1 x="220" y="120"/> <p1 x="220" y="120"/>
<p2 x="260" y="120"/> <p2 x="260" y="120"/>
</wire> </wire>
<wire> <wire>
<p1 x="220" y="280"/> <p1 x="660" y="60"/>
<p2 x="260" y="280"/> <p2 x="680" y="60"/>
</wire> </wire>
<wire> <wire>
<p1 x="220" y="380"/> <p1 x="220" y="380"/>
@ -486,18 +508,10 @@
<p1 x="240" y="380"/> <p1 x="240" y="380"/>
<p2 x="280" y="380"/> <p2 x="280" y="380"/>
</wire> </wire>
<wire>
<p1 x="540" y="220"/>
<p2 x="580" y="220"/>
</wire>
<wire> <wire>
<p1 x="380" y="220"/> <p1 x="380" y="220"/>
<p2 x="420" y="220"/> <p2 x="420" y="220"/>
</wire> </wire>
<wire>
<p1 x="480" y="220"/>
<p2 x="520" y="220"/>
</wire>
<wire> <wire>
<p1 x="240" y="460"/> <p1 x="240" y="460"/>
<p2 x="240" y="500"/> <p2 x="240" y="500"/>
@ -507,12 +521,12 @@
<p2 x="240" y="420"/> <p2 x="240" y="420"/>
</wire> </wire>
<wire> <wire>
<p1 x="400" y="260"/> <p1 x="580" y="220"/>
<p2 x="400" y="480"/> <p2 x="580" y="480"/>
</wire> </wire>
<wire> <wire>
<p1 x="600" y="460"/> <p1 x="660" y="60"/>
<p2 x="600" y="480"/> <p2 x="660" y="80"/>
</wire> </wire>
<wire> <wire>
<p1 x="380" y="40"/> <p1 x="380" y="40"/>
@ -520,11 +534,8 @@
</wire> </wire>
<wire> <wire>
<p1 x="380" y="220"/> <p1 x="380" y="220"/>
<p2 x="380" y="240"/>
</wire>
<wire>
<p1 x="380" y="240"/>
<p2 x="380" y="400"/> <p2 x="380" y="400"/>
</wire> </wire>
</wires> </wires>
<measurementOrdering/>
</circuit> </circuit>

View File

@ -20,24 +20,6 @@
</entry> </entry>
</attributes> </attributes>
<visualElements> <visualElements>
<visualElement>
<elementName>RAMDualPort</elementName>
<elementAttributes>
<entry>
<string>AddrBits</string>
<int>4</int>
</entry>
<entry>
<string>Bits</string>
<int>4</int>
</entry>
<entry>
<string>Addr Bits</string>
<int>4</int>
</entry>
</elementAttributes>
<pos x="460" y="180"/>
</visualElement>
<visualElement> <visualElement>
<elementName>Splitter</elementName> <elementName>Splitter</elementName>
<elementAttributes> <elementAttributes>
@ -54,7 +36,7 @@
<string>1*4</string> <string>1*4</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="560" y="220"/> <pos x="660" y="200"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Out</elementName> <elementName>Out</elementName>
@ -68,7 +50,7 @@
<string>11</string> <string>11</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="740" y="280"/> <pos x="840" y="260"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Out</elementName> <elementName>Out</elementName>
@ -82,7 +64,7 @@
<string>5</string> <string>5</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="600" y="220"/> <pos x="700" y="200"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Out</elementName> <elementName>Out</elementName>
@ -96,7 +78,7 @@
<string>7</string> <string>7</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="740" y="240"/> <pos x="840" y="220"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Out</elementName> <elementName>Out</elementName>
@ -110,7 +92,7 @@
<string>9</string> <string>9</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="600" y="260"/> <pos x="700" y="240"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Not</elementName> <elementName>Not</elementName>
@ -120,7 +102,7 @@
<int>4</int> <int>4</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="400" y="200"/> <pos x="520" y="200"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Splitter</elementName> <elementName>Splitter</elementName>
@ -134,7 +116,7 @@
<string>4</string> <string>4</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="340" y="80"/> <pos x="380" y="80"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -148,7 +130,7 @@
<string>1</string> <string>1</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="160" y="80"/> <pos x="200" y="80"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -162,7 +144,7 @@
<string>15</string> <string>15</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="300" y="100"/> <pos x="340" y="100"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -176,7 +158,7 @@
<string>14</string> <string>14</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="160" y="120"/> <pos x="200" y="120"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -190,7 +172,7 @@
<string>13</string> <string>13</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="300" y="140"/> <pos x="340" y="140"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Splitter</elementName> <elementName>Splitter</elementName>
@ -204,7 +186,7 @@
<string>4</string> <string>4</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="340" y="200"/> <pos x="380" y="200"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -218,7 +200,7 @@
<string>4</string> <string>4</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="160" y="200"/> <pos x="200" y="200"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -232,7 +214,7 @@
<string>6</string> <string>6</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="300" y="220"/> <pos x="340" y="220"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -246,7 +228,7 @@
<string>10</string> <string>10</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="160" y="240"/> <pos x="200" y="240"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -260,7 +242,7 @@
<string>12</string> <string>12</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="300" y="260"/> <pos x="340" y="260"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -278,12 +260,12 @@
<int>1</int> <int>1</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="160" y="300"/> <pos x="200" y="300"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Not</elementName> <elementName>Not</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="180" y="300"/> <pos x="220" y="300"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -301,27 +283,27 @@
<int>1</int> <int>1</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="160" y="420"/> <pos x="200" y="420"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Not</elementName> <elementName>Not</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="180" y="420"/> <pos x="220" y="420"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Or</elementName> <elementName>Or</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="280" y="380"/> <pos x="320" y="380"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>And</elementName> <elementName>And</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="280" y="300"/> <pos x="320" y="300"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>PowerSupply</elementName> <elementName>PowerSupply</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="200" y="480"/> <pos x="240" y="480"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -339,7 +321,7 @@
<value v="1" z="false"/> <value v="1" z="false"/>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="160" y="480"/> <pos x="200" y="480"/>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>In</elementName> <elementName>In</elementName>
@ -353,169 +335,194 @@
<string>8</string> <string>8</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="160" y="520"/> <pos x="200" y="520"/>
</visualElement>
<visualElement>
<elementName>Driver</elementName>
<elementAttributes>
<entry>
<string>Bits</string>
<int>4</int>
</entry>
<entry>
<string>flipSelPos</string>
<boolean>true</boolean>
</entry>
</elementAttributes>
<pos x="600" y="200"/>
</visualElement>
<visualElement>
<elementName>RAMAsync</elementName>
<elementAttributes>
<entry>
<string>Label</string>
<string>*</string>
</entry>
<entry>
<string>AddrBits</string>
<int>4</int>
</entry>
<entry>
<string>Bits</string>
<int>4</int>
</entry>
</elementAttributes>
<pos x="440" y="180"/>
</visualElement> </visualElement>
</visualElements> </visualElements>
<wires> <wires>
<wire> <wire>
<p1 x="240" y="300"/> <p1 x="280" y="300"/>
<p2 x="260" y="380"/> <p2 x="300" y="380"/>
</wire> </wire>
<wire> <wire>
<p1 x="260" y="340"/> <p1 x="300" y="340"/>
<p2 x="240" y="420"/>
</wire>
<wire>
<p1 x="340" y="320"/>
<p2 x="400" y="320"/>
</wire>
<wire>
<p1 x="160" y="480"/>
<p2 x="200" y="480"/>
</wire>
<wire>
<p1 x="300" y="260"/>
<p2 x="340" y="260"/>
</wire>
<wire>
<p1 x="580" y="260"/>
<p2 x="600" y="260"/>
</wire>
<wire>
<p1 x="440" y="260"/>
<p2 x="460" y="260"/>
</wire>
<wire>
<p1 x="300" y="100"/>
<p2 x="340" y="100"/>
</wire>
<wire>
<p1 x="160" y="420"/>
<p2 x="180" y="420"/>
</wire>
<wire>
<p1 x="220" y="420"/>
<p2 x="240" y="420"/>
</wire>
<wire>
<p1 x="240" y="420"/>
<p2 x="280" y="420"/> <p2 x="280" y="420"/>
</wire> </wire>
<wire> <wire>
<p1 x="440" y="200"/> <p1 x="380" y="320"/>
<p2 x="460" y="200"/> <p2 x="420" y="320"/>
</wire> </wire>
<wire> <wire>
<p1 x="160" y="200"/> <p1 x="200" y="480"/>
<p2 x="340" y="200"/> <p2 x="240" y="480"/>
</wire> </wire>
<wire> <wire>
<p1 x="360" y="200"/> <p1 x="340" y="260"/>
<p2 x="400" y="200"/> <p2 x="380" y="260"/>
</wire> </wire>
<wire> <wire>
<p1 x="160" y="520"/> <p1 x="680" y="260"/>
<p2 x="180" y="520"/> <p2 x="840" y="260"/>
</wire> </wire>
<wire> <wire>
<p1 x="220" y="300"/> <p1 x="340" y="100"/>
<p2 x="240" y="300"/> <p2 x="380" y="100"/>
</wire> </wire>
<wire> <wire>
<p1 x="160" y="300"/> <p1 x="200" y="420"/>
<p2 x="180" y="300"/> <p2 x="220" y="420"/>
</wire> </wire>
<wire> <wire>
<p1 x="240" y="300"/> <p1 x="260" y="420"/>
<p2 x="280" y="420"/>
</wire>
<wire>
<p1 x="280" y="420"/>
<p2 x="320" y="420"/>
</wire>
<wire>
<p1 x="400" y="200"/>
<p2 x="440" y="200"/>
</wire>
<wire>
<p1 x="200" y="200"/>
<p2 x="380" y="200"/>
</wire>
<wire>
<p1 x="680" y="200"/>
<p2 x="700" y="200"/>
</wire>
<wire>
<p1 x="620" y="200"/>
<p2 x="660" y="200"/>
</wire>
<wire>
<p1 x="500" y="200"/>
<p2 x="520" y="200"/>
</wire>
<wire>
<p1 x="560" y="200"/>
<p2 x="580" y="200"/>
</wire>
<wire>
<p1 x="200" y="520"/>
<p2 x="220" y="520"/>
</wire>
<wire>
<p1 x="260" y="300"/>
<p2 x="280" y="300"/> <p2 x="280" y="300"/>
</wire> </wire>
<wire> <wire>
<p1 x="300" y="140"/> <p1 x="200" y="300"/>
<p2 x="340" y="140"/> <p2 x="220" y="300"/>
</wire> </wire>
<wire> <wire>
<p1 x="340" y="400"/> <p1 x="280" y="300"/>
<p2 x="440" y="400"/> <p2 x="320" y="300"/>
</wire> </wire>
<wire> <wire>
<p1 x="580" y="240"/> <p1 x="340" y="140"/>
<p2 x="740" y="240"/> <p2 x="380" y="140"/>
</wire> </wire>
<wire> <wire>
<p1 x="160" y="240"/> <p1 x="680" y="240"/>
<p2 x="340" y="240"/> <p2 x="700" y="240"/>
</wire> </wire>
<wire> <wire>
<p1 x="400" y="240"/> <p1 x="200" y="240"/>
<p2 x="460" y="240"/> <p2 x="380" y="240"/>
</wire> </wire>
<wire> <wire>
<p1 x="360" y="80"/> <p1 x="380" y="400"/>
<p2 x="440" y="80"/> <p2 x="600" y="400"/>
</wire> </wire>
<wire> <wire>
<p1 x="160" y="80"/> <p1 x="400" y="80"/>
<p2 x="340" y="80"/> <p2 x="420" y="80"/>
</wire> </wire>
<wire> <wire>
<p1 x="260" y="340"/> <p1 x="200" y="80"/>
<p2 x="280" y="340"/> <p2 x="380" y="80"/>
</wire> </wire>
<wire> <wire>
<p1 x="440" y="180"/> <p1 x="300" y="340"/>
<p2 x="460" y="180"/> <p2 x="320" y="340"/>
</wire> </wire>
<wire> <wire>
<p1 x="180" y="500"/> <p1 x="420" y="180"/>
<p2 x="200" y="500"/>
</wire>
<wire>
<p1 x="580" y="280"/>
<p2 x="740" y="280"/>
</wire>
<wire>
<p1 x="160" y="120"/>
<p2 x="340" y="120"/>
</wire>
<wire>
<p1 x="260" y="380"/>
<p2 x="280" y="380"/>
</wire>
<wire>
<p1 x="300" y="220"/>
<p2 x="340" y="220"/>
</wire>
<wire>
<p1 x="580" y="220"/>
<p2 x="600" y="220"/>
</wire>
<wire>
<p1 x="520" y="220"/>
<p2 x="560" y="220"/>
</wire>
<wire>
<p1 x="400" y="220"/>
<p2 x="460" y="220"/>
</wire>
<wire>
<p1 x="400" y="220"/>
<p2 x="400" y="240"/>
</wire>
<wire>
<p1 x="400" y="240"/>
<p2 x="400" y="320"/>
</wire>
<wire>
<p1 x="180" y="500"/>
<p2 x="180" y="520"/>
</wire>
<wire>
<p1 x="440" y="80"/>
<p2 x="440" y="180"/> <p2 x="440" y="180"/>
</wire> </wire>
<wire> <wire>
<p1 x="440" y="260"/> <p1 x="220" y="500"/>
<p2 x="440" y="400"/> <p2 x="240" y="500"/>
</wire>
<wire>
<p1 x="200" y="120"/>
<p2 x="380" y="120"/>
</wire>
<wire>
<p1 x="680" y="220"/>
<p2 x="840" y="220"/>
</wire>
<wire>
<p1 x="340" y="220"/>
<p2 x="380" y="220"/>
</wire>
<wire>
<p1 x="420" y="220"/>
<p2 x="440" y="220"/>
</wire>
<wire>
<p1 x="300" y="380"/>
<p2 x="320" y="380"/>
</wire>
<wire>
<p1 x="420" y="220"/>
<p2 x="420" y="320"/>
</wire>
<wire>
<p1 x="420" y="80"/>
<p2 x="420" y="180"/>
</wire>
<wire>
<p1 x="600" y="220"/>
<p2 x="600" y="400"/>
</wire>
<wire>
<p1 x="220" y="500"/>
<p2 x="220" y="520"/>
</wire> </wire>
</wires> </wires>
<measurementOrdering/>
</circuit> </circuit>

View File

@ -162,6 +162,13 @@ public class ElementAttributes implements HGSMap {
return get(Keys.LABEL); return get(Keys.LABEL);
} }
/**
* @return true if this is flagged as program memory.
*/
public boolean isProgramMemory() {
return getLabel().contains("PROGRAM MEMORY") || get(Keys.IS_PROGRAM_MEMORY);
}
/** /**
* @return the int number format * @return the int number format
*/ */

View File

@ -63,7 +63,7 @@ public class BlockRAMDualPort extends Node implements Element, RAMInterface {
size = 1 << addrBits; size = 1 << addrBits;
memory = new DataField(size); memory = new DataField(size);
label = attr.getLabel(); label = attr.getLabel();
isProgramMemory = attr.get(Keys.IS_PROGRAM_MEMORY); isProgramMemory = attr.isProgramMemory();
} }

View File

@ -79,7 +79,7 @@ public class EEPROM extends Node implements Element, RAMInterface, ROMInterface
.setToHighZ() .setToHighZ()
.setPinDescription(DESCRIPTION) .setPinDescription(DESCRIPTION)
.setBidirectional(); .setBidirectional();
isProgramMemory = attr.get(Keys.IS_PROGRAM_MEMORY); isProgramMemory = attr.isProgramMemory();
formatter = attr.getValueFormatter(); formatter = attr.getValueFormatter();
} }

View File

@ -0,0 +1,127 @@
/*
* Copyright (c) 2019 Helmut Neemann.
* Use of this source code is governed by the GPL v3 license
* that can be found in the LICENSE file.
*/
package de.neemann.digital.core.memory;
import de.neemann.digital.core.Node;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.ObservableValues;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
import de.neemann.digital.core.element.Keys;
import static de.neemann.digital.core.element.PinInfo.input;
/**
* A asynchronous memory
*/
public class RAMAsync extends Node implements Element, RAMInterface {
/**
* The RAMs {@link ElementTypeDescription}
*/
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(RAMAsync.class,
input("A"),
input("D"),
input("we"))
.addAttribute(Keys.ROTATE)
.addAttribute(Keys.BITS)
.addAttribute(Keys.ADDR_BITS)
.addAttribute(Keys.IS_PROGRAM_MEMORY)
.addAttribute(Keys.INVERTER_CONFIG)
.addAttribute(Keys.LABEL);
private final DataField memory;
private final ObservableValue output;
private final int addrBits;
private final int bits;
private final String label;
private final int size;
private final boolean isProgramMemory;
private ObservableValue we;
private ObservableValue addrIn;
private ObservableValue dataIn;
private long outputVal;
/**
* Creates a new instance
*
* @param attr the elements attributes
*/
public RAMAsync(ElementAttributes attr) {
super(true);
bits = attr.get(Keys.BITS);
output = new ObservableValue("Q", bits).setPinDescription(DESCRIPTION);
addrBits = attr.get(Keys.ADDR_BITS);
size = 1 << addrBits;
memory = new DataField(size);
label = attr.getLabel();
isProgramMemory = attr.isProgramMemory();
}
@Override
public void setInputs(ObservableValues inputs) throws NodeException {
addrIn = inputs.get(0).checkBits(addrBits, this).addObserverToValue(this);
dataIn = inputs.get(1).checkBits(bits, this).addObserverToValue(this);
we = inputs.get(2).checkBits(1, this).addObserverToValue(this);
}
@Override
public void readInputs() throws NodeException {
int addr = (int) addrIn.getValue();
if (we.getBool())
memory.setData(addr, dataIn.getValue());
outputVal = memory.getDataWord(addr);
}
@Override
public void writeOutputs() throws NodeException {
output.setValue(outputVal);
}
@Override
public ObservableValues getOutputs() {
return output.asList();
}
@Override
public DataField getMemory() {
return memory;
}
@Override
public String getLabel() {
return label;
}
@Override
public int getSize() {
return size;
}
@Override
public int getAddrBits() {
return addrBits;
}
@Override
public boolean isProgramMemory() {
return isProgramMemory;
}
@Override
public void setProgramMemory(DataField dataField) {
memory.setDataFrom(dataField);
}
@Override
public int getDataBits() {
return bits;
}
}

View File

@ -72,7 +72,7 @@ public class RAMDualAccess extends Node implements Element, RAMInterface {
size = 1 << addrBits; size = 1 << addrBits;
memory = new DataField(size); memory = new DataField(size);
label = attr.getLabel(); label = attr.getLabel();
isProgramMemory = attr.get(Keys.IS_PROGRAM_MEMORY); isProgramMemory = attr.isProgramMemory();
} }
@Override @Override

View File

@ -66,7 +66,7 @@ public class RAMDualPort extends Node implements Element, RAMInterface {
size = 1 << addrBits; size = 1 << addrBits;
memory = createDataField(attr, size); memory = createDataField(attr, size);
label = attr.getLabel(); label = attr.getLabel();
isProgramMemory = attr.get(Keys.IS_PROGRAM_MEMORY); isProgramMemory = attr.isProgramMemory();
formatter = attr.getValueFormatter(); formatter = attr.getValueFormatter();
} }

View File

@ -71,7 +71,7 @@ public class RAMSinglePortSel extends Node implements Element, RAMInterface {
.setToHighZ() .setToHighZ()
.setPinDescription(DESCRIPTION) .setPinDescription(DESCRIPTION)
.setBidirectional(); .setBidirectional();
isProgramMemory = attr.get(Keys.IS_PROGRAM_MEMORY); isProgramMemory = attr.isProgramMemory();
} }
@Override @Override

View File

@ -71,7 +71,7 @@ public class ROM extends Node implements Element, ROMInterface, ProgramMemory {
addrBits = attr.get(Keys.ADDR_BITS); addrBits = attr.get(Keys.ADDR_BITS);
autoLoad = attr.get(Keys.AUTO_RELOAD_ROM); autoLoad = attr.get(Keys.AUTO_RELOAD_ROM);
label = attr.getLabel(); label = attr.getLabel();
isProgramMemory = attr.get(Keys.IS_PROGRAM_MEMORY); isProgramMemory = attr.isProgramMemory();
if (autoLoad) { if (autoLoad) {
hexFile = attr.getFile(LAST_DATA_FILE_KEY); hexFile = attr.getFile(LAST_DATA_FILE_KEY);
} else } else

View File

@ -189,6 +189,7 @@ public class ElementLibrary implements Iterable<ElementLibrary.ElementContainer>
.add(RAMSinglePortSel.DESCRIPTION) .add(RAMSinglePortSel.DESCRIPTION)
.add(RegisterFile.DESCRIPTION) .add(RegisterFile.DESCRIPTION)
.add(RAMDualAccess.DESCRIPTION) .add(RAMDualAccess.DESCRIPTION)
.add(RAMAsync.DESCRIPTION)
.add(GraphicCard.DESCRIPTION)) .add(GraphicCard.DESCRIPTION))
.add(new LibraryNode(Lang.get("lib_eeprom")) .add(new LibraryNode(Lang.get("lib_eeprom"))
.add(EEPROM.DESCRIPTION) .add(EEPROM.DESCRIPTION)

View File

@ -97,6 +97,7 @@ public final class ShapeFactory {
map.put(RAMDualAccess.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape(attr, RAMDualAccess.DESCRIPTION)); map.put(RAMDualAccess.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape(attr, RAMDualAccess.DESCRIPTION));
map.put(RegisterFile.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape(attr, RegisterFile.DESCRIPTION, 4)); map.put(RegisterFile.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape(attr, RegisterFile.DESCRIPTION, 4));
map.put(BlockRAMDualPort.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape(attr, BlockRAMDualPort.DESCRIPTION)); map.put(BlockRAMDualPort.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape(attr, BlockRAMDualPort.DESCRIPTION));
map.put(RAMAsync.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape(attr, RAMAsync.DESCRIPTION));
map.put(In.DESCRIPTION.getName(), InputShape::new); map.put(In.DESCRIPTION.getName(), InputShape::new);
map.put(Reset.DESCRIPTION.getName(), ResetShape::new); map.put(Reset.DESCRIPTION.getName(), ResetShape::new);

View File

@ -625,6 +625,15 @@
</string> </string>
<string name="elem_RAMDualPort_pin_str">Ist diese Leitung high, wird das Datenwort gespeichert, wenn der Takt ansteigt.</string> <string name="elem_RAMDualPort_pin_str">Ist diese Leitung high, wird das Datenwort gespeichert, wenn der Takt ansteigt.</string>
<string name="elem_RAMAsync">RAM, asynchron</string>
<string name="elem_RAMAsync_tt">Solange we gesetzt ist, wird gespeichert. Entspricht einem sehr einfachem RAM, bei
welchem die Adress- und Datenleitungen direkt mit den Decodern der Speicherzellen verbunden sind.</string>
<string name="elem_RAMAsync_pin_A">Die Adresse, an der gelesen bzw. geschrieben wird.</string>
<string name="elem_RAMAsync_pin_D">Die Daten, die gespeichert werden sollen.</string>
<string name="elem_RAMAsync_pin_we">Schreibfreigabe. Solange hier eine 1 anliegt, wird bei jeder Änderung von A oder D
der Wert der an D anliegt an der Adresse gespeichert welche bei A anliegt.</string>
<string name="elem_RAMAsync_pin_Q">Ausgabe der gespeicherten Daten.</string>
<string name="elem_BlockRAMDualPort">Block-RAM, getrennte Ports</string> <string name="elem_BlockRAMDualPort">Block-RAM, getrennte Ports</string>
<string name="elem_BlockRAMDualPort_short">RAM</string> <string name="elem_BlockRAMDualPort_short">RAM</string>
<string name="elem_BlockRAMDualPort_tt">Ein RAM Modul mit getrennten Daten-Anschlüssen für Lesen und Schreiben. <string name="elem_BlockRAMDualPort_tt">Ein RAM Modul mit getrennten Daten-Anschlüssen für Lesen und Schreiben.

View File

@ -691,6 +691,15 @@
stored. stored.
</string> </string>
<string name="elem_RAMAsync">RAM, async.</string>
<string name="elem_RAMAsync_tt">As long as we is set, it is stored. Corresponds to a very simple RAM, where the
address and data lines are directly connected to the decoders of the memory cells.</string>
<string name="elem_RAMAsync_pin_A">The address at which reading or writing takes place.</string>
<string name="elem_RAMAsync_pin_D">The data to be stored.</string>
<string name="elem_RAMAsync_pin_we">Write enable. As long as this input is set to 1, the value applied to D is
stored at the address applied to A whenever A or D is changed.</string>
<string name="elem_RAMAsync_pin_Q">Output of the stored data.</string>
<string name="elem_RegisterFile">Register File</string> <string name="elem_RegisterFile">Register File</string>
<string name="elem_RegisterFile_short">Register</string> <string name="elem_RegisterFile_short">Register</string>
<string name="elem_RegisterFile_tt">Memory with one port that allows to write and two ports that allow to read from <string name="elem_RegisterFile_tt">Memory with one port that allows to write and two ports that allow to read from