From 070e154df8f34843d13c10a39c5d18b78c24da29 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Tue, 21 Feb 2023 13:57:27 +0100 Subject: fix sprite flip axes swapped --- basys3/basys3.srcs/ppu_sprite_transform.vhd | 4 +- basys3/basys3.srcs/ppu_sprite_transform_tb.vhd | 66 ++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 basys3/basys3.srcs/ppu_sprite_transform_tb.vhd diff --git a/basys3/basys3.srcs/ppu_sprite_transform.vhd b/basys3/basys3.srcs/ppu_sprite_transform.vhd index d1b1a23..fa10b9b 100644 --- a/basys3/basys3.srcs/ppu_sprite_transform.vhd +++ b/basys3/basys3.srcs/ppu_sprite_transform.vhd @@ -19,6 +19,6 @@ begin FLIPPED_X <= std_logic_vector(to_unsigned(PPU_SPRITE_WIDTH-1 - to_integer(unsigned(XI)), PPU_SPRITE_POS_H_WIDTH)); FLIPPED_Y <= std_logic_vector(to_unsigned(PPU_SPRITE_HEIGHT-1 - to_integer(unsigned(YI)), PPU_SPRITE_POS_V_WIDTH)); - XO <= FLIPPED_X when FLIP_H = '1' else XI; - YO <= FLIPPED_Y when FLIP_V = '1' else YI; + XO <= FLIPPED_X when FLIP_V = '1' else XI; + YO <= FLIPPED_Y when FLIP_H = '1' else YI; end Behavioral; diff --git a/basys3/basys3.srcs/ppu_sprite_transform_tb.vhd b/basys3/basys3.srcs/ppu_sprite_transform_tb.vhd new file mode 100644 index 0000000..cec8c20 --- /dev/null +++ b/basys3/basys3.srcs/ppu_sprite_transform_tb.vhd @@ -0,0 +1,66 @@ +library ieee; +library unisim; +library work; + +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use unisim.vcomponents.all; +use work.ppu_consts.all; + +entity ppu_sprite_transform_tb is +end ppu_sprite_transform_tb; + +architecture behavioral of ppu_sprite_transform_tb is + component ppu_sprite_transform port( -- flip sprites + XI : in std_logic_vector(PPU_SPRITE_POS_H_WIDTH-1 downto 0); -- pixel position relative to tile + YI : in std_logic_vector(PPU_SPRITE_POS_V_WIDTH-1 downto 0); -- pixel position relative to tile + FLIP_H, FLIP_V : in std_logic; -- flip sprite + XO : out std_logic_vector(PPU_SPRITE_POS_H_WIDTH-1 downto 0); -- new pixel position relative to tile + YO : out std_logic_vector(PPU_SPRITE_POS_V_WIDTH-1 downto 0)); -- new pixel position relative to tile + end component; + + signal XI : std_logic_vector(PPU_SPRITE_POS_H_WIDTH-1 downto 0); + signal YI : std_logic_vector(PPU_SPRITE_POS_V_WIDTH-1 downto 0); + signal FLIP_H, FLIP_V : std_logic := '0'; + signal XO : std_logic_vector(PPU_SPRITE_POS_H_WIDTH-1 downto 0); + signal YO : std_logic_vector(PPU_SPRITE_POS_V_WIDTH-1 downto 0); +begin + uut : component ppu_sprite_transform + port map( + XI => XI, + YI => YI, + FLIP_H => FLIP_H, + FLIP_V => FLIP_V, + XO => XO, + YO => YO); + + tb : process + begin + XI <= std_logic_vector(to_unsigned(4, PPU_SPRITE_POS_H_WIDTH)); + YI <= std_logic_vector(to_unsigned(6, PPU_SPRITE_POS_V_WIDTH)); + wait for 5 ns; + + XI <= std_logic_vector(to_unsigned(2, PPU_SPRITE_POS_H_WIDTH)); + YI <= std_logic_vector(to_unsigned(14, PPU_SPRITE_POS_V_WIDTH)); + wait for 5 ns; + + FLIP_H <= '1'; + wait for 5 ns; + + FLIP_V <= '1'; + wait for 5 ns; + + XI <= std_logic_vector(to_unsigned(6, PPU_SPRITE_POS_H_WIDTH)); + YI <= std_logic_vector(to_unsigned(8, PPU_SPRITE_POS_V_WIDTH)); + wait for 5 ns; + + FLIP_H <= '0'; + wait for 5 ns; + + XI <= std_logic_vector(to_unsigned(2, PPU_SPRITE_POS_H_WIDTH)); + YI <= std_logic_vector(to_unsigned(14, PPU_SPRITE_POS_V_WIDTH)); + wait for 5 ns; + + wait; -- stop for simulator + end process; +end; -- cgit v1.2.3