diff options
-rw-r--r-- | assets/ppu-pipeline.svg | 2 | ||||
-rw-r--r-- | basys3/basys3.srcs/ppu.vhd | 32 | ||||
-rw-r--r-- | basys3/basys3.srcs/ppu_dispctl.vhd | 14 | ||||
-rw-r--r-- | basys3/basys3.srcs/ppu_pceg.vhd | 29 | ||||
-rw-r--r-- | basys3/basys3.srcs/ppu_sprite_bg.vhd | 2 | ||||
-rw-r--r-- | basys3/basys3.srcs/ppu_sprite_fg.vhd | 23 | ||||
-rw-r--r-- | basys3/basys3.srcs/sources_1/ip/ppu_bam/ppu_bam.xci | 36 | ||||
-rw-r--r-- | basys3/basys3.srcs/sources_1/ip/ppu_dispctl_slbuf/ppu_dispctl_slbuf.xci | 32 | ||||
-rw-r--r-- | basys3/basys3.srcs/sources_1/ip/ppu_tmm/ppu_tmm.xci | 32 | ||||
-rw-r--r-- | basys3/basys3.srcs/top.vhd | 3 | ||||
-rw-r--r-- | basys3/basys3.xpr | 22 | ||||
-rw-r--r-- | basys3/ppu_tb_behav.wcfg | 234 | ||||
-rw-r--r-- | docs/ppu.drawio | 2 | ||||
-rw-r--r-- | src/demo.c | 5 | ||||
-rw-r--r-- | src/ppu/internals.c | 1 | ||||
-rw-r--r-- | src/ppu/stm.c | 1 |
16 files changed, 268 insertions, 202 deletions
diff --git a/assets/ppu-pipeline.svg b/assets/ppu-pipeline.svg index 532e443..31df471 100644 --- a/assets/ppu-pipeline.svg +++ b/assets/ppu-pipeline.svg @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="903px" height="202px" viewBox="-0.5 -0.5 903 202" style="background-color: rgb(255, 255, 255);"><defs/><g><path d="M 100 200 L 100 0" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 200 L 180 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 260 200 L 260 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 340 200 L 340 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 420 200 L 420 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 500 200 L 500 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 580 200 L 580 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 660 200 L 660 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 740 200 L 740 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 820 200 L 820 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 900 200 L 900 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 190 110 L 490 110 L 500 125 L 490 140 L 190 140 L 180 125 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 125px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">hold</div></div></div></foreignObject><text x="340" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">hold</text></switch></g><path d="M 901 20 L 100 20" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 45px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ppu_sprite_bg</div></div></div></foreignObject><text x="96" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_bg</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">0</div></div></div></foreignObject><text x="140" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">0</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">1</div></div></div></foreignObject><text x="220" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">1</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 261px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">2</div></div></div></foreignObject><text x="300" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">2</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">3</div></div></div></foreignObject><text x="380" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">3</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">4</div></div></div></foreignObject><text x="460" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">4</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">5</div></div></div></foreignObject><text x="540" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">5</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">6</div></div></div></foreignObject><text x="620" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">6</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 661px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">7</div></div></div></foreignObject><text x="700" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">7</text></switch></g><path d="M 190 30 L 330 30 L 340 45 L 330 60 L 190 60 L 180 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 45px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">BAM address</div></div></div></foreignObject><text x="260" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">BAM address</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 85px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ppu_sprite_fg</div></div></div></foreignObject><text x="96" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_fg</text></switch></g><path d="M 190 70 L 330 70 L 340 85 L 330 100 L 190 100 L 180 85 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 85px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">TMM address</div></div></div></foreignObject><text x="260" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">TMM address</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 10px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">clk</div></div></div></foreignObject><text x="96" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">clk</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 165px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ppu_pceg</div></div></div></foreignObject><text x="96" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_pceg</text></switch></g><path d="M 750 160 L 810 160 L 820 175 L 810 190 L 750 190 L 740 175 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 175px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">pixel done</div></div></div></foreignObject><text x="780" y="179" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">pixel done</text></switch></g><path d="M 750 30 L 810 30 L 820 45 L 810 60 L 750 60 L 740 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">TMM data</div></div></div></foreignObject><text x="780" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TMM data</text></switch></g><path d="M 510 30 L 650 30 L 660 45 L 650 60 L 510 60 L 500 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 45px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">TMM address</div></div></div></foreignObject><text x="580" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">TMM address</text></switch></g><path d="M 830 160 L 890 160 L 900 175 L 890 190 L 830 190 L 820 175 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 175px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">pixel ready</div></div></div></foreignObject><text x="860" y="179" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">pixel ready</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">8</div></div></div></foreignObject><text x="780" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">8</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">9</div></div></div></foreignObject><text x="860" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">9</text></switch></g><path d="M 430 30 L 490 30 L 500 45 L 490 60 L 430 60 L 420 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">BAM data</div></div></div></foreignObject><text x="460" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">BAM data</text></switch></g><path d="M 430 70 L 490 70 L 500 85 L 490 100 L 430 100 L 420 85 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">TMM data</div></div></div></foreignObject><text x="460" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TMM data</text></switch></g><path d="M 110 30 L 170 30 L 180 45 L 170 60 L 110 60 L 100 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="140" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 110 150 L 170 150 L 180 165 L 170 180 L 110 180 L 100 165 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 165px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">input<br />stability</div></div></div></foreignObject><text x="140" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">input...</text></switch></g><path d="M 350 30 L 410 30 L 420 45 L 410 60 L 350 60 L 340 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="380" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 350 70 L 410 70 L 420 85 L 410 100 L 350 100 L 340 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="380" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 670 30 L 730 30 L 740 45 L 730 60 L 670 60 L 660 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 661px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="700" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 510 70 L 570 70 L 580 85 L 570 100 L 510 100 L 500 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="540" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 830 30 L 890 30 L 900 45 L 890 60 L 830 60 L 820 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="860" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 110 110 L 170 110 L 180 125 L 170 140 L 110 140 L 100 125 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 125px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">HIT (in-accurate)</div></div></div></foreignObject><text x="140" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">HIT (in-accur...</text></switch></g><path d="M 110 70 L 170 70 L 180 85 L 170 100 L 110 100 L 100 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="140" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 125px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ppu_sprite_fg</div></div></div></foreignObject><text x="96" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_fg</text></switch></g><path d="M 510 110 L 570 110 L 580 125 L 570 140 L 510 140 L 500 125 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 125px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; text-decoration: underline; white-space: normal; overflow-wrap: normal;">HIT (real)</div></div></div></foreignObject><text x="540" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">HIT (real)</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="982px" height="232px" viewBox="-0.5 -0.5 982 232" style="background-color: rgb(255, 255, 255);"><defs/><g><path d="M 100 230 L 100 0" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 180 230 L 180 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 260 230 L 260 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 340 230 L 340 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 420 230 L 420 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 500 230 L 500 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 580 230 L 580 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 660 230 L 660 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 740 230 L 740 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 820 230 L 820 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 900 230 L 900 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 979.17 230 L 979.17 0" fill="none" stroke="rgb(0, 0, 0)" stroke-opacity="0.5" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 980 20 L 100 20" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="0" y="30" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 45px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ppu_sprite_bg</div></div></div></foreignObject><text x="96" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_bg</text></switch></g><rect x="100" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">0</div></div></div></foreignObject><text x="140" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">0</text></switch></g><rect x="180" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">1</div></div></div></foreignObject><text x="220" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">1</text></switch></g><rect x="260" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 261px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">2</div></div></div></foreignObject><text x="300" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">2</text></switch></g><rect x="340" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">3</div></div></div></foreignObject><text x="380" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">3</text></switch></g><rect x="420" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">4</div></div></div></foreignObject><text x="460" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">4</text></switch></g><rect x="500" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">5</div></div></div></foreignObject><text x="540" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">5</text></switch></g><rect x="580" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">6</div></div></div></foreignObject><text x="620" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">6</text></switch></g><rect x="660" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 661px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">7</div></div></div></foreignObject><text x="700" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">7</text></switch></g><path d="M 190 30 L 330 30 L 340 45 L 330 60 L 190 60 L 180 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 45px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">BAM address</div></div></div></foreignObject><text x="260" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">BAM address</text></switch></g><rect x="0" y="70" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 85px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ppu_sprite_fg</div></div></div></foreignObject><text x="96" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_fg</text></switch></g><path d="M 190 70 L 330 70 L 340 85 L 330 100 L 190 100 L 180 85 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 85px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">TMM address</div></div></div></foreignObject><text x="260" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">TMM address</text></switch></g><rect x="0" y="0" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 10px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">clk</div></div></div></foreignObject><text x="96" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">clk</text></switch></g><rect x="0" y="150" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 165px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ppu_pceg</div></div></div></foreignObject><text x="96" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_pceg</text></switch></g><path d="M 750 30 L 810 30 L 820 45 L 810 60 L 750 60 L 740 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">TMM data</div></div></div></foreignObject><text x="780" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TMM data</text></switch></g><path d="M 510 30 L 650 30 L 660 45 L 650 60 L 510 60 L 500 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 45px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">TMM address</div></div></div></foreignObject><text x="580" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">TMM address</text></switch></g><rect x="740" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">8</div></div></div></foreignObject><text x="780" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">8</text></switch></g><rect x="820" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">9</div></div></div></foreignObject><text x="860" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">9</text></switch></g><path d="M 430 30 L 490 30 L 500 45 L 490 60 L 430 60 L 420 45 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">BAM data</div></div></div></foreignObject><text x="460" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">BAM data</text></switch></g><path d="M 430 70 L 490 70 L 500 85 L 490 100 L 430 100 L 420 85 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">TMM data</div></div></div></foreignObject><text x="460" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TMM data</text></switch></g><path d="M 110 30 L 170 30 L 180 45 L 170 60 L 110 60 L 100 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="140" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 110 150 L 170 150 L 180 165 L 170 180 L 110 180 L 100 165 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 165px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">input<br />stability</div></div></div></foreignObject><text x="140" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">input...</text></switch></g><path d="M 350 30 L 410 30 L 420 45 L 410 60 L 350 60 L 340 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="380" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 350 70 L 410 70 L 420 85 L 410 100 L 350 100 L 340 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="380" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 670 30 L 730 30 L 740 45 L 730 60 L 670 60 L 660 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 661px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="700" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 510 70 L 570 70 L 580 85 L 570 100 L 510 100 L 500 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="540" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 830 30 L 890 30 L 900 45 L 890 60 L 830 60 L 820 45 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="860" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><path d="M 110 110 L 490 110 L 500 125 L 490 140 L 110 140 L 100 125 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 398px; height: 1px; padding-top: 125px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">HIT (inaccurate)</div></div></div></foreignObject><text x="300" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">HIT (inaccurate)</text></switch></g><path d="M 110 70 L 170 70 L 180 85 L 170 100 L 110 100 L 100 85 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 85px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">idle</div></div></div></foreignObject><text x="140" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">idle</text></switch></g><rect x="0" y="110" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 125px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ppu_sprite_fg</div></div></div></foreignObject><text x="96" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_sprite_fg</text></switch></g><path d="M 510 110 L 570 110 L 580 125 L 570 140 L 510 140 L 500 125 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 125px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">HIT (real)</div></div></div></foreignObject><text x="540" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">HIT (real)</text></switch></g><rect x="900" y="0" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 10px; margin-left: 901px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10</div></div></div></foreignObject><text x="940" y="14" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">10</text></switch></g><path d="M 750 150 L 810 150 L 820 165 L 810 180 L 750 180 L 740 165 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 165px; margin-left: 741px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">pixel done</div></div></div></foreignObject><text x="780" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">pixel done</text></switch></g><path d="M 830 150 L 890 150 L 900 165 L 890 180 L 830 180 L 820 165 Z" fill-opacity="0.7" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-opacity="0.7" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)" opacity="0.7"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 165px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">pixel ready</div></div></div></foreignObject><text x="860" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">pixel ready</text></switch></g><rect x="0" y="190" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 96px; height: 1px; padding-top: 205px; margin-left: 0px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ppu_dispctl</div></div></div></foreignObject><text x="96" y="209" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">ppu_dispctl</text></switch></g><path d="M 830 190 L 970 190 L 980 205 L 970 220 L 830 220 L 820 205 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 205px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: normal; overflow-wrap: normal;">scanline buffer write enable</div></div></div></foreignObject><text x="900" y="209" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" text-decoration="underline">scanline buffer write enab...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file diff --git a/basys3/basys3.srcs/ppu.vhd b/basys3/basys3.srcs/ppu.vhd index e6f959d..3f92a7e 100644 --- a/basys3/basys3.srcs/ppu.vhd +++ b/basys3/basys3.srcs/ppu.vhd @@ -24,8 +24,7 @@ architecture Behavioral of ppu is SPRITE_BG : out ppu_sprite_bg_pl_state := PL_BG_IDLE; -- sprite info fetch + sprite pixel fetch SPRITE_FG : out ppu_sprite_fg_pl_state := PL_FG_IDLE; -- sprite pixel fetch SPRITE_FG_HIT : out ppu_sprite_fg_hit_pl_state := PL_HIT_INACCURATE; -- foreground hit accuracy - DONE : out std_logic; -- last pipeline stage done - READY : out std_logic); -- rgb buffer propagation ready + DISPCTL_BWEN : out std_logic := '0'); -- display controller scanline buffer write enable end component; component ppu_addr_dec port( -- address decoder WEN : in std_logic; -- EXT write enable @@ -47,11 +46,8 @@ architecture Behavioral of ppu is addra : in std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); dina : in std_logic_vector(PPU_BAM_DATA_WIDTH-1 downto 0); clkb : in std_logic; - rstb : in std_logic; addrb : in std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); - doutb : out std_logic_vector(PPU_BAM_DATA_WIDTH-1 downto 0); - rsta_busy : out std_logic; - rstb_busy : out std_logic); + doutb : out std_logic_vector(PPU_BAM_DATA_WIDTH-1 downto 0)); end component; component ppu_tmm port( -- TMM block memory clka : in std_logic; @@ -59,11 +55,8 @@ architecture Behavioral of ppu is addra : in std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); dina : in std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0); clkb : in std_logic; - rstb : in std_logic; addrb : in std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); - doutb : out std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0); - rsta_busy : out std_logic; - rstb_busy : out std_logic); + doutb : out std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0)); end component; component ppu_aux port( CLK : in std_logic; -- system clock @@ -155,7 +148,7 @@ architecture Behavioral of ppu is X : out std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- tiny screen pixel x Y : out std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- tiny screen pixel y RI,GI,BI : in std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- color in - PREADY : in std_logic; -- current pixel ready (pixel color is stable) + BWEN : in std_logic; -- scanline buffer write enable RO,GO,BO : out std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- VGA color out NVSYNC, NHSYNC : out std_logic; -- VGA sync out @@ -165,10 +158,10 @@ architecture Behavioral of ppu is -- signals signal SYSCLK, SYSRST : std_logic; -- system clock and reset - signal PL_DONE, PL_READY : std_logic; -- pipeline stages signal PL_SPRITE_BG : ppu_sprite_bg_pl_state; signal PL_SPRITE_FG : ppu_sprite_fg_pl_state; signal PL_SPRITE_FG_HIT : ppu_sprite_fg_hit_pl_state; + signal PL_DISPCTL_BWEN : std_logic; signal TMM_WEN, BAM_WEN, FAM_WEN, PAL_WEN, AUX_WEN : std_logic; signal TMM_W_ADDR, TMM_R_ADDR : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -- read/write TMM addr (dual port) signal BAM_W_ADDR, BAM_R_ADDR : std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -- read/write BAM addr (dual port) @@ -206,8 +199,7 @@ begin SPRITE_FG => PL_SPRITE_FG, SPRITE_BG => PL_SPRITE_BG, SPRITE_FG_HIT => PL_SPRITE_FG_HIT, - DONE => PL_DONE, - READY => PL_READY); + DISPCTL_BWEN => PL_DISPCTL_BWEN); address_decoder : component ppu_addr_dec port map( WEN => WEN, @@ -229,22 +221,16 @@ begin addra => BAM_W_ADDR, dina => DATA(PPU_BAM_DATA_WIDTH-1 downto 0), clkb => SYSCLK, - rstb => SYSRST, addrb => BAM_R_ADDR, - doutb => BAM_R_DATA, - rsta_busy => open, - rstb_busy => open); + doutb => BAM_R_DATA); tilemap_memory : component ppu_tmm port map( clka => SYSCLK, wea => (others => TMM_WEN), addra => TMM_W_ADDR, dina => DATA(PPU_TMM_DATA_WIDTH-1 downto 0), clkb => SYSCLK, - rstb => SYSRST, addrb => TMM_R_ADDR, - doutb => TMM_R_DATA, - rsta_busy => open, - rstb_busy => open); + doutb => TMM_R_DATA); aux : component ppu_aux port map( CLK => SYSCLK, @@ -328,7 +314,7 @@ begin display_controller : component ppu_dispctl port map( SYSCLK => SYSCLK, RESET => SYSRST, - PREADY => PL_READY, + BWEN => PL_DISPCTL_BWEN, X => X, Y => Y, RI => UR, diff --git a/basys3/basys3.srcs/ppu_dispctl.vhd b/basys3/basys3.srcs/ppu_dispctl.vhd index ac8fbcf..1bff09d 100644 --- a/basys3/basys3.srcs/ppu_dispctl.vhd +++ b/basys3/basys3.srcs/ppu_dispctl.vhd @@ -11,7 +11,7 @@ entity ppu_dispctl is port( X : out std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- tiny screen pixel x Y : out std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- tiny screen pixel y RI,GI,BI : in std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- color in - PREADY : in std_logic; -- current pixel ready (pixel color is stable) + BWEN : in std_logic; -- scanline buffer write enable RO,GO,BO : out std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- VGA color out NVSYNC, NHSYNC : out std_logic; -- VGA sync out @@ -32,11 +32,8 @@ architecture Behavioral of ppu_dispctl is addra : in std_logic_vector(PPU_DISPCTL_SLBUF_ADDR_WIDTH-1 downto 0); dina : in std_logic_vector(PPU_RGB_COLOR_OUTPUT_DEPTH-1 downto 0); clkb : in std_logic; - rstb : in std_logic; addrb : in std_logic_vector(PPU_DISPCTL_SLBUF_ADDR_WIDTH-1 downto 0); - doutb : out std_logic_vector(PPU_RGB_COLOR_OUTPUT_DEPTH-1 downto 0); - rsta_busy : out std_logic; - rstb_busy : out std_logic); + doutb : out std_logic_vector(PPU_RGB_COLOR_OUTPUT_DEPTH-1 downto 0)); end component; signal NPIXCLK, TPIXCLK : std_logic; signal NHCOUNT, NVCOUNT : unsigned(PPU_VGA_SIGNAL_PIXEL_WIDTH-1 downto 0) := (others => '0'); @@ -144,15 +141,12 @@ begin scanline_buffer : component ppu_dispctl_slbuf port map( clka => SYSCLK, - wea => (others => PREADY), + wea => (others => BWEN), addra => ADDR_I, dina => DATA_I, clkb => SYSCLK, - rstb => RESET, addrb => ADDR_O, - doutb => DATA_O, - rsta_busy => open, - rstb_busy => open); + doutb => DATA_O); pixel_clock: component ppu_dispctl_pixclk port map( sysclk => SYSCLK, diff --git a/basys3/basys3.srcs/ppu_pceg.vhd b/basys3/basys3.srcs/ppu_pceg.vhd index e3c16e8..f87c60d 100644 --- a/basys3/basys3.srcs/ppu_pceg.vhd +++ b/basys3/basys3.srcs/ppu_pceg.vhd @@ -9,8 +9,7 @@ entity ppu_pceg is port( SPRITE_BG : out ppu_sprite_bg_pl_state := PL_BG_IDLE; -- sprite info fetch + sprite pixel fetch SPRITE_FG : out ppu_sprite_fg_pl_state := PL_FG_IDLE; -- sprite pixel fetch SPRITE_FG_HIT : out ppu_sprite_fg_hit_pl_state := PL_HIT_INACCURATE; -- foreground hit accuracy - DONE : out std_logic; -- last pipeline stage done - READY : out std_logic); -- rgb buffer propagation ready + DISPCTL_BWEN : out std_logic := '0'); -- display controller scanline buffer write enable end ppu_pceg; architecture Behavioral of ppu_pceg is @@ -24,38 +23,32 @@ begin SPRITE_BG <= PL_BG_IDLE; SPRITE_FG <= PL_FG_IDLE; - DONE <= '0'; - READY <= '0'; + DISPCTL_BWEN <= '0'; elsif falling_edge(CLK) then case CLK_IDX is when 0 => - DONE <= '0'; - READY <= '0'; + DISPCTL_BWEN <= '0'; SPRITE_BG <= PL_BG_IDLE; SPRITE_FG <= PL_FG_IDLE; SPRITE_FG_HIT <= PL_HIT_INACCURATE; when 1 => SPRITE_BG <= PL_BG_BAM_ADDR; SPRITE_FG <= PL_FG_TMM_ADDR; - when 3 => - SPRITE_BG <= PL_BG_IDLE; - SPRITE_FG <= PL_FG_IDLE; - when 4 => + when 2 => SPRITE_BG <= PL_BG_BAM_DATA; SPRITE_FG <= PL_FG_TMM_DATA; - when 5 => + when 3 => SPRITE_BG <= PL_BG_TMM_ADDR; SPRITE_FG <= PL_FG_IDLE; SPRITE_FG_HIT <= PL_HIT_ACCURATE; - when 6 => null; - when 7 => - SPRITE_BG <= PL_BG_IDLE; - when 8 => - DONE <= '1'; + when 4 => SPRITE_BG <= PL_BG_TMM_DATA; - when 9 => + when 5 => SPRITE_BG <= PL_BG_IDLE; - READY <= '1'; + when 6 => + DISPCTL_BWEN <= '1'; + when 7 => + DISPCTL_BWEN <= '0'; when others => null; end case; diff --git a/basys3/basys3.srcs/ppu_sprite_bg.vhd b/basys3/basys3.srcs/ppu_sprite_bg.vhd index ef8ffc8..9b6643e 100644 --- a/basys3/basys3.srcs/ppu_sprite_bg.vhd +++ b/basys3/basys3.srcs/ppu_sprite_bg.vhd @@ -114,7 +114,7 @@ begin R_BAM_DATA <= (others => '0'); R_TMM_ADDR <= (others => '0'); R_TMM_DATA <= (others => '0'); - elsif rising_edge(CLK) then + elsif falling_edge(CLK) then BAM_ADDR_EN <= true when PL_STAGE = PL_BG_BAM_ADDR else false; TMM_ADDR_EN <= true when PL_STAGE = PL_BG_TMM_ADDR else false; -- R_BAM_ADDR <= T_BAM_ADDR; diff --git a/basys3/basys3.srcs/ppu_sprite_fg.vhd b/basys3/basys3.srcs/ppu_sprite_fg.vhd index d6ffe16..9aabd88 100644 --- a/basys3/basys3.srcs/ppu_sprite_fg.vhd +++ b/basys3/basys3.srcs/ppu_sprite_fg.vhd @@ -83,6 +83,9 @@ architecture Behavioral of ppu_sprite_fg is signal TILEMAP_WORD_OFFSET : integer := 0; -- word offset from tile start address in TMM signal TMM_DATA_COL_IDX : std_logic_vector(PPU_PALETTE_COLOR_WIDTH-1 downto 0); -- color of palette + + signal PL_STAGE_NOW : ppu_sprite_fg_pl_state; + signal PL_HIT_NOW : ppu_sprite_fg_hit_pl_state; begin -- FAM memory FAM : component er_ram @@ -134,10 +137,10 @@ begin inaccurate_occlusion_shims: if IDX >= PPU_ACCURATE_FG_SPRITE_COUNT generate -- state machine for synchronizing pipeline stages begin - HIT <= (SPRITE_ACTIVE) when PL_HIT = PL_HIT_INACCURATE else - (SPRITE_ACTIVE and (or TMM_DATA_COL_IDX)) when PL_HIT = PL_HIT_ACCURATE else '0'; + HIT <= (SPRITE_ACTIVE) when PL_HIT_NOW = PL_HIT_INACCURATE else + (SPRITE_ACTIVE and (or TMM_DATA_COL_IDX)) when PL_HIT_NOW = PL_HIT_ACCURATE else '0'; -- only fetch if OE is high, and during the second pipeline stage - TMM_ADDR <= R_TMM_ADDR when OE = '1' and PL_STAGE = PL_FG_TMM_ADDR else (others => 'Z'); + TMM_ADDR <= R_TMM_ADDR when OE = '1' and PL_STAGE_NOW = PL_FG_TMM_ADDR else (others => 'Z'); T_TMM_ADDR <= std_logic_vector(TILEMAP_WORD + to_unsigned(TILEMAP_WORD_OFFSET, PPU_TMM_ADDR_WIDTH)); -- TMM address -- TMM DATA @@ -149,6 +152,16 @@ begin R_TMM_DATA(14 downto 12) when 4, (others => '0') when others; + -- rising edge clock process (buffer pipeline stage) + process(CLK, RESET) + begin + if rising_edge(CLK) then + PL_HIT_NOW <= PL_HIT; + PL_STAGE_NOW <= PL_STAGE; + end if; + end process; + + -- falling edge clock process (read buffered pipeline stage) process(CLK, RESET) begin if RESET = '1' then @@ -157,8 +170,8 @@ begin R_TMM_DATA <= (others => '0'); elsif OE = '0' then null; -- don't read/write if current sprite is not the top sprite - elsif rising_edge(CLK) then - case PL_STAGE is + elsif falling_edge(CLK) then + case PL_STAGE_NOW is when PL_FG_TMM_ADDR => R_TMM_ADDR <= T_TMM_ADDR; when PL_FG_TMM_DATA => diff --git a/basys3/basys3.srcs/sources_1/ip/ppu_bam/ppu_bam.xci b/basys3/basys3.srcs/sources_1/ip/ppu_bam/ppu_bam.xci index c188e32..2241667 100644 --- a/basys3/basys3.srcs/sources_1/ip/ppu_bam/ppu_bam.xci +++ b/basys3/basys3.srcs/sources_1/ip/ppu_bam/ppu_bam.xci @@ -14,7 +14,7 @@ "Use_AXI_ID": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "AXI_ID_Width": [ { "value": "4", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], "Memory_Type": [ { "value": "Simple_Dual_Port_RAM", "value_src": "user", "resolve_type": "user", "usage": "all" } ], - "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "usage": "all" } ], + "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Enable_32bit_Address": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], "ecctype": [ { "value": "No_ECC", "resolve_type": "user", "usage": "all" } ], "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], @@ -44,24 +44,24 @@ "Register_PortA_Output_of_Memory_Primitives": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Register_PortA_Output_of_Memory_Core": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Use_REGCEA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], - "Register_PortB_Output_of_Memory_Primitives": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Register_PortB_Output_of_Memory_Primitives": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], "Register_PortB_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "register_porta_input_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "register_portb_output_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Pipeline_Stages": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Load_Init_File": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], "Coe_File": [ { "value": "no_coe_file_loaded", "resolve_type": "user", "enabled": false, "usage": "all" } ], - "Fill_Remaining_Memory_Locations": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Remaining_Memory_Locations": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Fill_Remaining_Memory_Locations": [ { "value": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Remaining_Memory_Locations": [ { "value": "0", "resolve_type": "user", "usage": "all" } ], "Use_RSTA_Pin": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Reset_Memory_Latch_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Reset_Priority_A": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Output_Reset_Value_A": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], - "Use_RSTB_Pin": [ { "value": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Reset_Memory_Latch_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Reset_Priority_B": [ { "value": "CE", "resolve_type": "user", "usage": "all" } ], - "Output_Reset_Value_B": [ { "value": "0", "resolve_type": "user", "usage": "all" } ], + "Use_RSTB_Pin": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Reset_Memory_Latch_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Reset_Priority_B": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Output_Reset_Value_B": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Reset_Type": [ { "value": "SYNC", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Additional_Inputs_for_Power_Estimation": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], "Port_A_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], @@ -76,7 +76,7 @@ "use_bram_block": [ { "value": "Stand_Alone", "resolve_type": "user", "usage": "all" } ], "MEM_FILE": [ { "value": "no_mem_loaded", "resolve_type": "user", "usage": "all" } ], "CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "user", "usage": "all" } ], - "EN_SAFETY_CKT": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "EN_SAFETY_CKT": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "READ_LATENCY_A": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], "READ_LATENCY_B": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ] }, @@ -99,7 +99,7 @@ "C_LOAD_INIT_FILE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_INIT_FILE_NAME": [ { "value": "no_coe_file_loaded", "resolve_type": "generated", "usage": "all" } ], "C_INIT_FILE": [ { "value": "ppu_bam.mem", "resolve_type": "generated", "usage": "all" } ], - "C_USE_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_USE_DEFAULT_DATA": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], "C_HAS_RSTA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_RST_PRIORITY_A": [ { "value": "CE", "resolve_type": "generated", "usage": "all" } ], @@ -115,7 +115,7 @@ "C_WRITE_DEPTH_A": [ { "value": "1200", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_READ_DEPTH_A": [ { "value": "1200", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_ADDRA_WIDTH": [ { "value": "11", "resolve_type": "generated", "format": "long", "usage": "all" } ], - "C_HAS_RSTB": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_RSTB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_RST_PRIORITY_B": [ { "value": "CE", "resolve_type": "generated", "usage": "all" } ], "C_RSTRAM_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_INITB_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], @@ -130,7 +130,7 @@ "C_READ_DEPTH_B": [ { "value": "1200", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_ADDRB_WIDTH": [ { "value": "11", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_HAS_MEM_OUTPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], - "C_HAS_MEM_OUTPUT_REGS_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MEM_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_HAS_MUX_OUTPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_HAS_MUX_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_MUX_PIPELINE_STAGES": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], @@ -151,7 +151,7 @@ "C_EN_RDADDRB_CHG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_EN_DEEPSLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_EN_SHUTDOWN_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], - "C_EN_SAFETY_CKT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_SAFETY_CKT": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_DISABLE_WARN_BHV_RANGE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_COUNT_36K_BRAM": [ { "value": "1", "resolve_type": "generated", "usage": "all" } ], "C_COUNT_18K_BRAM": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], @@ -190,11 +190,8 @@ "addra": [ { "direction": "in", "size_left": "10", "size_right": "0", "driver_value": "0" } ], "dina": [ { "direction": "in", "size_left": "14", "size_right": "0", "driver_value": "0" } ], "clkb": [ { "direction": "in", "driver_value": "0" } ], - "rstb": [ { "direction": "in", "driver_value": "0" } ], "addrb": [ { "direction": "in", "size_left": "10", "size_right": "0", "driver_value": "0" } ], - "doutb": [ { "direction": "out", "size_left": "14", "size_right": "0" } ], - "rsta_busy": [ { "direction": "out" } ], - "rstb_busy": [ { "direction": "out" } ] + "doutb": [ { "direction": "out", "size_left": "14", "size_right": "0" } ] }, "interfaces": { "CLK.ACLK": { @@ -255,8 +252,7 @@ "port_maps": { "ADDR": [ { "physical_name": "addrb" } ], "CLK": [ { "physical_name": "clkb" } ], - "DOUT": [ { "physical_name": "doutb" } ], - "RST": [ { "physical_name": "rstb" } ] + "DOUT": [ { "physical_name": "doutb" } ] } } }, diff --git a/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_slbuf/ppu_dispctl_slbuf.xci b/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_slbuf/ppu_dispctl_slbuf.xci index 22b53c3..2a0ddf1 100644 --- a/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_slbuf/ppu_dispctl_slbuf.xci +++ b/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_slbuf/ppu_dispctl_slbuf.xci @@ -14,7 +14,7 @@ "Use_AXI_ID": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "AXI_ID_Width": [ { "value": "4", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], "Memory_Type": [ { "value": "Simple_Dual_Port_RAM", "value_src": "user", "resolve_type": "user", "usage": "all" } ], - "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "usage": "all" } ], + "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Enable_32bit_Address": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], "ecctype": [ { "value": "No_ECC", "resolve_type": "user", "usage": "all" } ], "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], @@ -44,24 +44,24 @@ "Register_PortA_Output_of_Memory_Primitives": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Register_PortA_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Use_REGCEA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], - "Register_PortB_Output_of_Memory_Primitives": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Register_PortB_Output_of_Memory_Primitives": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], "Register_PortB_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "register_porta_input_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "register_portb_output_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Pipeline_Stages": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Load_Init_File": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], "Coe_File": [ { "value": "no_coe_file_loaded", "resolve_type": "user", "enabled": false, "usage": "all" } ], - "Fill_Remaining_Memory_Locations": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Fill_Remaining_Memory_Locations": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], "Remaining_Memory_Locations": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Use_RSTA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Reset_Memory_Latch_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Reset_Priority_A": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Output_Reset_Value_A": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], - "Use_RSTB_Pin": [ { "value": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Reset_Memory_Latch_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Reset_Priority_B": [ { "value": "CE", "resolve_type": "user", "usage": "all" } ], - "Output_Reset_Value_B": [ { "value": "0", "resolve_type": "user", "usage": "all" } ], + "Use_RSTB_Pin": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Reset_Memory_Latch_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Reset_Priority_B": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Output_Reset_Value_B": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Reset_Type": [ { "value": "SYNC", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Additional_Inputs_for_Power_Estimation": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], "Port_A_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], @@ -76,7 +76,7 @@ "use_bram_block": [ { "value": "Stand_Alone", "resolve_type": "user", "usage": "all" } ], "MEM_FILE": [ { "value": "no_mem_loaded", "resolve_type": "user", "usage": "all" } ], "CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "user", "usage": "all" } ], - "EN_SAFETY_CKT": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "EN_SAFETY_CKT": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "READ_LATENCY_A": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], "READ_LATENCY_B": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ] }, @@ -115,7 +115,7 @@ "C_WRITE_DEPTH_A": [ { "value": "640", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_READ_DEPTH_A": [ { "value": "640", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_ADDRA_WIDTH": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ], - "C_HAS_RSTB": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_RSTB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_RST_PRIORITY_B": [ { "value": "CE", "resolve_type": "generated", "usage": "all" } ], "C_RSTRAM_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_INITB_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], @@ -130,7 +130,7 @@ "C_READ_DEPTH_B": [ { "value": "640", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_ADDRB_WIDTH": [ { "value": "10", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_HAS_MEM_OUTPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], - "C_HAS_MEM_OUTPUT_REGS_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MEM_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_HAS_MUX_OUTPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_HAS_MUX_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_MUX_PIPELINE_STAGES": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], @@ -151,7 +151,7 @@ "C_EN_RDADDRB_CHG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_EN_DEEPSLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_EN_SHUTDOWN_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], - "C_EN_SAFETY_CKT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_SAFETY_CKT": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_DISABLE_WARN_BHV_RANGE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_COUNT_36K_BRAM": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], "C_COUNT_18K_BRAM": [ { "value": "1", "resolve_type": "generated", "usage": "all" } ], @@ -190,11 +190,8 @@ "addra": [ { "direction": "in", "size_left": "9", "size_right": "0", "driver_value": "0" } ], "dina": [ { "direction": "in", "size_left": "11", "size_right": "0", "driver_value": "0" } ], "clkb": [ { "direction": "in", "driver_value": "0" } ], - "rstb": [ { "direction": "in", "driver_value": "0" } ], "addrb": [ { "direction": "in", "size_left": "9", "size_right": "0", "driver_value": "0" } ], - "doutb": [ { "direction": "out", "size_left": "11", "size_right": "0" } ], - "rsta_busy": [ { "direction": "out" } ], - "rstb_busy": [ { "direction": "out" } ] + "doutb": [ { "direction": "out", "size_left": "11", "size_right": "0" } ] }, "interfaces": { "CLK.ACLK": { @@ -255,8 +252,7 @@ "port_maps": { "ADDR": [ { "physical_name": "addrb" } ], "CLK": [ { "physical_name": "clkb" } ], - "DOUT": [ { "physical_name": "doutb" } ], - "RST": [ { "physical_name": "rstb" } ] + "DOUT": [ { "physical_name": "doutb" } ] } } }, diff --git a/basys3/basys3.srcs/sources_1/ip/ppu_tmm/ppu_tmm.xci b/basys3/basys3.srcs/sources_1/ip/ppu_tmm/ppu_tmm.xci index e08ff96..1e10591 100644 --- a/basys3/basys3.srcs/sources_1/ip/ppu_tmm/ppu_tmm.xci +++ b/basys3/basys3.srcs/sources_1/ip/ppu_tmm/ppu_tmm.xci @@ -14,7 +14,7 @@ "Use_AXI_ID": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "AXI_ID_Width": [ { "value": "4", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], "Memory_Type": [ { "value": "Simple_Dual_Port_RAM", "value_src": "user", "resolve_type": "user", "usage": "all" } ], - "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "usage": "all" } ], + "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Enable_32bit_Address": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], "ecctype": [ { "value": "No_ECC", "resolve_type": "user", "usage": "all" } ], "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], @@ -44,9 +44,9 @@ "Register_PortA_Output_of_Memory_Primitives": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Register_PortA_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Use_REGCEA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], - "Register_PortB_Output_of_Memory_Primitives": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Register_PortB_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Register_PortB_Output_of_Memory_Primitives": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Register_PortB_Output_of_Memory_Core": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Use_REGCEB_Pin": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "register_porta_input_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "register_portb_output_of_softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Pipeline_Stages": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], @@ -58,10 +58,10 @@ "Reset_Memory_Latch_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "Reset_Priority_A": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Output_Reset_Value_A": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], - "Use_RSTB_Pin": [ { "value": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Reset_Memory_Latch_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], - "Reset_Priority_B": [ { "value": "CE", "resolve_type": "user", "usage": "all" } ], - "Output_Reset_Value_B": [ { "value": "0", "resolve_type": "user", "usage": "all" } ], + "Use_RSTB_Pin": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "Reset_Memory_Latch_B": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], + "Reset_Priority_B": [ { "value": "CE", "resolve_type": "user", "enabled": false, "usage": "all" } ], + "Output_Reset_Value_B": [ { "value": "0", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Reset_Type": [ { "value": "SYNC", "resolve_type": "user", "enabled": false, "usage": "all" } ], "Additional_Inputs_for_Power_Estimation": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], "Port_A_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], @@ -76,7 +76,7 @@ "use_bram_block": [ { "value": "Stand_Alone", "resolve_type": "user", "usage": "all" } ], "MEM_FILE": [ { "value": "no_mem_loaded", "resolve_type": "user", "usage": "all" } ], "CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "user", "usage": "all" } ], - "EN_SAFETY_CKT": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], + "EN_SAFETY_CKT": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], "READ_LATENCY_A": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], "READ_LATENCY_B": [ { "value": "1", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ] }, @@ -115,7 +115,7 @@ "C_WRITE_DEPTH_A": [ { "value": "53248", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_READ_DEPTH_A": [ { "value": "53248", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_ADDRA_WIDTH": [ { "value": "16", "resolve_type": "generated", "format": "long", "usage": "all" } ], - "C_HAS_RSTB": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_RSTB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_RST_PRIORITY_B": [ { "value": "CE", "resolve_type": "generated", "usage": "all" } ], "C_RSTRAM_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_INITB_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], @@ -130,7 +130,7 @@ "C_READ_DEPTH_B": [ { "value": "53248", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_ADDRB_WIDTH": [ { "value": "16", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_HAS_MEM_OUTPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], - "C_HAS_MEM_OUTPUT_REGS_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_HAS_MEM_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_HAS_MUX_OUTPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_HAS_MUX_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_MUX_PIPELINE_STAGES": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], @@ -151,7 +151,7 @@ "C_EN_RDADDRB_CHG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_EN_DEEPSLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_EN_SHUTDOWN_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], - "C_EN_SAFETY_CKT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], + "C_EN_SAFETY_CKT": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_DISABLE_WARN_BHV_RANGE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], "C_COUNT_36K_BRAM": [ { "value": "19", "resolve_type": "generated", "usage": "all" } ], "C_COUNT_18K_BRAM": [ { "value": "8", "resolve_type": "generated", "usage": "all" } ], @@ -190,11 +190,8 @@ "addra": [ { "direction": "in", "size_left": "15", "size_right": "0", "driver_value": "0" } ], "dina": [ { "direction": "in", "size_left": "14", "size_right": "0", "driver_value": "0" } ], "clkb": [ { "direction": "in", "driver_value": "0" } ], - "rstb": [ { "direction": "in", "driver_value": "0" } ], "addrb": [ { "direction": "in", "size_left": "15", "size_right": "0", "driver_value": "0" } ], - "doutb": [ { "direction": "out", "size_left": "14", "size_right": "0" } ], - "rsta_busy": [ { "direction": "out" } ], - "rstb_busy": [ { "direction": "out" } ] + "doutb": [ { "direction": "out", "size_left": "14", "size_right": "0" } ] }, "interfaces": { "CLK.ACLK": { @@ -255,8 +252,7 @@ "port_maps": { "ADDR": [ { "physical_name": "addrb" } ], "CLK": [ { "physical_name": "clkb" } ], - "DOUT": [ { "physical_name": "doutb" } ], - "RST": [ { "physical_name": "rstb" } ] + "DOUT": [ { "physical_name": "doutb" } ] } } }, diff --git a/basys3/basys3.srcs/top.vhd b/basys3/basys3.srcs/top.vhd index cc98821..debd819 100644 --- a/basys3/basys3.srcs/top.vhd +++ b/basys3/basys3.srcs/top.vhd @@ -56,7 +56,8 @@ begin DO => SPI_DATA, WEN => PPU_WEN); - DBG_LEDS_OUT <= SPI_DATA_ADDR when DBG_DISP_ADDR = '1' else SPI_DATA_DATA; + -- DBG_LEDS_OUT <= SPI_DATA_ADDR when DBG_DISP_ADDR = '1' else SPI_DATA_DATA; + DBG_LEDS_OUT <= (others => '0'); picture_processing_unit: component ppu port map( CLK100 => SYSCLK, diff --git a/basys3/basys3.xpr b/basys3/basys3.xpr index c64023c..0bc96a1 100644 --- a/basys3/basys3.xpr +++ b/basys3/basys3.xpr @@ -60,20 +60,20 @@ <Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/> <Option Name="EnableBDX" Val="FALSE"/> <Option Name="DSABoardId" Val="basys3"/> - <Option Name="WTXSimLaunchSim" Val="173"/> + <Option Name="WTXSimLaunchSim" Val="213"/> <Option Name="WTModelSimLaunchSim" Val="0"/> <Option Name="WTQuestaLaunchSim" Val="0"/> <Option Name="WTIesLaunchSim" Val="0"/> <Option Name="WTVcsLaunchSim" Val="0"/> <Option Name="WTRivieraLaunchSim" Val="0"/> <Option Name="WTActivehdlLaunchSim" Val="0"/> - <Option Name="WTXSimExportSim" Val="7"/> - <Option Name="WTModelSimExportSim" Val="7"/> - <Option Name="WTQuestaExportSim" Val="7"/> + <Option Name="WTXSimExportSim" Val="11"/> + <Option Name="WTModelSimExportSim" Val="11"/> + <Option Name="WTQuestaExportSim" Val="11"/> <Option Name="WTIesExportSim" Val="0"/> - <Option Name="WTVcsExportSim" Val="7"/> - <Option Name="WTRivieraExportSim" Val="7"/> - <Option Name="WTActivehdlExportSim" Val="7"/> + <Option Name="WTVcsExportSim" Val="11"/> + <Option Name="WTRivieraExportSim" Val="11"/> + <Option Name="WTActivehdlExportSim" Val="11"/> <Option Name="GenerateIPUpgradeLog" Val="TRUE"/> <Option Name="XSimRadix" Val="hex"/> <Option Name="XSimTimeUnit" Val="ns"/> @@ -394,9 +394,7 @@ </Run> <Run Id="synth_4" Type="Ft3:Synth" SrcSet="sources_1" Part="xc7a35tcpg236-1" ConstrsSet="constrs_1" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="true" IncrementalCheckpoint="$PSRCDIR/utils_1/imports/synth_4/top.dcp" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/synth_4" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/synth_4" AutoRQSDir="$PSRCDIR/utils_1/imports/synth_4"> <Strategy Version="1" Minor="2"> - <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"> - <Desc>Vivado Synthesis Defaults</Desc> - </StratHandle> + <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"/> <Step Id="synth_design"/> </Strategy> <GeneratedRun Dir="$PRUNDIR" File="gen_run.xml"/> @@ -474,9 +472,7 @@ </Run> <Run Id="impl_4" Type="Ft2:EntireDesign" Part="xc7a35tcpg236-1" ConstrsSet="constrs_1" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/impl_4" SynthRun="synth_4" IncludeInArchive="true" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/impl_4" AutoRQSDir="$PSRCDIR/utils_1/imports/impl_4"> <Strategy Version="1" Minor="2"> - <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"> - <Desc>Default settings for Implementation.</Desc> - </StratHandle> + <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"/> <Step Id="init_design"/> <Step Id="opt_design"/> <Step Id="power_opt_design"/> diff --git a/basys3/ppu_tb_behav.wcfg b/basys3/ppu_tb_behav.wcfg index 9acf47e..df141cd 100644 --- a/basys3/ppu_tb_behav.wcfg +++ b/basys3/ppu_tb_behav.wcfg @@ -13,15 +13,15 @@ </db_ref> </db_ref_list> <zoom_setting> - <ZoomStartTime time="0.000000 us"></ZoomStartTime> - <ZoomEndTime time="2,716.000001 us"></ZoomEndTime> - <Cursor1Time time="450.650000 us"></Cursor1Time> + <ZoomStartTime time="929,912.593 ns"></ZoomStartTime> + <ZoomEndTime time="931,046.594 ns"></ZoomEndTime> + <Cursor1Time time="930,263.593 ns"></Cursor1Time> </zoom_setting> <column_width_setting> <NameColumnWidth column_width="257"></NameColumnWidth> - <ValueColumnWidth column_width="194"></ValueColumnWidth> + <ValueColumnWidth column_width="186"></ValueColumnWidth> </column_width_setting> - <WVObjectSize size="9" /> + <WVObjectSize size="10" /> <wvobject type="group" fp_name="group136"> <obj_property name="label">clks</obj_property> <obj_property name="DisplayName">label</obj_property> @@ -43,10 +43,7 @@ <wvobject type="group" fp_name="group150"> <obj_property name="label">ppu top</obj_property> <obj_property name="DisplayName">label</obj_property> - <wvobject type="logic" fp_name="/ppu_tb/uut/RESET"> - <obj_property name="ElementShortName">RESET</obj_property> - <obj_property name="ObjectShortName">RESET</obj_property> - </wvobject> + <obj_property name="isExpanded"></obj_property> <wvobject type="logic" fp_name="/ppu_tb/uut/WEN"> <obj_property name="ElementShortName">WEN</obj_property> <obj_property name="ObjectShortName">WEN</obj_property> @@ -59,30 +56,6 @@ <obj_property name="ElementShortName">DATA[15:0]</obj_property> <obj_property name="ObjectShortName">DATA[15:0]</obj_property> </wvobject> - <wvobject type="array" fp_name="/ppu_tb/uut/R"> - <obj_property name="ElementShortName">R[3:0]</obj_property> - <obj_property name="ObjectShortName">R[3:0]</obj_property> - </wvobject> - <wvobject type="array" fp_name="/ppu_tb/uut/G"> - <obj_property name="ElementShortName">G[3:0]</obj_property> - <obj_property name="ObjectShortName">G[3:0]</obj_property> - </wvobject> - <wvobject type="array" fp_name="/ppu_tb/uut/B"> - <obj_property name="ElementShortName">B[3:0]</obj_property> - <obj_property name="ObjectShortName">B[3:0]</obj_property> - </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/VSYNC"> - <obj_property name="ElementShortName">VSYNC</obj_property> - <obj_property name="ObjectShortName">VSYNC</obj_property> - </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/HSYNC"> - <obj_property name="ElementShortName">HSYNC</obj_property> - <obj_property name="ObjectShortName">HSYNC</obj_property> - </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/VBLANK"> - <obj_property name="ElementShortName">VBLANK</obj_property> - <obj_property name="ObjectShortName">VBLANK</obj_property> - </wvobject> <wvobject type="logic" fp_name="/ppu_tb/uut/SYSCLK"> <obj_property name="ElementShortName">SYSCLK</obj_property> <obj_property name="ObjectShortName">SYSCLK</obj_property> @@ -91,22 +64,6 @@ <obj_property name="ElementShortName">SYSRST</obj_property> <obj_property name="ObjectShortName">SYSRST</obj_property> </wvobject> - <wvobject type="other" fp_name="/ppu_tb/uut/PL_SPRITE_FG"> - <obj_property name="ElementShortName">PL_SPRITE_FG</obj_property> - <obj_property name="ObjectShortName">PL_SPRITE_FG</obj_property> - </wvobject> - <wvobject type="other" fp_name="/ppu_tb/uut/PL_SPRITE_BG"> - <obj_property name="ElementShortName">PL_SPRITE_BG</obj_property> - <obj_property name="ObjectShortName">PL_SPRITE_BG</obj_property> - </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/PL_DONE"> - <obj_property name="ElementShortName">PL_DONE</obj_property> - <obj_property name="ObjectShortName">PL_DONE</obj_property> - </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/PL_READY"> - <obj_property name="ElementShortName">PL_READY</obj_property> - <obj_property name="ObjectShortName">PL_READY</obj_property> - </wvobject> <wvobject type="logic" fp_name="/ppu_tb/uut/TMM_WEN"> <obj_property name="ElementShortName">TMM_WEN</obj_property> <obj_property name="ObjectShortName">TMM_WEN</obj_property> @@ -211,22 +168,6 @@ <obj_property name="ElementShortName">FG_FETCH</obj_property> <obj_property name="ObjectShortName">FG_FETCH</obj_property> </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/NVSYNC"> - <obj_property name="ElementShortName">NVSYNC</obj_property> - <obj_property name="ObjectShortName">NVSYNC</obj_property> - </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/NHSYNC"> - <obj_property name="ElementShortName">NHSYNC</obj_property> - <obj_property name="ObjectShortName">NHSYNC</obj_property> - </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/THBLANK"> - <obj_property name="ElementShortName">THBLANK</obj_property> - <obj_property name="ObjectShortName">THBLANK</obj_property> - </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/TVBLANK"> - <obj_property name="ElementShortName">TVBLANK</obj_property> - <obj_property name="ObjectShortName">TVBLANK</obj_property> - </wvobject> <wvobject type="logic" fp_name="/ppu_tb/uut/PCEG_RESET"> <obj_property name="ElementShortName">PCEG_RESET</obj_property> <obj_property name="ObjectShortName">PCEG_RESET</obj_property> @@ -235,6 +176,7 @@ <wvobject type="group" fp_name="group149"> <obj_property name="label">background sprite</obj_property> <obj_property name="DisplayName">label</obj_property> + <obj_property name="isExpanded"></obj_property> <wvobject type="logic" fp_name="/ppu_tb/uut/background_sprite/CLK"> <obj_property name="ElementShortName">CLK</obj_property> <obj_property name="ObjectShortName">CLK</obj_property> @@ -378,6 +320,7 @@ <wvobject type="group" fp_name="group142"> <obj_property name="label">display coordinates</obj_property> <obj_property name="DisplayName">label</obj_property> + <obj_property name="isExpanded"></obj_property> <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/T_POS_X"> <obj_property name="ElementShortName">T_POS_X[8:0]</obj_property> <obj_property name="ObjectShortName">T_POS_X[8:0]</obj_property> @@ -446,6 +389,7 @@ <wvobject type="group" fp_name="group115"> <obj_property name="label">pipeline stages</obj_property> <obj_property name="DisplayName">label</obj_property> + <obj_property name="isExpanded"></obj_property> <wvobject type="logic" fp_name="/ppu_tb/uut/pipeline_clock_edge_generator/CLK"> <obj_property name="ElementShortName">CLK</obj_property> <obj_property name="ObjectShortName">CLK</obj_property> @@ -466,13 +410,9 @@ <obj_property name="ElementShortName">SPRITE_FG_HIT</obj_property> <obj_property name="ObjectShortName">SPRITE_FG_HIT</obj_property> </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/pipeline_clock_edge_generator/DONE"> - <obj_property name="ElementShortName">DONE</obj_property> - <obj_property name="ObjectShortName">DONE</obj_property> - </wvobject> - <wvobject type="logic" fp_name="/ppu_tb/uut/pipeline_clock_edge_generator/READY"> - <obj_property name="ElementShortName">READY</obj_property> - <obj_property name="ObjectShortName">READY</obj_property> + <wvobject type="logic" fp_name="/ppu_tb/uut/pipeline_clock_edge_generator/DISPCTL_BWEN"> + <obj_property name="ElementShortName">DISPCTL_BWEN</obj_property> + <obj_property name="ObjectShortName">DISPCTL_BWEN</obj_property> </wvobject> <wvobject type="other" fp_name="/ppu_tb/uut/pipeline_clock_edge_generator/CLK_IDX_T"> <obj_property name="ElementShortName">CLK_IDX_T</obj_property> @@ -581,6 +521,7 @@ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/CIDX"> <obj_property name="ElementShortName">CIDX[5:0]</obj_property> <obj_property name="ObjectShortName">CIDX[5:0]</obj_property> + <obj_property name="isExpanded"></obj_property> </wvobject> <wvobject type="logic" fp_name="/ppu_tb/uut/\foreground_sprites(0)\/foreground_sprite/HIT"> <obj_property name="ElementShortName">HIT</obj_property> @@ -733,6 +674,7 @@ <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/CIDX"> <obj_property name="ElementShortName">CIDX[5:0]</obj_property> <obj_property name="ObjectShortName">CIDX[5:0]</obj_property> + <obj_property name="isExpanded"></obj_property> </wvobject> <wvobject type="array" fp_name="/ppu_tb/uut/\foreground_sprites(16)\/foreground_sprite/R_TMM_ADDR"> <obj_property name="ElementShortName">R_TMM_ADDR[15:0]</obj_property> @@ -864,4 +806,152 @@ <obj_property name="ObjectShortName">TMP_FG_EN[127:0]</obj_property> </wvobject> </wvobject> + <wvobject type="group" fp_name="group250"> + <obj_property name="label">dispctl</obj_property> + <obj_property name="DisplayName">label</obj_property> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/SYSCLK"> + <obj_property name="ElementShortName">SYSCLK</obj_property> + <obj_property name="ObjectShortName">SYSCLK</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/RESET"> + <obj_property name="ElementShortName">RESET</obj_property> + <obj_property name="ObjectShortName">RESET</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/X"> + <obj_property name="ElementShortName">X[8:0]</obj_property> + <obj_property name="ObjectShortName">X[8:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/Y"> + <obj_property name="ElementShortName">Y[7:0]</obj_property> + <obj_property name="ObjectShortName">Y[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/RI"> + <obj_property name="ElementShortName">RI[3:0]</obj_property> + <obj_property name="ObjectShortName">RI[3:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/GI"> + <obj_property name="ElementShortName">GI[3:0]</obj_property> + <obj_property name="ObjectShortName">GI[3:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/BI"> + <obj_property name="ElementShortName">BI[3:0]</obj_property> + <obj_property name="ObjectShortName">BI[3:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/BWEN"> + <obj_property name="ElementShortName">BWEN</obj_property> + <obj_property name="ObjectShortName">BWEN</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/RO"> + <obj_property name="ElementShortName">RO[3:0]</obj_property> + <obj_property name="ObjectShortName">RO[3:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/GO"> + <obj_property name="ElementShortName">GO[3:0]</obj_property> + <obj_property name="ObjectShortName">GO[3:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/BO"> + <obj_property name="ElementShortName">BO[3:0]</obj_property> + <obj_property name="ObjectShortName">BO[3:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/NVSYNC"> + <obj_property name="ElementShortName">NVSYNC</obj_property> + <obj_property name="ObjectShortName">NVSYNC</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/NHSYNC"> + <obj_property name="ElementShortName">NHSYNC</obj_property> + <obj_property name="ObjectShortName">NHSYNC</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/THBLANK"> + <obj_property name="ElementShortName">THBLANK</obj_property> + <obj_property name="ObjectShortName">THBLANK</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/TVBLANK"> + <obj_property name="ElementShortName">TVBLANK</obj_property> + <obj_property name="ObjectShortName">TVBLANK</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/ACTIVE"> + <obj_property name="ElementShortName">ACTIVE</obj_property> + <obj_property name="ObjectShortName">ACTIVE</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/NPIXCLK"> + <obj_property name="ElementShortName">NPIXCLK</obj_property> + <obj_property name="ObjectShortName">NPIXCLK</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/TPIXCLK"> + <obj_property name="ElementShortName">TPIXCLK</obj_property> + <obj_property name="ObjectShortName">TPIXCLK</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/NHCOUNT"> + <obj_property name="ElementShortName">NHCOUNT[18:0]</obj_property> + <obj_property name="ObjectShortName">NHCOUNT[18:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/NVCOUNT"> + <obj_property name="ElementShortName">NVCOUNT[18:0]</obj_property> + <obj_property name="ObjectShortName">NVCOUNT[18:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/ADDR_I"> + <obj_property name="ElementShortName">ADDR_I[9:0]</obj_property> + <obj_property name="ObjectShortName">ADDR_I[9:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/ADDR_O"> + <obj_property name="ElementShortName">ADDR_O[9:0]</obj_property> + <obj_property name="ObjectShortName">ADDR_O[9:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/DATA_I"> + <obj_property name="ElementShortName">DATA_I[11:0]</obj_property> + <obj_property name="ObjectShortName">DATA_I[11:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/DATA_O"> + <obj_property name="ElementShortName">DATA_O[11:0]</obj_property> + <obj_property name="ObjectShortName">DATA_O[11:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/T_POS_X"> + <obj_property name="ElementShortName">T_POS_X[8:0]</obj_property> + <obj_property name="ObjectShortName">T_POS_X[8:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/T_POS_Y"> + <obj_property name="ElementShortName">T_POS_Y[7:0]</obj_property> + <obj_property name="ObjectShortName">T_POS_Y[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/U_POS_X"> + <obj_property name="ElementShortName">U_POS_X[8:0]</obj_property> + <obj_property name="ObjectShortName">U_POS_X[8:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/U_POS_Y"> + <obj_property name="ElementShortName">U_POS_Y[7:0]</obj_property> + <obj_property name="ObjectShortName">U_POS_Y[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/N_POS_X"> + <obj_property name="ElementShortName">N_POS_X[9:0]</obj_property> + <obj_property name="ObjectShortName">N_POS_X[9:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/ppu_tb/uut/display_controller/N_POS_Y"> + <obj_property name="ElementShortName">N_POS_Y[8:0]</obj_property> + <obj_property name="ObjectShortName">N_POS_Y[8:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/NACTIVE"> + <obj_property name="ElementShortName">NACTIVE</obj_property> + <obj_property name="ObjectShortName">NACTIVE</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/NHACTIVE"> + <obj_property name="ElementShortName">NHACTIVE</obj_property> + <obj_property name="ObjectShortName">NHACTIVE</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/NVACTIVE"> + <obj_property name="ElementShortName">NVACTIVE</obj_property> + <obj_property name="ObjectShortName">NVACTIVE</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/TACTIVE"> + <obj_property name="ElementShortName">TACTIVE</obj_property> + <obj_property name="ObjectShortName">TACTIVE</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/THACTIVE"> + <obj_property name="ElementShortName">THACTIVE</obj_property> + <obj_property name="ObjectShortName">THACTIVE</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/ppu_tb/uut/display_controller/TVACTIVE"> + <obj_property name="ElementShortName">TVACTIVE</obj_property> + <obj_property name="ObjectShortName">TVACTIVE</obj_property> + </wvobject> + </wvobject> </wave_config> diff --git a/docs/ppu.drawio b/docs/ppu.drawio index 9cef8a7..d2ffad0 100644 --- a/docs/ppu.drawio +++ b/docs/ppu.drawio @@ -1 +1 @@ -<mxfile host="Electron" modified="2023-04-07T12:17:33.499Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="PGJiEEFnzE3vIp279dd3" version="20.8.16" type="device" pages="5"><diagram name="level-1" id="DBE48RpXtx8JnoEt3ekA">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</diagram><diagram id="MdQQJuunD4ehtDpxKxax" name="level-2">7Vxbe6JIEP01eXQ+7uqjcXPZL8kkM0km+9pCi0wamm0aL/Prt5FGLk0QjChunJdIUdhQdapOdVHOhTp2lzcE+LMHbEF0oUjW8kL960JRZLk/YH8iySqW9BU1FtjEsbhSKnh2/kAulLg0dCwY5BQpxog6fl5oYs+DJs3JACF4kVebYpRf1Qc2FATPJkCi9M2x6CyWDnQpld9Cx54lK8sSP+OCRJkLghmw8CIjUq8u1DHBmMaf3OUYosh4iV3i664/OLu5MQI9WucCfTwdzm+1+Z/Hu/lKDxG5/X3fM/rx18wBCvkTBz5xKIwu9KaY3zpdJfaAFjMPP8SEzrCNPYCuUuklwaFnwWhRiR0F75CaM36QXnCPsc+EMhP+hpSuuONBSDETzaiL+NmN1dZfRgGho8irTOBhDyayawchrjOHhDrMfyPk2B6TuY5lre8r8IHpePYlphS77MSAyUQbcrMGOCQmrDCcloAREBvSCkWd4z0yXGYJ7qMbiF1IyYopEIgAdeZ53AEOX3ujt7n0CTvsplMVPJ0G7E4yEGAfMiukojUwGoCkrwsgeXl42AEazJl+dHaK4JK78WBwmSBsvpfgBXpWAVFMkjm/O0QSz2+FiCa1AhH2WGCVUfAjwAQlCOLJWk2SGk/V8qCQUJrpsw/xHRwcr0lsZvB6Ccx3ew21yHOVGS4PyMWMqT6z1BGdXTCOy+PtQ3REaQguK73Jzypa3ozJ4SJDN1w0yzBNIitzf86gTa1niNF+poRalFA33vV+zXjnCJG+cZd0mCLUPVHEkaFSxlAWCGbrO6oM+Cw8vpPV34rnuX0zZJBb6iG8s3p7R0e7bCDLzdhgi/5HbJBwST9/dU8ppLfYvPyqFihDxO81JrCjlCHrO1GG1hZlJM7LWM9GeALQ+kERC9HYdBZ7vJNLCZ8gBK1uAThoJeQPWnNpAgTG2PVx4FBMjh4wxRrrkBFD/u3rVjAEsvWo/lg++tri7r4nCyb5P8eBXjcO2tkrN6U+xSik1y3Up3xKvdi2KfLqsEo9T6s7BHMpOpUzOiu2lWd0ZrQHh0enuD/9dTOKPM12d1HJ8bWhO7z7cRO+fn8bTaX7y1er9/rLe+u1g1yxipfyaNClAn/GNypU8Y07VR+s82Gnqlr/iJ0qEcvU8SJT5CEt2dCDBHSxlNKkeqWU0drm42vVUoO6bKXvO+Y/5yVFQDqxJxvB2YOH8ODB89tA7MQ/je538HYX3xwdAgIdeTNUKDlVbQvfVut/uiysNGoWa5veE8L4PfQ7R56qUo88W+vcGcOvlHrrv5HVukWeQwHal6NTewG/fyKV6nqzGxt3tRD8xpYkWqneTg5Nck8GaKPXf04MaC3wdd1hn47ytbxtf1yt3w7WdPGV23Pylo25yILd2+vKxrHpWqxxfGcZj1wCCr4Ul/ePxuW7tW2LjdWmndWq1upBRz3EN33XJ1eMtMARJbVl1RzIkeE4bFSLVGo3He2Qa3aF90Y04oxz14imONBxdKLpG4LNziO/25OAcWKFolYI7G1DXlv02ykUDbGJ+OIg6LI4VCQXupjj/ZgBrBen30oCWFYOGsFiqXjuGdTvGRjdoGnNaMTT1eothae4j8tN2wNKiTMJ13Tb0WgtmQZrLVhLRxpEEwYmgdCLHjQaoXOwJxiNPSstxBEl+B2OMcIkjZ0pC5uCCPA5eJNZkBU/FQPyZa7IOwuBCUSpv5OVLDgFIaJ7qo6KEy/9En9JJf4qDhHvLbkmQMi+a3h6ZYKfUYqVJmHwOYwXHULxWgET5w/2KEjyoOUQaK7Bwb4EBjTjWxJbIfmJw8s6FUup4Ce3UuVPHuq7SJO2RpRa4iB1Hx6q2mWdHbTMO6SZf+R9TG1UTSRl/OPFNHpCoy8bGtmyS9PbMqIiGPELTMIdc8Ct2JQzWhpwK66jD5s1Cwv6zZuFJSN0w2/D7L/8esU8sfPPddhh+pP4WD39jwXUq/8A</diagram><diagram id="lj51MlK96fuJFRP7cw84" name="level-3">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</diagram><diagram id="1ySgP4OewCsUoPnmkRD4" name="display">7VhNc5swEP01nkkP6YDxV4/BdpNDPeOMk9Q5yiCDasEyQjbQX98ViGAMdpzJR5uZXjLSk1arfW93UdyxxkF6LUjkz8ClvNM13LRjTTrdbn/Yw78KyApgOOwWgCeYW0BmBSzYb6pBQ6Nb5tK4tlECcMmiOuhAGFJH1jAiBCT1bWvgda8R8WgDWDiEN9GfzJV+gY76RoXfUOb5pWfT0CsBKTdrIPaJC8keZE071lgAyGIUpGPKFXclL4Xd9yOrTxcTNJTnGGTk5vF+Nlkk6fVc3s9k8HBNLrUYO8K3OmB9WZmVDHgCtlHTmfa/o0LStE0KsipPqKLFLKEQUCky3JdUfFqWJsnf47Jbkky0ht6TbRUmDnSk7VFPe5u1se07sPy26MWjm9u7wW1L1DZxNirQ0FUBkHCHPrsDjjexVwJHnhpdDHpG2hsZXxoc5ZZUuTRwX+IzSRcRcdRqgmWBmC8DvOLExKGijGGGXXHmhYitQEoIcCFGExZ6aps6psn5SQkPhWgSXq5qWrP6dF+ObpscvfeSw2zR42qGwAV6HLfQjaUU5dySLAKm2LHjDZWOrwVYM84XensMXDm346K1DHCY21Ax3SGxsRYlx/LA+nanP9GHjIGDQDCEEI1tQfEUndfKjwBJ5N48ooIhJVSZOFT5mFeIHYckuoN5ceHcqUtiP8+ak2lBNMDpWkXKyYryOcRMMlCwKCR6sv9xsB4w11U33Euvy+F7pNdeArXmzxukT+sNzUb2nNvDXhTw+Y2ttDootEGz0MxhC1Gm9W6F1mBqPr9H4IHRJAIhW1oetoIUK/+VLa+llmq5f6Y0x745r2h15qBNgbfI1XYFrIYEsSMoDf93u3+i252fYR/Q7VozqJlAV/dLBB4beUNdfMnqKeUrSKYVYNfLF2vfBw9C5BMg0hL9olJm+kVOthLqJY08imyp7L/2y+mjPi6fTNLaLNOzoy/JGLbCoadqR1MqifCofL7NqfhPSigoJ5Lt6i/9ty/5ZtctFFv+NcVqelXyHVEsvwmOy5J7lYijT6nh6Pknxou+h7VW2NJ6YylgQw/Ao6Sf0a1OfAA/9qlvfHYm06NMtv7XZL6cSZxWvwrka3s/rVjTPw==</diagram><diagram id="xwm_nTvbWLU7bshfNvv3" name="pipeline">7Vxbc5s4GP01ntl98Ax37MfYSZN2m21m3U6bp4wMMqjBiBFybefXr2TANkghqcMlxTwFf5YQnPPdpXigT5ebawIi/xa7MBhoirsZ6JcDTVMVzWJ/uGSbSGxbSwQeQW466CCYoSeYzUylK+TCODeQYhxQFOWFDg5D6NCcDBCC1/lhCxzkV42ABwXBzAGBKP2OXOon0pGpHOQ3EHl+trKqpN8sQTY4FcQ+cPH6SKRfDfQpwZgmV8vNFAYcvAyXZN6HZ77dPxiBIX3NBPfzB99D1vzT0+On4efx+uf1ejLUk7v8AsEqfeH0Yek2Q8AjeBWlwyChcCPDHcyz4Yr4XOr+bZmaQLyElGzZkL2OpFPWR/hmMv8IWy0TgpRTb3+vw2uzi/TN5SiE36cPHtHxLN5Ob0bjmyffuR9mD10GAwzdC65P7FOIQyac+HTJVrlU2SWDKHQhX0Jhn0QEyrCHbk4DRZyOcDElsGQyAgNA0a+83sqgSle4w4g9nqZsn0E3xiviwHTUsV5lE7OBFBAPUmHgjon9a7yBnFO4cUHs7/hQy4jCEXAQ5QCYfx5vm8xUkhkn01i4T0OsvsLxnDOrqlURrfsbNcSr0fNaxqtmVMTr/kYN8Wr2vJbxqmsV8bq/UUO8Wj2vZbwaSkW8GsWJNfNq97yW8lpV2mQ0nDeNel7LeDWrypvMhvOmcc9rGa9WVXmTVV/epKg/4tX95ccf4SZkhE7/Gc3mQ7XntYxXu6q8ya4vb5Ly2nclXuhKVNaWqI1XKYxZ3/mIWJ/3jIvkxj6I+KUPN8DDIeMpggSx1SE5SO8yEYNpsvYRhTPGLZ+2JiDK68ACbWDW/+af4/QyrxG2UlQjCjf0S/779A3EZu3rlOjZTm0hZ1IzrI5Ual++HOuUXlvf9iTv+ht9W/VdGdVYUQtGdZpNqYJx1mVictbEmjOKVg9xRJiBPMw9gUKu4nneYkrwI5ziAJMDrwsUBAURCJDHbPOSJFxMuE0gBwQXqXyJXJevIjXOvHLE3MZC77+UVa1MXwTTEzVmmzeNIwVSZXsftZmQxN8pNRDgMIi4Z3wLA2+Bu3SvSYS7aBHVwS3mDWqH4R61Dbe4zSBGiM7ArVltwy12//Xuwq0bbcMtNuWN7sJtaG3DLeYtZnfhNlsPlWIL2+ow3K2HSrGzbHcXbqvtUKmJcE8ubvlKrktgHAvQN9pw4ATO0rXBimKxGsoOs+1G45Bmo40q08aSIslqskjSxSLpqGJdnFXFarddsepiCfX1trccqeXIyGrWcsSKwAkez8JeXjKQ2kKLLoYW7q0iB56Vo1LN1j2VuKkbMdexOyDPQWzXUVXseuzCDq36ygyrCvS3c/tf+/o+mt6vvzwunLW1+PlNsvOahAkXUNAu9DWgLUmRGgX7fcfkilXdVNrLT6Xoi13OzM8QCNxtt9Afae05GulRABH9UQ1x9p0UznaDTU8p2mJCOe4u2qO2e56amMIkbYpORFFDay2KyhNG0ZV0KGcpoi0pThv122I7H3HTbhXmk076VLMl3rwNyA9MiptaKIxWdKBZAXfqc8KuPLrz6WCOAo7GmVMmq3Tr4swfhzC4vPLmJLqLncVmO/t2Jcn+z9GS9PZqMikrYjDpWWk06khZEfPXc2TFst6XrUiCzhmyUmxstG0rfYYma3g0aCvyI/ICKzcfvzLBXygcAsdZEUDh3+2S9OZduBcOz/9mfiY5KN8oY53xbpXS0qB3k7JSegz+jztUcBo1JRZS216dlAxxzzR1agSC4Ky9WTEpqNGbsY+H38NK/t3k8Kti+tX/</diagram></mxfile>
\ No newline at end of file +<mxfile host="Electron" modified="2023-04-07T21:01:09.977Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="Wzm5BC_9a6XfbXU-20rC" version="20.8.16" type="device" pages="5"><diagram name="level-1" id="DBE48RpXtx8JnoEt3ekA">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</diagram><diagram id="MdQQJuunD4ehtDpxKxax" name="level-2">7Vxbe6JIEP01eXQ+7uqjcXPZL8kkM0km+9pCi0wamm0aL/Prt5FGLk0QjChunJdIUdhQdapOdVHOhTp2lzcE+LMHbEF0oUjW8kL960JRZLk/YH8iySqW9BU1FtjEsbhSKnh2/kAulLg0dCwY5BQpxog6fl5oYs+DJs3JACF4kVebYpRf1Qc2FATPJkCi9M2x6CyWDnQpld9Cx54lK8sSP+OCRJkLghmw8CIjUq8u1DHBmMaf3OUYosh4iV3i664/OLu5MQI9WucCfTwdzm+1+Z/Hu/lKDxG5/X3fM/rx18wBCvkTBz5xKIwu9KaY3zpdJfaAFjMPP8SEzrCNPYCuUuklwaFnwWhRiR0F75CaM36QXnCPsc+EMhP+hpSuuONBSDETzaiL+NmN1dZfRgGho8irTOBhDyayawchrjOHhDrMfyPk2B6TuY5lre8r8IHpePYlphS77MSAyUQbcrMGOCQmrDCcloAREBvSCkWd4z0yXGYJ7qMbiF1IyYopEIgAdeZ53AEOX3ujt7n0CTvsplMVPJ0G7E4yEGAfMiukojUwGoCkrwsgeXl42AEazJl+dHaK4JK78WBwmSBsvpfgBXpWAVFMkjm/O0QSz2+FiCa1AhH2WGCVUfAjwAQlCOLJWk2SGk/V8qCQUJrpsw/xHRwcr0lsZvB6Ccx3ew21yHOVGS4PyMWMqT6z1BGdXTCOy+PtQ3REaQguK73Jzypa3ozJ4SJDN1w0yzBNIitzf86gTa1niNF+poRalFA33vV+zXjnCJG+cZd0mCLUPVHEkaFSxlAWCGbrO6oM+Cw8vpPV34rnuX0zZJBb6iG8s3p7R0e7bCDLzdhgi/5HbJBwST9/dU8ppLfYvPyqFihDxO81JrCjlCHrO1GG1hZlJM7LWM9GeALQ+kERC9HYdBZ7vJNLCZ8gBK1uAThoJeQPWnNpAgTG2PVx4FBMjh4wxRrrkBFD/u3rVjAEsvWo/lg++tri7r4nCyb5P8eBXjcO2tkrN6U+xSik1y3Up3xKvdi2KfLqsEo9T6s7BHMpOpUzOiu2lWd0ZrQHh0enuD/9dTOKPM12d1HJ8bWhO7z7cRO+fn8bTaX7y1er9/rLe+u1g1yxipfyaNClAn/GNypU8Y07VR+s82Gnqlr/iJ0qEcvU8SJT5CEt2dCDBHSxlNKkeqWU0drm42vVUoO6bKXvO+Y/5yVFQDqxJxvB2YOH8ODB89tA7MQ/je538HYX3xwdAgIdeTNUKDlVbQvfVut/uiysNGoWa5veE8L4PfQ7R56qUo88W+vcGcOvlHrrv5HVukWeQwHal6NTewG/fyKV6nqzGxt3tRD8xpYkWqneTg5Nck8GaKPXf04MaC3wdd1hn47ytbxtf1yt3w7WdPGV23Pylo25yILd2+vKxrHpWqxxfGcZj1wCCr4Ul/ePxuW7tW2LjdWmndWq1upBRz3EN33XJ1eMtMARJbVl1RzIkeE4bFSLVGo3He2Qa3aF90Y04oxz14imONBxdKLpG4LNziO/25OAcWKFolYI7G1DXlv02ykUDbGJ+OIg6LI4VCQXupjj/ZgBrBen30oCWFYOGsFiqXjuGdTvGRjdoGnNaMTT1eothae4j8tN2wNKiTMJ13Tb0WgtmQZrLVhLRxpEEwYmgdCLHjQaoXOwJxiNPSstxBEl+B2OMcIkjZ0pC5uCCPA5eJNZkBU/FQPyZa7IOwuBCUSpv5OVLDgFIaJ7qo6KEy/9En9JJf4qDhHvLbkmQMi+a3h6ZYKfUYqVJmHwOYwXHULxWgET5w/2KEjyoOUQaK7Bwb4EBjTjWxJbIfmJw8s6FUup4Ce3UuVPHuq7SJO2RpRa4iB1Hx6q2mWdHbTMO6SZf+R9TG1UTSRl/OPFNHpCoy8bGtmyS9PbMqIiGPELTMIdc8Ct2JQzWhpwK66jD5s1Cwv6zZuFJSN0w2/D7L/8esU8sfPPddhh+pP4WD39jwXUq/8A</diagram><diagram id="lj51MlK96fuJFRP7cw84" name="level-3">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</diagram><diagram id="1ySgP4OewCsUoPnmkRD4" name="display">7VhNc5swEP01nkkP6YDxV4/BdpNDPeOMk9Q5yiCDasEyQjbQX98ViGAMdpzJR5uZXjLSk1arfW93UdyxxkF6LUjkz8ClvNM13LRjTTrdbn/Yw78KyApgOOwWgCeYW0BmBSzYb6pBQ6Nb5tK4tlECcMmiOuhAGFJH1jAiBCT1bWvgda8R8WgDWDiEN9GfzJV+gY76RoXfUOb5pWfT0CsBKTdrIPaJC8keZE071lgAyGIUpGPKFXclL4Xd9yOrTxcTNJTnGGTk5vF+Nlkk6fVc3s9k8HBNLrUYO8K3OmB9WZmVDHgCtlHTmfa/o0LStE0KsipPqKLFLKEQUCky3JdUfFqWJsnf47Jbkky0ht6TbRUmDnSk7VFPe5u1se07sPy26MWjm9u7wW1L1DZxNirQ0FUBkHCHPrsDjjexVwJHnhpdDHpG2hsZXxoc5ZZUuTRwX+IzSRcRcdRqgmWBmC8DvOLExKGijGGGXXHmhYitQEoIcCFGExZ6aps6psn5SQkPhWgSXq5qWrP6dF+ObpscvfeSw2zR42qGwAV6HLfQjaUU5dySLAKm2LHjDZWOrwVYM84XensMXDm346K1DHCY21Ax3SGxsRYlx/LA+nanP9GHjIGDQDCEEI1tQfEUndfKjwBJ5N48ooIhJVSZOFT5mFeIHYckuoN5ceHcqUtiP8+ak2lBNMDpWkXKyYryOcRMMlCwKCR6sv9xsB4w11U33Euvy+F7pNdeArXmzxukT+sNzUb2nNvDXhTw+Y2ttDootEGz0MxhC1Gm9W6F1mBqPr9H4IHRJAIhW1oetoIUK/+VLa+llmq5f6Y0x745r2h15qBNgbfI1XYFrIYEsSMoDf93u3+i252fYR/Q7VozqJlAV/dLBB4beUNdfMnqKeUrSKYVYNfLF2vfBw9C5BMg0hL9olJm+kVOthLqJY08imyp7L/2y+mjPi6fTNLaLNOzoy/JGLbCoadqR1MqifCofL7NqfhPSigoJ5Lt6i/9ty/5ZtctFFv+NcVqelXyHVEsvwmOy5J7lYijT6nh6Pknxou+h7VW2NJ6YylgQw/Ao6Sf0a1OfAA/9qlvfHYm06NMtv7XZL6cSZxWvwrka3s/rVjTPw==</diagram><diagram id="xwm_nTvbWLU7bshfNvv3" name="pipeline">7Vxbe6I4GP41Ps/uRffhoIKXVTvt9LBzsDPT7k2fCAEyRWBDrNhfv0EDAonOTsuhBeeiAx+QxPf9zkR76mQRnWMQODe+Cd2eIplRT532FEWX+/RvLFhvBZqmbAU2RuZWJO8EM/QMmVBi0iUyYZi7kfi+S1CQFxq+50GD5GQAY3+Vv83y3fysAbAhJ5gZwOWlP5BJHPaxBtJOfgGR7SQzyxK7sgDJzUwQOsD0VxmRetZTJ9j3yfZoEU2gG2OX4LJ97sOeq+nCMPTI/3nA+zF5sLHqz8L15EIfXTw7xv1Jsrgn4C7ZJ2arJesEAuiZpzGS9MzzPSocO2Th0jOZHmJ/6ZkwnkKiZ/ya2DKhmYOZrfAc+gtI8JresNqBm2DrZHBNZBi6gKCnPDmAcWynw6UzfPYRXYkiRYlWsXGYNiqqlB8i9JfYgOypLJj7BkoeJADbkHAP0oPMx9yJNtz8Dk8vockEobOhRj7EmR8AA5EYkMG7oFAvi0K9XgrVI4UMeWVYEoXpQDVR2D9SyJBX+yVRmA5UE4WDI4UM+b5SEoXpQDVRODxSGCXDlEThoOZ0RnsHFCYVTMFM5BE7r4nistKdQc3pjv4OKK6HwmFZ6c6w5nRndKSQIa+Vle5o1aU7knwXLu+nH++8yKPcTa702fxEPlK4x4+/mEK9unRHSOGx9E+QH5WV7oyqS3euwAz2b2/uPMm0vvzrPF1+vbZO5GPtn0Kvjf6SNSn9J5fEqHjYurpzL3KzeymFESJ37Ep8fJ85nkaZm6br3i/6rlv8Dqjm4E1ph0w5zCvEa/uze8apWiH4GjUIlg9hgBGBD3Ob0w4CI5JXiZBg/xFOfNfHO5WxkOsWRMBFtkdP8ZaM8RPEBBnAPWXyBTLNeJbxyqFzz6i3iKdcYRBwehfGrsSzvzJalUOKFU8Do4Mqw6BPTDqjQSk7WRUqmn5WW3L8/C4ZyaukDBlSBQQYFCKIX8fAa+Auan4Gb10Ad9EiyoObT1jkFsOtNw03n1vwwac1cKcd/8bg5t8BqO2FO+3ONwY336/vtxfutJPeGNx83jJoL9yDxkMl3wcfthjuxkMl35PW2gv3sOlQqfBwj09v4plME8Mw5KAPHRDEhw6MgO1TxMYBxIguJkYzkX5ORMoeIDPMWSiCyZ6yDZPsUGIEztjcYEl8vhpK9mtt7vY9ktzdLzNt3F8kibiqrEZS+RopU7BanSpYNZ6LegtWla+gbm+OhiM0HAFZ9RoOXw8Y7mMnzOVX9lFZYFH5wBI7q8CAnfJT8qBGR7Wea39r5/fB5H716dEyVkPr5zfB28WtnzIBAc06qRI8TXF/VI0hWgj22w4KJbv54v7CGsEXvoTlm2x6Ba7mjVQOWo1dHyHafEwdtRdtvemmTwIuV6e1wo0XN5s3XmnxrqRFQbOIdo3pudCT8P1MFJt2ozDvdmxo8Wlum0fs1T7lr5fASvFteNPRVNDVR16wJD1l6MZOfY7pkU02Ph3MkRuj0XHKRMl+VZw5Iw+60zN7joPPoWFF69m3s6Mlba4Wd9zXaEnm9QfHRsP55fPj5cn1aPXzfDUWVGAXH2+p4A/kAcNYYkDgn81y1HC7qGhGMk+Y0q+TMYHr66AdFXmpMU8QsnJwv1a32t8iE6msrSQkg2/vMaeGIXA77c6KbRERV1XZzaHto9m9Xi3eWzeqccOAeCM5j3dAlXXzixsxYh2LIsUWbZ1JspgfQRxh/FDfZXauiimmy80TJH51ZKIwMIjbqTAv+B5rZWFezAXfdwwN4LkodmTSfGlZ1Ajo+uIcjP4PPTBvOlFuNvoXvwsspHBYEYX/wIfw0l3Y4d33L6Pv07H9cHslKD+7WMwUs7Lqihl6uvvBqO2XVXa/uqWe/Qc=</diagram></mxfile>
\ No newline at end of file @@ -39,11 +39,14 @@ void hh_demo_setup() { g_hh_demo_balls[i].palette_index = i+1; g_hh_demo_balls[i].tilemap_index = 1; } - hh_ppu_flush(); + // hh_ppu_flush(); } void hh_demo_loop(unsigned long frame) { // if (frame % 300 == 0) hh_demo_setup(); + // + // if (frame > 1) return; + // frame = 40; // set background pattern position hh_ppu_update_background_pos((frame / 5) % HH_PPU_SPRITE_WIDTH, (frame / 20) % HH_PPU_SPRITE_HEIGHT); diff --git a/src/ppu/internals.c b/src/ppu/internals.c index 7fd2eb9..5badfc9 100644 --- a/src/ppu/internals.c +++ b/src/ppu/internals.c @@ -105,6 +105,7 @@ void hh_ppu_vram_buffer(uint8_t data[4]) { } void hh_ppu_vram_flush() { + if (g_hh_ppu_vram_buffer_size == 0) return; hh_ppu_vram_buffer((uint8_t[4]){ 0xff, 0xff, 0xff, 0xff }); hh_ppu_vram_dwrite(g_hh_ppu_vram_buffer_ptr, g_hh_ppu_vram_buffer_size); g_hh_ppu_vram_buffer_size = 0; diff --git a/src/ppu/stm.c b/src/ppu/stm.c index ccf3566..7f60aed 100644 --- a/src/ppu/stm.c +++ b/src/ppu/stm.c @@ -8,6 +8,7 @@ void hh_ppu_init() { hh_ppu_update_aux((hh_s_ppu_loc_aux) { .sysreset = 1 }); hh_ppu_vram_buffer((uint8_t[4]) { 0xff, 0xff, 0xff, 0xff }); hh_ppu_flush(); + HAL_Delay(10); } void hh_ppu_deinit() {} |