aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2023-04-07 23:14:46 +0200
committerlonkaars <loek@pipeframe.xyz>2023-04-07 23:14:46 +0200
commit0daeed25c65412400e7b0b12ee1dc371c4060920 (patch)
treebf37543034f4b37e61269fa370342cc8694e1e39
parentcc5fda1626ac77a74459bcfe3c422be3c2a5267b (diff)
last-ditch debugging efforts
-rw-r--r--assets/ppu-pipeline.svg2
-rw-r--r--basys3/basys3.srcs/ppu.vhd32
-rw-r--r--basys3/basys3.srcs/ppu_dispctl.vhd14
-rw-r--r--basys3/basys3.srcs/ppu_pceg.vhd29
-rw-r--r--basys3/basys3.srcs/ppu_sprite_bg.vhd2
-rw-r--r--basys3/basys3.srcs/ppu_sprite_fg.vhd23
-rw-r--r--basys3/basys3.srcs/sources_1/ip/ppu_bam/ppu_bam.xci36
-rw-r--r--basys3/basys3.srcs/sources_1/ip/ppu_dispctl_slbuf/ppu_dispctl_slbuf.xci32
-rw-r--r--basys3/basys3.srcs/sources_1/ip/ppu_tmm/ppu_tmm.xci32
-rw-r--r--basys3/basys3.srcs/top.vhd3
-rw-r--r--basys3/basys3.xpr22
-rw-r--r--basys3/ppu_tb_behav.wcfg234
-rw-r--r--docs/ppu.drawio2
-rw-r--r--src/demo.c5
-rw-r--r--src/ppu/internals.c1
-rw-r--r--src/ppu/stm.c1
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
diff --git a/src/demo.c b/src/demo.c
index a5a3a1e..27b8db2 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -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() {}