diff options
29 files changed, 2254 insertions, 826 deletions
diff --git a/.editorconfig b/.editorconfig index 1f4a360..fece754 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,10 +2,10 @@ root = true  [*]  indent_style = tab -indent_size = 3 +indent_size = 2  end_of_line = lf  insert_final_newline = true  [*.md]  indent_style = space -indent_size = 3 +indent_size = 2 diff --git a/basys3/basys3.srcs/ppu.vhd b/basys3/basys3.srcs/ppu.vhd index d6407df..0955506 100644 --- a/basys3/basys3.srcs/ppu.vhd +++ b/basys3/basys3.srcs/ppu.vhd @@ -2,19 +2,17 @@ library ieee;  library work;  use ieee.std_logic_1164.all; ---use ieee.numeric_std.all;  use work.ppu_consts.all;  entity ppu is port(  	CLK100 : in std_logic; -- system clock  	RESET : in std_logic; -- global (async) system reset -	EN : in std_logic; -- PPU VRAM enable (enable ADDR and DATA tri-state drivers)  	WEN : in std_logic; -- PPU VRAM write enable  	ADDR : in std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH-1 downto 0); -- PPU VRAM ADDR  	DATA : in std_logic_vector(PPU_RAM_BUS_DATA_WIDTH-1 downto 0);  	R,G,B : out std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -	NVSYNC, NHSYNC : out std_logic; -- native VGA out -	TVBLANK, THBLANK : out std_logic); -- tiny VGA out +	VSYNC, HSYNC : out std_logic; -- VGA sync out +	VBLANK : out std_logic); -- vblank for synchronization  end ppu;  architecture Behavioral of ppu is @@ -22,47 +20,48 @@ architecture Behavioral of ppu is  	component ppu_pceg port( -- pipeline clock edge generator  		CLK : in std_logic; -- system clock  		RESET : in std_logic; -- async reset -		SPRITE : out std_logic; -- sprite info fetch + sprite pixel fetch -		COMP_PAL : out std_logic; -- compositor + palette lookup -		DONE : out std_logic); -- last pipeline stage done +		SPRITE_BG : out std_logic; -- sprite info fetch + sprite pixel fetch +		SPRITE_FG : out std_logic; -- sprite pixel fetch +		DONE : out std_logic; -- last pipeline stage done +		READY : out std_logic); -- rgb buffer propagation ready  	end component; -	component ppu_addr_dec port( -- pipeline clock edge generator +	component ppu_addr_dec port( -- address decoder  		WEN : in std_logic; -- EXT write enable  		TMM_WEN,  		BAM_WEN,  		FAM_WEN,  		PAL_WEN,  		AUX_WEN : out std_logic; -- write enable MUX -		EN : in std_logic; -- EXT *ADDR enable (switch *AO to ADDR instead of *AI)  		ADDR : in std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH-1 downto 0); -- address in -		TMM_AI : in std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -		BAM_AI : in std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -		FAM_AI : in std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -		PAL_AI : in std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -		AUX_AI : in std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0); -		TMM_AO : out std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -		BAM_AO : out std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -		FAM_AO : out std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -		PAL_AO : out std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -		AUX_AO : out std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0)); +		TMM_ADDR : out std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); +		BAM_ADDR : out std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); +		FAM_ADDR : out std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); +		PAL_ADDR : out std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); +		AUX_ADDR : out std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0));  	end component;  	component ppu_bam port( -- BAM block memory  		clka : in std_logic; -		rsta : in std_logic; -		wea : in std_logic_vector(0 downto 0); +		wea : in std_logic_vector(0 to 0);  		addra : in std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0);  		dina : in std_logic_vector(PPU_BAM_DATA_WIDTH-1 downto 0); -		douta : out std_logic_vector(PPU_BAM_DATA_WIDTH-1 downto 0); -		rsta_busy : out std_logic); +		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);  	end component;  	component ppu_tmm port( -- TMM block memory  		clka : in std_logic; -		rsta : in std_logic; -		wea : in std_logic_vector(0 downto 0); +		wea : in std_logic_vector(0 to 0);  		addra : in std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0);  		dina : in std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0); -		douta : out std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0); -		rsta_busy : out std_logic); +		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);  	end component;  	component ppu_aux port(  		CLK : in std_logic; -- system clock @@ -82,6 +81,7 @@ architecture Behavioral of ppu is  		-- inputs  		CLK : in std_logic; -- pipeline clock  		RESET : in std_logic; -- reset clock counter +		PL_RESET : in std_logic; -- reset pipeline clock counters  		OE : in std_logic; -- output enable (of CIDX)  		X : in std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x  		Y : in std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y @@ -106,6 +106,8 @@ architecture Behavioral of ppu is  			-- inputs  			CLK : in std_logic; -- system clock  			RESET : in std_logic; -- reset internal memory and clock counters +			PL_CLK : in std_logic; -- pipeline clock +			PL_RESET : in std_logic; -- reset pipeline clock counters  			OE : in std_logic; -- output enable (of CIDX)  			X : in std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x  			Y : in std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y @@ -142,94 +144,68 @@ architecture Behavioral of ppu is  		R,G,B : out std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0)); -- VGA color out  	end component; -	component ppu_vga_tiny port( -- tiny vga signal generator -		CLK : in std_logic; -- system clock -		RESET : in std_logic; - -		X : out std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x -		Y : out std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y -		 -		VSYNC, VBLANK, -		HSYNC, HBLANK : out std_logic); -- VGA sync outputs -	end component; -	component ppu_vga_native port( -- native vga signal generator (upscaler) -		CLK : in std_logic; -- system clock +	component ppu_dispctl port( +		SYSCLK : in std_logic; -- system clock  		RESET : in std_logic; -		X : in std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x -		Y : in std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y +		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) -		RI,GI,BI : in std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- VGA color in -		 +  		RO,GO,BO : out std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- VGA color out -		VSYNC, HSYNC : out std_logic); -- VGA sync outputs +		NVSYNC, NHSYNC : out std_logic; -- VGA sync out +		THBLANK, TVBLANK : out std_logic); -- tiny sync signals  	end component;  	-- signals  	signal SYSCLK, SYSRST : std_logic; -- system clock and reset -	signal PL_SPRITE, PL_COMP_PAL, PL_DONE : std_logic; -- pipeline stages +	signal PL_SPRITE_FG, PL_SPRITE_BG, PL_DONE, PL_READY : std_logic; -- pipeline stages  	signal TMM_WEN, BAM_WEN, FAM_WEN, PAL_WEN, AUX_WEN : std_logic; -	signal TMM_AI, TMM_AO : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -	signal BAM_AI, BAM_AO : std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -	signal FAM_AI, FAM_AO : std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -	signal PAL_AI, PAL_AO : std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -	signal AUX_AI, AUX_AO : std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0); -	signal TMM_DO : std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0); -	signal BAM_DO : std_logic_vector(PPU_BAM_DATA_WIDTH-1 downto 0); -	signal FAM_DO : std_logic_vector(PPU_FAM_DATA_WIDTH-1 downto 0); -	signal PAL_DO : std_logic_vector(PPU_PAL_DATA_WIDTH-1 downto 0); -	signal AUX_DO : std_logic_vector(PPU_AUX_DATA_WIDTH-1 downto 0); +	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) +	signal TMM_R_DATA : std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0); -- internal read TMM data +	signal BAM_R_DATA : std_logic_vector(PPU_BAM_DATA_WIDTH-1 downto 0); -- internal read BAM data +	signal FAM_W_ADDR : std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -- write only FAM addr +	signal PAL_W_ADDR : std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -- write only PAL addr +	signal AUX_W_ADDR : std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0); -- write only AUX addr  	signal CIDX : std_logic_vector(PPU_PALETTE_CIDX_WIDTH-1 downto 0);  	signal BG_EN : std_logic;  	signal FG_EN, FG_HIT : std_logic_vector(PPU_FG_SPRITE_COUNT-1 downto 0);  	signal X : std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x  	signal Y : std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y -	signal UR,UG,UB : std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- unstable RGB (to be buffered) -	signal SR,SG,SB : std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- stable RGB (buffered until PL_COMP_PAL) +	signal UR,UG,UB : std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- palette lookup output RGB  	signal BG_SHIFT_X : std_logic_vector(PPU_POS_H_WIDTH-1 downto 0);  	signal BG_SHIFT_Y : std_logic_vector(PPU_POS_V_WIDTH-1 downto 0);  	signal FG_FETCH : std_logic; -	signal TINY_VBLANK, TINY_HBLANK, -	       NATIVE_VSYNC, NATIVE_HSYNC : std_logic; +	signal NVSYNC, NHSYNC, THBLANK, TVBLANK : std_logic; +	signal PCEG_RESET : std_logic;  begin  	SYSCLK <= CLK100;  	SYSRST <= RESET; -	-- internal unused lines -	-- -	-- these lines would be used if components use memory blocks as RAM blocks -	-- (like how TMM and BAM work), the registers of these memory regions are -	-- directly exposed internally, and are as such not used as RAM blocks -	AUX_AI <= (others => '0'); -	FAM_AI <= (others => '0'); -	PAL_AI <= (others => '0'); +	VSYNC <= NVSYNC; +	HSYNC <= NHSYNC; -	TVBLANK <= TINY_VBLANK; -	THBLANK <= TINY_HBLANK; -	NVSYNC <= NATIVE_VSYNC; -	NHSYNC <= NATIVE_HSYNC; +	PCEG_RESET <= SYSRST or THBLANK; +	VBLANK <= TVBLANK;  	pipeline_clock_edge_generator : component ppu_pceg port map(  		CLK => SYSCLK,  		RESET => SYSRST, -		SPRITE => PL_SPRITE, -		COMP_PAL => PL_COMP_PAL, -		DONE => PL_DONE); +		SPRITE_FG => PL_SPRITE_FG, +		SPRITE_BG => PL_SPRITE_BG, +		DONE => PL_DONE, +		READY => PL_READY);  	address_decoder : component ppu_addr_dec port map( -		EN => EN,  		WEN => WEN,  		ADDR => ADDR, -		TMM_AI => TMM_AI, -		BAM_AI => BAM_AI, -		FAM_AI => FAM_AI, -		PAL_AI => PAL_AI, -		AUX_AI => AUX_AI, -		TMM_AO => TMM_AO, -		BAM_AO => BAM_AO, -		FAM_AO => FAM_AO, -		PAL_AO => PAL_AO, -		AUX_AO => AUX_AO, +		TMM_ADDR => TMM_W_ADDR, +		BAM_ADDR => BAM_W_ADDR, +		FAM_ADDR => FAM_W_ADDR, +		PAL_ADDR => PAL_W_ADDR, +		AUX_ADDR => AUX_W_ADDR,  		TMM_WEN => TMM_WEN,  		BAM_WEN => BAM_WEN,  		FAM_WEN => FAM_WEN, @@ -238,43 +214,50 @@ begin  	background_attribute_memory : component ppu_bam port map(  		clka => SYSCLK, -		rsta => SYSRST,  		wea => (others => BAM_WEN), -		addra => BAM_AO, +		addra => BAM_W_ADDR,  		dina => DATA(PPU_BAM_DATA_WIDTH-1 downto 0), -		douta => BAM_DO, -		rsta_busy => open); +		clkb => SYSCLK, +		rstb => SYSRST, +		addrb => BAM_R_ADDR, +		doutb => BAM_R_DATA, +		rsta_busy => open, +		rstb_busy => open);  	tilemap_memory : component ppu_tmm port map(  		clka => SYSCLK, -		rsta => SYSRST,  		wea => (others => TMM_WEN), -		addra => TMM_AO, +		addra => TMM_W_ADDR,  		dina => DATA(PPU_TMM_DATA_WIDTH-1 downto 0), -		douta => TMM_DO, -		rsta_busy => open); +		clkb => SYSCLK, +		rstb => SYSRST, +		addrb => TMM_R_ADDR, +		doutb => TMM_R_DATA, +		rsta_busy => open, +		rstb_busy => open);  	aux : component ppu_aux port map(  		CLK => SYSCLK,  		RESET => SYSRST,  		AUX_WEN => AUX_WEN, -		AUX_ADDR => AUX_AO, +		AUX_ADDR => AUX_W_ADDR,  		AUX_DATA => DATA(PPU_AUX_DATA_WIDTH-1 downto 0),  		BG_SHIFT_X => BG_SHIFT_X,  		BG_SHIFT_Y => BG_SHIFT_Y,  		FG_FETCH => FG_FETCH);  	background_sprite : component ppu_sprite_bg port map( -		CLK => PL_SPRITE, +		CLK => PL_SPRITE_BG,  		RESET => SYSRST, +		PL_RESET => PL_READY,  		OE => BG_EN,  		X => X,  		Y => Y,  		BG_SHIFT_X => BG_SHIFT_X,  		BG_SHIFT_Y => BG_SHIFT_Y, -		BAM_ADDR => BAM_AI, -		BAM_DATA => BAM_DO, -		TMM_ADDR => TMM_AI, -		TMM_DATA => TMM_DO, +		BAM_ADDR => BAM_R_ADDR, +		BAM_DATA => BAM_R_DATA, +		TMM_ADDR => TMM_R_ADDR, +		TMM_DATA => TMM_R_DATA,  		CIDX => CIDX);  	foreground_sprites : for FG_IDX in 0 to PPU_FG_SPRITE_COUNT-1 generate @@ -283,16 +266,18 @@ begin  			port map(  				CLK => SYSCLK,  				RESET => SYSRST, +				PL_CLK => PL_SPRITE_FG, +				PL_RESET => PL_READY,  				OE => FG_EN(FG_IDX),  				X => X,  				Y => Y,  				FETCH => FG_FETCH, -				VBLANK => TINY_VBLANK, +				VBLANK => TVBLANK,  				FAM_WEN => FAM_WEN, -				FAM_ADDR => FAM_AO, +				FAM_ADDR => FAM_W_ADDR,  				FAM_DATA => DATA(PPU_FAM_DATA_WIDTH-1 downto 0), -				TMM_ADDR => TMM_AI, -				TMM_DATA => TMM_DO, +				TMM_ADDR => TMM_R_ADDR, +				TMM_DATA => TMM_R_DATA,  				CIDX => CIDX,  				HIT => FG_HIT(FG_IDX));  	end generate; @@ -307,48 +292,26 @@ begin  		CIDX => CIDX,  		RESET => SYSRST,  		PAL_WEN => PAL_WEN, -		PAL_ADDR => PAL_AO, +		PAL_ADDR => PAL_W_ADDR,  		PAL_DATA => DATA(PPU_PAL_DATA_WIDTH-1 downto 0),  		R => UR,  		G => UG,  		B => UB); -	-- palette lookup output buffer (pipeline stage 5) -	process(PL_COMP_PAL, SYSRST) -	begin -		if SYSRST = '1' then -			SR <= x"0"; -			SG <= x"0"; -			SB <= x"0"; -		elsif rising_edge(PL_COMP_PAL) then -			SR <= UR; -			SG <= UG; -			SB <= UB; -		end if; -	end process; - -	tiny_vga_signal_generator : component ppu_vga_tiny port map( -- tiny vga signal generator -		CLK => SYSCLK, -		RESET => SYSRST, -		X => X, -		Y => Y, -		VSYNC => open, -		VBLANK => TINY_VBLANK, -		HSYNC => open, -		HBLANK => TINY_HBLANK); - -	native_vga_signal_generator : component ppu_vga_native port map( -- native vga signal generator (upscaler) -		CLK => SYSCLK, +	display_controller : component ppu_dispctl port map( +		SYSCLK => SYSCLK,  		RESET => SYSRST, +		PREADY => PL_READY,  		X => X,  		Y => Y, -		PREADY => PL_DONE, -		RI => SR, -		GI => SG, -		BI => SB, +		RI => UR, +		GI => UG, +		BI => UB,  		RO => R,  		GO => G,  		BO => B, -		VSYNC => NATIVE_VSYNC, -		HSYNC => NATIVE_HSYNC); +		NVSYNC => NVSYNC, +		NHSYNC => NHSYNC, +		TVBLANK => TVBLANK, +		THBLANK => THBLANK);  end Behavioral; diff --git a/basys3/basys3.srcs/ppu_addr_dec.vhd b/basys3/basys3.srcs/ppu_addr_dec.vhd index e0c374f..33f247c 100644 --- a/basys3/basys3.srcs/ppu_addr_dec.vhd +++ b/basys3/basys3.srcs/ppu_addr_dec.vhd @@ -4,8 +4,7 @@ use ieee.std_logic_1164.all;  --use ieee.numeric_std.all;  use work.ppu_consts.all; -entity ppu_addr_dec is port( -	EN : in std_logic; -- EXT *ADDR enable (switch *AO to ADDR instead of *AI) +entity ppu_addr_dec is port( -- address decoder  	WEN : in std_logic; -- EXT write enable  	TMM_WEN,  	BAM_WEN, @@ -13,27 +12,22 @@ entity ppu_addr_dec is port(  	PAL_WEN,  	AUX_WEN : out std_logic; -- write enable MUX  	ADDR : in std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH-1 downto 0); -- address in -	TMM_AI : in std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -	BAM_AI : in std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -	FAM_AI : in std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -	PAL_AI : in std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -	AUX_AI : in std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0); -	TMM_AO : out std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -	BAM_AO : out std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -	FAM_AO : out std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -	PAL_AO : out std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -	AUX_AO : out std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0)); +	TMM_ADDR : out std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); +	BAM_ADDR : out std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); +	FAM_ADDR : out std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); +	PAL_ADDR : out std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); +	AUX_ADDR : out std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0));  end ppu_addr_dec;  architecture Behavioral of ppu_addr_dec is  	signal TMM_RANGE, BAM_RANGE, FAM_RANGE, PAL_RANGE, AUX_RANGE : std_logic := '0'; -- ADDR in range of memory area  begin  	-- address MUX -	TMM_AO <= ADDR(PPU_TMM_ADDR_WIDTH-1 downto 0) when EN = '1' else TMM_AI; -	BAM_AO <= ADDR(PPU_BAM_ADDR_WIDTH-1 downto 0) when EN = '1' else BAM_AI; -	FAM_AO <= ADDR(PPU_FAM_ADDR_WIDTH-1 downto 0) when EN = '1' else FAM_AI; -	PAL_AO <= ADDR(PPU_PAL_ADDR_WIDTH-1 downto 0) when EN = '1' else PAL_AI; -	AUX_AO <= ADDR(PPU_AUX_ADDR_WIDTH-1 downto 0) when EN = '1' else AUX_AI; +	TMM_ADDR <= ADDR(PPU_TMM_ADDR_WIDTH-1 downto 0); +	BAM_ADDR <= ADDR(PPU_BAM_ADDR_WIDTH-1 downto 0); +	FAM_ADDR <= ADDR(PPU_FAM_ADDR_WIDTH-1 downto 0); +	PAL_ADDR <= ADDR(PPU_PAL_ADDR_WIDTH-1 downto 0); +	AUX_ADDR <= ADDR(PPU_AUX_ADDR_WIDTH-1 downto 0);  	-- WEN MUX  	TMM_WEN <= TMM_RANGE and WEN; diff --git a/basys3/basys3.srcs/ppu_addr_dec_tb.vhd b/basys3/basys3.srcs/ppu_addr_dec_tb.vhd index f31ee67..051f305 100644 --- a/basys3/basys3.srcs/ppu_addr_dec_tb.vhd +++ b/basys3/basys3.srcs/ppu_addr_dec_tb.vhd @@ -12,7 +12,6 @@ end ppu_addr_dec_tb;  architecture behavioral of ppu_addr_dec_tb is  	component ppu_addr_dec port( -		EN : in std_logic; -- EXT *ADDR enable (switch *AO to ADDR instead of *AI)  		WEN : in std_logic; -- EXT write enable  		TMM_WEN,  		BAM_WEN, @@ -20,34 +19,22 @@ architecture behavioral of ppu_addr_dec_tb is  		PAL_WEN,  		AUX_WEN : out std_logic; -- write enable MUX  		ADDR : in std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH-1 downto 0); -- address in -		TMM_AI : in std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -		BAM_AI : in std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -		FAM_AI : in std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -		PAL_AI : in std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -		AUX_AI : in std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0); -		TMM_AO : out std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -		BAM_AO : out std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -		FAM_AO : out std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -		PAL_AO : out std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -		AUX_AO : out std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0)); +		TMM_ADDR : out std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); +		BAM_ADDR : out std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); +		FAM_ADDR : out std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); +		PAL_ADDR : out std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); +		AUX_ADDR : out std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0));  	end component; -	signal EN : std_logic;  	signal WEN : std_logic;  	signal TMM_WEN, BAM_WEN, FAM_WEN, PAL_WEN, AUX_WEN : std_logic;  	signal ADDR : std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH-1 downto 0); -	signal TMM_AI : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -	signal BAM_AI : std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -	signal FAM_AI : std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -	signal PAL_AI : std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -	signal AUX_AI : std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0); -	signal TMM_AO : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); -	signal BAM_AO : std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); -	signal FAM_AO : std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); -	signal PAL_AO : std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); -	signal AUX_AO : std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0); +	signal TMM_ADDR : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0); +	signal BAM_ADDR : std_logic_vector(PPU_BAM_ADDR_WIDTH-1 downto 0); +	signal FAM_ADDR : std_logic_vector(PPU_FAM_ADDR_WIDTH-1 downto 0); +	signal PAL_ADDR : std_logic_vector(PPU_PAL_ADDR_WIDTH-1 downto 0); +	signal AUX_ADDR : std_logic_vector(PPU_AUX_ADDR_WIDTH-1 downto 0);  begin  	uut : ppu_addr_dec port map( -    EN => EN,      WEN => WEN,      TMM_WEN => TMM_WEN,      BAM_WEN => BAM_WEN, @@ -55,26 +42,14 @@ begin      PAL_WEN => PAL_WEN,      AUX_WEN => AUX_WEN,      ADDR => ADDR, -    TMM_AI => TMM_AI, -    BAM_AI => BAM_AI, -    FAM_AI => FAM_AI, -    PAL_AI => PAL_AI, -    AUX_AI => AUX_AI, -    TMM_AO => TMM_AO, -    BAM_AO => BAM_AO, -    FAM_AO => FAM_AO, -    PAL_AO => PAL_AO, -    AUX_AO => AUX_AO); +    TMM_ADDR => TMM_ADDR, +    BAM_ADDR => BAM_ADDR, +    FAM_ADDR => FAM_ADDR, +    PAL_ADDR => PAL_ADDR, +    AUX_ADDR => AUX_ADDR); -  EN <= '1';    WEN <= '1'; -  TMM_AI <= (others => '1'); -  BAM_AI <= (others => '0'); -  FAM_AI <= (others => '1'); -  PAL_AI <= (others => '0'); -  AUX_AI <= (others => '0'); -  	tb : process  	begin  		for i in 0 to 65535 loop diff --git a/basys3/basys3.srcs/ppu_consts.vhd b/basys3/basys3.srcs/ppu_consts.vhd index 75b6168..4784950 100644 --- a/basys3/basys3.srcs/ppu_consts.vhd +++ b/basys3/basys3.srcs/ppu_consts.vhd @@ -10,6 +10,7 @@ package ppu_consts is  	constant PPU_RAM_BUS_DATA_WIDTH : natural := 16; -- RAM bus data width  	constant PPU_FG_SPRITE_COUNT : natural := 128; -- foreground sprites  	constant PPU_COLOR_OUTPUT_DEPTH : natural := 4; -- VGA output channel depth +	constant PPU_RGB_COLOR_OUTPUT_DEPTH : natural := 3 * PPU_COLOR_OUTPUT_DEPTH;  	constant PPU_PALETTE_COLOR_WIDTH : natural := 3; -- palette index width (within sprite)  	constant PPU_PALETTE_INDEX_WIDTH : natural := 3; -- palette index width (palette table)  	constant PPU_PALETTE_CIDX_WIDTH : natural := (PPU_PALETTE_COLOR_WIDTH + PPU_PALETTE_INDEX_WIDTH); -- global palette index width @@ -30,8 +31,11 @@ package ppu_consts is  	constant PPU_SPRITE_PIDX_WIDTH : natural := 8; -- bits needed to identify horizontal and vertical pixel within sprite  	constant PPU_SPRITE_POS_H_WIDTH: natural := 4; -- bits needed to identify horizontal pixel within sprite  	constant PPU_SPRITE_POS_V_WIDTH: natural := 4; -- bits needed to identify vertical pixel within sprite -	constant PPU_SCREEN_WIDTH : natural := 320; -- absolute screen width (pixels) -	constant PPU_SCREEN_HEIGHT : natural := 240; -- absolute screen height (pixels) +	constant PPU_SCREEN_WIDTH : natural := 320; -- absolute screen width (tiny pixels) +	constant PPU_SCREEN_HEIGHT : natural := 240; -- absolute screen height (tiny pixels) +	constant PPU_NATIVE_SCREEN_WIDTH : natural := 2 * PPU_SCREEN_WIDTH; -- screen width (native pixels) +	constant PPU_NATIVE_SCREEN_HEIGHT : natural := 2 * PPU_SCREEN_HEIGHT; -- screen height (native pixels) +	constant PPU_DISPCTL_SLBUF_ADDR_WIDTH : natural := ceil_log2(2 * PPU_SCREEN_WIDTH);  	constant PPU_BG_CANVAS_TILES_H : natural := 40; -- tiles (horizontally) on background canvas  	constant PPU_BG_CANVAS_TILES_V : natural := 30; -- tiles (vertically) on background canvas  	constant PPU_BG_CANVAS_TILE_H_WIDTH : natural := 6; -- bits needed to describe horizontal bg tile index (grid coordinates) @@ -44,6 +48,27 @@ package ppu_consts is  	constant PPU_TMM_CACHE_FETCH_C_COUNT : natural := PPU_SPRITE_WORD_COUNT + 1;  	constant PPU_TMM_CACHE_FETCH_A_COUNT : natural := PPU_TMM_CACHE_FETCH_C_COUNT * PPU_FG_SPRITE_COUNT; -- amount of clocks to fetch new TMM cache  	constant PPU_TMM_CACHE_FETCH_A_WIDTH : natural := ceil_log2(PPU_TMM_CACHE_FETCH_A_COUNT); +	constant PPU_ACCURATE_FG_SPRITE_COUNT : natural := 16; +	constant PPU_PL_TOTAL_STAGES : natural := 14; +	-- VGA signal timings (https://tomverbeure.github.io/video_timings_calculator) +	constant PPU_VGA_H_ACTIVE : natural := PPU_NATIVE_SCREEN_WIDTH; +	constant PPU_VGA_H_PORCH_FRONT : natural := 96; +	constant PPU_VGA_H_SYNC : natural := 16; +	constant PPU_VGA_H_PORCH_BACK : natural := 48; +	constant PPU_VGA_H_BLANK : natural := PPU_VGA_H_PORCH_FRONT + PPU_VGA_H_SYNC + PPU_VGA_H_PORCH_BACK; +	constant PPU_VGA_H_TOTAL : natural := PPU_VGA_H_BLANK + PPU_VGA_H_ACTIVE; +	constant PPU_VGA_V_ACTIVE : natural := PPU_NATIVE_SCREEN_HEIGHT; +	constant PPU_VGA_V_PORCH_FRONT : natural := 10; +	constant PPU_VGA_V_SYNC : natural := 2; +	constant PPU_VGA_V_PORCH_BACK : natural := 29; +	constant PPU_VGA_V_BLANK : natural := PPU_VGA_V_PORCH_FRONT + PPU_VGA_V_SYNC + PPU_VGA_V_PORCH_BACK; +	constant PPU_VGA_V_TOTAL : natural := PPU_VGA_V_BLANK + PPU_VGA_V_ACTIVE; +	constant PPU_VGA_SIGNAL_PIXEL_IDX_MAX : natural := PPU_VGA_V_TOTAL * PPU_VGA_H_TOTAL; -- horizontal and vertical pixel clock index +	constant PPU_VGA_SIGNAL_PIXEL_WIDTH : natural := ceil_log2(PPU_VGA_SIGNAL_PIXEL_IDX_MAX); -- bit width to count total horizontal and vertical pixel clock index +	constant PPU_SCREEN_T_POS_X_WIDTH : natural := ceil_log2(PPU_SCREEN_WIDTH); +	constant PPU_SCREEN_T_POS_Y_WIDTH : natural := ceil_log2(PPU_SCREEN_HEIGHT); +	constant PPU_SCREEN_N_POS_X_WIDTH : natural := ceil_log2(PPU_NATIVE_SCREEN_WIDTH); +	constant PPU_SCREEN_N_POS_Y_WIDTH : natural := ceil_log2(PPU_NATIVE_SCREEN_HEIGHT);  end package ppu_consts;  package body ppu_consts is  	-- https://stackoverflow.com/questions/21783280/number-of-bits-to-represent-an-integer-in-vhdl diff --git a/basys3/basys3.srcs/ppu_dispctl.vhd b/basys3/basys3.srcs/ppu_dispctl.vhd new file mode 100644 index 0000000..117b780 --- /dev/null +++ b/basys3/basys3.srcs/ppu_dispctl.vhd @@ -0,0 +1,166 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; +use work.ppu_consts.all; + +entity ppu_dispctl is port( +	SYSCLK : in std_logic; -- system clock +	RESET : in std_logic; + +	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) + +	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 +	THBLANK, TVBLANK : out std_logic); -- tiny sync signals +end ppu_dispctl; + +architecture Behavioral of ppu_dispctl is +	component ppu_dispctl_pixclk is port (  +		clk_out1 : out std_logic; +		clk_out2 : out std_logic; +		reset : in std_logic; +		clk_in1 : in std_logic); +	end component; +	component ppu_dispctl_slbuf port( -- scanline buffer +		clka : in std_logic; +		wea : in std_logic_vector(0 to 0); +		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); +	end component; +	signal NPIXCLK, TPIXCLK : std_logic; +	signal NHCOUNT, NVCOUNT : unsigned(PPU_VGA_SIGNAL_PIXEL_WIDTH-1 downto 0) := (others => '0'); +	signal ADDR_I, ADDR_O : std_logic_vector(PPU_DISPCTL_SLBUF_ADDR_WIDTH-1 downto 0); +	signal DATA_I, DATA_O : std_logic_vector(PPU_RGB_COLOR_OUTPUT_DEPTH-1 downto 0); +	signal T_POS_X : unsigned(PPU_SCREEN_T_POS_X_WIDTH-1 downto 0) := (others => '0'); -- real tiny x position +	signal T_POS_Y : unsigned(PPU_SCREEN_T_POS_Y_WIDTH-1 downto 0) := (others => '0'); -- real tiny y position +	signal U_POS_X : unsigned(PPU_SCREEN_T_POS_X_WIDTH-1 downto 0) := (others => '0'); -- upscaled tiny x position +	signal U_POS_Y : unsigned(PPU_SCREEN_T_POS_Y_WIDTH-1 downto 0) := (others => '0'); -- upscaled tiny y position +	signal N_POS_X : unsigned(PPU_SCREEN_N_POS_X_WIDTH-1 downto 0) := (others => '0'); -- native x position +	signal N_POS_Y : unsigned(PPU_SCREEN_N_POS_Y_WIDTH-1 downto 0) := (others => '0'); -- native y position + +	signal NACTIVE, NHACTIVE, NVACTIVE : std_logic := '0'; +	signal TACTIVE, THACTIVE, TVACTIVE : std_logic := '0'; +begin +	-- scanline buffer data in +	DATA_I <= RI & GI & BI; +	ADDR_I <= std_logic_vector(resize(T_POS_X, ADDR_I'length)) when T_POS_Y(0) = '0' else std_logic_vector(resize(T_POS_X, ADDR_I'length) + PPU_SCREEN_WIDTH); + +	T_POS_Y <= U_POS_Y; +	-- tiny VCOUNT and HCOUNT +	process(TPIXCLK, RESET) +		variable TMP_T_POS_X : unsigned(PPU_SCREEN_T_POS_X_WIDTH-1 downto 0) := (others => '0'); +		variable TMP_THBLANK, TMP_TVBLANK : std_logic := '0'; +	begin +		if RESET = '1' then +			TMP_THBLANK := '0'; -- TODO +			TMP_TVBLANK := '0'; -- TODO +		elsif rising_edge(TPIXCLK) then +			T_POS_X <= TMP_T_POS_X; + +			THBLANK <= TMP_THBLANK; +			TVBLANK <= TMP_TVBLANK; + +			if NACTIVE = '1' then +				TMP_T_POS_X := TMP_T_POS_X + 1; +				if TMP_T_POS_X >= PPU_SCREEN_WIDTH then +					TMP_T_POS_X := (others => '0'); +				end if; +			end if; +		end if; +	end process; + +	X <= std_logic_vector(T_POS_X) when NACTIVE = '1' else (others => '0'); +	Y <= std_logic_vector(T_POS_Y) when NACTIVE = '1' else (others => '0'); + +	U_POS_X <= resize(N_POS_X(N_POS_X'length-1 downto 1), U_POS_X'length); +	U_POS_Y <= resize(N_POS_Y(N_POS_Y'length-1 downto 1), U_POS_Y'length); + +	-- scanline buffer data out +	ADDR_O <= std_logic_vector(resize(U_POS_X, ADDR_I'length)) when U_POS_Y(0) = '1' else std_logic_vector(resize(U_POS_X, ADDR_I'length) + PPU_SCREEN_WIDTH); +	RO <= DATA_O(11 downto 8) when NACTIVE = '1' else (others => '0'); +	GO <= DATA_O(7 downto 4) when NACTIVE = '1' else (others => '0'); +	BO <= DATA_O(3 downto 0) when NACTIVE = '1' else (others => '0'); + +	-- native (+upscaled) VCOUNT and HCOUNT +	process(NPIXCLK, RESET) +		variable TMP_NHCOUNT, TMP_NVCOUNT : unsigned(PPU_VGA_SIGNAL_PIXEL_WIDTH-1 downto 0) := (others => '0'); +		variable TMP_NHACTIVE, TMP_NVACTIVE : std_logic := '0'; +		variable TMP_NHSYNC, TMP_NVSYNC : std_logic := '0'; +	begin +		if RESET = '1' then +			TMP_NHCOUNT := (others => '0'); +			TMP_NVCOUNT := (others => '0'); +			TMP_NHACTIVE := '0'; +			TMP_NVACTIVE := '0'; +			TMP_NVSYNC := '0'; +			TMP_NHSYNC := '0'; +		elsif rising_edge(NPIXCLK) then +			-- sync write (needs to be here to happen on rising edge) +			NVCOUNT <= TMP_NVCOUNT; +			NHCOUNT <= TMP_NHCOUNT; +			NHACTIVE <= TMP_NHACTIVE; +			NVACTIVE <= TMP_NVACTIVE; +			NACTIVE <= TMP_NHACTIVE and TMP_NVACTIVE; +			NVSYNC <= TMP_NVSYNC; +			NHSYNC <= TMP_NHSYNC; +			N_POS_X <= resize(TMP_NHCOUNT - PPU_VGA_H_PORCH_BACK, N_POS_X'length) when TMP_NHACTIVE = '1' else (others => '0'); +			N_POS_Y <= resize(TMP_NVCOUNT - PPU_VGA_V_PORCH_BACK, N_POS_Y'length) when TMP_NVACTIVE = '1' else (others => '0'); + +			-- horizontal count (pixel) +			TMP_NHCOUNT := TMP_NHCOUNT + 1; +			if TMP_NHCOUNT >= PPU_VGA_H_TOTAL then +				TMP_NHCOUNT := (others => '0'); + +				-- vertical count (scanline) +				TMP_NVCOUNT := TMP_NVCOUNT + 1; +				if TMP_NVCOUNT >= PPU_VGA_V_TOTAL then +					TMP_NVCOUNT := (others => '0'); +				end if; + +				-- vertical display area (active) +				if TMP_NVCOUNT = PPU_VGA_V_PORCH_BACK then TMP_NVACTIVE := '1'; end if; +				if TMP_NVCOUNT = PPU_VGA_V_PORCH_BACK + PPU_VGA_V_ACTIVE then TMP_NVACTIVE := '0'; end if; + +				-- vertical sync period +				if TMP_NVCOUNT = PPU_VGA_V_PORCH_BACK + PPU_VGA_V_ACTIVE then TMP_NVSYNC := '1'; end if; +				if TMP_NVCOUNT = PPU_VGA_V_PORCH_BACK + PPU_VGA_V_ACTIVE + PPU_VGA_V_SYNC then TMP_NVSYNC := '0'; end if; +			end if; + +			-- horizontal display area (active) +			if TMP_NHCOUNT = PPU_VGA_H_PORCH_BACK then TMP_NHACTIVE := '1'; end if; +			if TMP_NHCOUNT = PPU_VGA_H_PORCH_BACK + PPU_VGA_H_ACTIVE then TMP_NHACTIVE := '0'; end if; + +			-- horizontal sync period +			if TMP_NHCOUNT = PPU_VGA_H_PORCH_BACK + PPU_VGA_H_ACTIVE then TMP_NHSYNC := '1'; end if; +			if TMP_NHCOUNT = PPU_VGA_H_PORCH_BACK + PPU_VGA_H_ACTIVE + PPU_VGA_H_SYNC then TMP_NHSYNC := '0'; end if; +		end if; +	end process; + +	scanline_buffer : component ppu_dispctl_slbuf port map( +		clka => SYSCLK, +		wea => (others => PREADY), +		addra => ADDR_I, +		dina => DATA_I, +		clkb => SYSCLK, +		rstb => RESET, +		addrb => ADDR_O, +		doutb => DATA_O, +		rsta_busy => open, +		rstb_busy => open); + +	pixel_clock: component ppu_dispctl_pixclk port map( +    clk_in1 => SYSCLK, +    reset => RESET, +    clk_out1 => NPIXCLK, +    clk_out2 => TPIXCLK); +end Behavioral; diff --git a/basys3/basys3.srcs/ppu_dispctl_demo.xdc b/basys3/basys3.srcs/ppu_dispctl_demo.xdc new file mode 100644 index 0000000..695de8c --- /dev/null +++ b/basys3/basys3.srcs/ppu_dispctl_demo.xdc @@ -0,0 +1,40 @@ +create_clock -period 10.000 -name CLK100 -waveform {0.000 5.000} [get_ports CLK100] +set_input_delay -clock [get_clocks CLK100] -min -add_delay 2.000 [get_ports RESET] +set_input_delay -clock [get_clocks CLK100] -max -add_delay 3.000 [get_ports RESET] +set_property IOSTANDARD LVCMOS33 [get_ports {B[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {B[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {B[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {B[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports CLK100] +set_property IOSTANDARD LVCMOS33 [get_ports {G[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {G[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {G[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {G[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports HSYNC] +set_property IOSTANDARD LVCMOS33 [get_ports {R[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {R[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {R[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {R[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports VSYNC] +set_property PACKAGE_PIN W5 [get_ports CLK100] +set_property PACKAGE_PIN P19 [get_ports HSYNC] +set_property PACKAGE_PIN R19 [get_ports VSYNC] + + +set_property PACKAGE_PIN J18 [get_ports {B[3]}] +set_property PACKAGE_PIN K18 [get_ports {B[2]}] +set_property PACKAGE_PIN L18 [get_ports {B[1]}] +set_property PACKAGE_PIN N18 [get_ports {B[0]}] +set_property PACKAGE_PIN D17 [get_ports {G[3]}] +set_property PACKAGE_PIN G17 [get_ports {G[2]}] +set_property PACKAGE_PIN H17 [get_ports {G[1]}] +set_property PACKAGE_PIN J17 [get_ports {G[0]}] +set_property PACKAGE_PIN N19 [get_ports {R[3]}] +set_property PACKAGE_PIN J19 [get_ports {R[2]}] +set_property PACKAGE_PIN H19 [get_ports {R[1]}] +set_property PACKAGE_PIN G19 [get_ports {R[0]}] + +set_property PACKAGE_PIN T18 [get_ports RESET] +set_property IOSTANDARD LVCMOS33 [get_ports RESET] + + diff --git a/basys3/basys3.srcs/ppu_dispctl_demo_top.vhd b/basys3/basys3.srcs/ppu_dispctl_demo_top.vhd new file mode 100644 index 0000000..dcbe100 --- /dev/null +++ b/basys3/basys3.srcs/ppu_dispctl_demo_top.vhd @@ -0,0 +1,78 @@ +library ieee; +library work; + +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; +use work.ppu_consts.all; + +entity ppu_dispctl_demo is port( +	CLK100 : in std_logic; -- system clock +	RESET : in std_logic; -- global (async) system reset +	R,G,B : out std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); +	VSYNC, HSYNC : out std_logic); -- vblank for synchronization +end ppu_dispctl_demo; + +architecture Behavioral of ppu_dispctl_demo is +	component ppu_dispctl port( -- display controller +		SYSCLK : in std_logic; -- system clock +		RESET : in std_logic; + +		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) + +		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 +		THBLANK, TVBLANK : out std_logic); -- tiny sync signals +	end component; +	component ppu_dispctl_test_img port (  +		clka : in std_logic; +		addra : in std_logic_vector (16 downto 0); +		douta : out std_logic_vector (11 downto 0)); +	end component; +	signal PREADY : std_logic := '0'; +	signal ADDR : std_logic_vector (16 downto 0); +	signal DATA : std_logic_vector (11 downto 0); +	signal X : std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); +	signal Y : std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); + +	alias DATA_R is DATA(11 downto 8); +	alias DATA_G is DATA(7 downto 4); +	alias DATA_B is DATA(3 downto 0); +begin +	ADDR <= std_logic_vector(resize(unsigned(X) + (unsigned(Y) * to_unsigned(PPU_SCREEN_WIDTH, ADDR'length)), ADDR'length)); + +	process(CLK100) +		variable counter : unsigned(3 downto 0) := (others => '0'); +	begin +		if rising_edge(CLK100) then +			counter := counter + 1; +			if counter = 5 then PREADY <= '1'; end if; +			if counter = 6 then PREADY <= '0'; end if; +		end if; +	end process; + +	test_img : component ppu_dispctl_test_img port map( +		clka => CLK100, +		addra => ADDR, +		douta => DATA); + +	display_controller : component ppu_dispctl port map( +		SYSCLK => CLK100, +		RESET => RESET, +		PREADY => PREADY, +		X => X, +		Y => Y, +		RI => DATA_R, +		GI => DATA_G, +		BI => DATA_B, +		RO => R, +		GO => G, +		BO => B, +		NVSYNC => VSYNC, +		NHSYNC => HSYNC, +		TVBLANK => open, +		THBLANK => open); +end Behavioral; diff --git a/basys3/basys3.srcs/ppu_dispctl_tb.vhd b/basys3/basys3.srcs/ppu_dispctl_tb.vhd new file mode 100644 index 0000000..e54a304 --- /dev/null +++ b/basys3/basys3.srcs/ppu_dispctl_tb.vhd @@ -0,0 +1,48 @@ +library ieee; +library unisim; + +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use unisim.vcomponents.all; +use work.ppu_consts.all; + +entity ppu_dispctl_tb is +end ppu_dispctl_tb; + +architecture behavioral of ppu_dispctl_tb is +	signal SYSCLK : std_logic := '0'; +	signal RESET : std_logic := '0'; +	signal X : std_logic_vector(PPU_POS_H_WIDTH-1 downto 0) := (others => '0'); +	signal Y : std_logic_vector(PPU_POS_V_WIDTH-1 downto 0) := (others => '0'); +	signal RO,GO,BO : std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0) := (others => '0'); +	signal NVSYNC, NHSYNC : std_logic := '0'; +	signal THBLANK, TVBLANK : std_logic := '0'; +begin +	uut : entity work.ppu_dispctl port map( +		SYSCLK => SYSCLK, +		RESET => RESET, +		PREADY => '1', +		X => X, +		Y => Y, +		RI => (others => '1'), +		GI => (others => '0'), +		BI => (others => '1'), +		RO => RO, +		GO => GO, +		BO => BO, +		NVSYNC => NVSYNC, +		NHSYNC => NHSYNC, +		TVBLANK => TVBLANK, +		THBLANK => THBLANK); + +	process +	begin +		for i in 0 to 3200000 loop +			wait for 5 ns; +			SYSCLK <= '1'; +			wait for 5 ns; +			SYSCLK <= '0'; +		end loop; +		wait; -- stop for simulator +	end process; +end; diff --git a/basys3/basys3.srcs/ppu_pceg.vhd b/basys3/basys3.srcs/ppu_pceg.vhd index 1aaeee4..d53d86a 100644 --- a/basys3/basys3.srcs/ppu_pceg.vhd +++ b/basys3/basys3.srcs/ppu_pceg.vhd @@ -1,40 +1,40 @@  library ieee;  use ieee.std_logic_1164.all; ---use ieee.numeric_std.all; +use work.ppu_consts.all;  entity ppu_pceg is port(  	CLK : in std_logic; -- system clock  	RESET : in std_logic; -- async reset -	SPRITE : out std_logic; -- sprite info fetch + sprite pixel fetch -	COMP_PAL : out std_logic; -- compositor + palette lookup -	DONE : out std_logic); -- last pipeline stage done +	SPRITE_BG : out std_logic; -- sprite info fetch + sprite pixel fetch +	SPRITE_FG : out std_logic; -- sprite pixel fetch +	DONE : out std_logic; -- last pipeline stage done +	READY : out std_logic); -- rgb buffer propagation ready  end ppu_pceg;  architecture Behavioral of ppu_pceg is -	constant PPU_PL_TOTAL_STAGES : natural := 14; - -	type states is (PL_SPRITE, PL_COMP_PAL, PL_DONE); -	signal state : states := PL_SPRITE; +	signal PL_SPRITE_BG, PL_SPRITE_FG, PL_DONE, PL_READY : boolean := false;  begin  	-- output drivers -	SPRITE <= CLK when RESET = '0' and state = PL_SPRITE else '0'; -	COMP_PAL <= CLK when RESET = '0' and state = PL_COMP_PAL else '0'; -	DONE <= '1' when RESET = '0' and state = PL_DONE else '0'; +	SPRITE_BG <= CLK when RESET = '0' and PL_SPRITE_BG else '0'; +	SPRITE_FG <= CLK when RESET = '0' and PL_SPRITE_FG else '0'; +	DONE <= CLK when RESET = '0' and PL_DONE else '0'; +	READY <= '1' when RESET = '0' and PL_READY else '0';  	process(CLK, RESET)  		variable CLK_IDX : natural range 0 to PPU_PL_TOTAL_STAGES+1 := 0;  	begin  		if RESET = '1' then -			state <= PL_SPRITE; +			CLK_IDX := 0; +			PL_SPRITE_BG <= false; +			PL_SPRITE_FG <= false; +			PL_DONE <= false; +			PL_READY <= false;  		elsif rising_edge(CLK) then  			-- clock counter ranges -			if CLK_IDX < 4 then -				state <= PL_SPRITE; -			elsif CLK_IDX < 5 then -				state <= PL_COMP_PAL; -			else -				state <= PL_DONE; -			end if; +			PL_SPRITE_BG <= true when CLK_IDX >= 0 and CLK_IDX <= 3 else false; +			PL_SPRITE_FG <= true when CLK_IDX >= 1 and CLK_IDX <= 2 else false; +			PL_DONE <= true when CLK_IDX = 4 else false; +			PL_READY <= true when CLK_IDX >= 5 else false;  			-- increment clock counter  			CLK_IDX := CLK_IDX + 1; diff --git a/basys3/basys3.srcs/ppu_pceg_tb.vhd b/basys3/basys3.srcs/ppu_pceg_tb.vhd index 719ec06..1c2c855 100644 --- a/basys3/basys3.srcs/ppu_pceg_tb.vhd +++ b/basys3/basys3.srcs/ppu_pceg_tb.vhd @@ -12,31 +12,30 @@ architecture behavioral of ppu_pceg_tb is  	component ppu_pceg port(  		CLK : in std_logic; -- system clock  		RESET : in std_logic; -- async reset -		SPRITE : out std_logic; -- sprite info fetch + sprite pixel fetch -		COMP_PAL : out std_logic; -- compositor + palette lookup -		DONE : out std_logic); -- last pipeline stage done +		SPRITE_BG : out std_logic; -- sprite info fetch + sprite pixel fetch +		SPRITE_FG : out std_logic; -- sprite pixel fetch +		DONE : out std_logic; -- last pipeline stage done +		READY : out std_logic); -- rgb buffer propagation ready  	end component;  	signal CLK : std_logic := '0';  	signal RESET : std_logic := '0'; -	signal SPRITE : std_logic; -	signal COMP_PAL : std_logic; +	signal SPRITE_BG : std_logic; +	signal SPRITE_FG : std_logic;  	signal DONE : std_logic; +	signal READY : std_logic;  begin  	uut : ppu_pceg port map(  		CLK => CLK,  		RESET => RESET, -		SPRITE => SPRITE, -		COMP_PAL => COMP_PAL, -		DONE => DONE); +		SPRITE_BG => SPRITE_BG, +		SPRITE_FG => SPRITE_FG, +		DONE => DONE, +		READY => READY);  	tb : process  	begin  		for i in 0 to 32 loop -			if i > 20 then -				RESET <= '1'; -			end if; -	  			wait for 5 ns;  			CLK <= '1';  			wait for 5 ns; @@ -44,4 +43,16 @@ begin  		end loop;  		wait; -- stop for simulator  	end process; + +	gert : process +	begin +		RESET <= '1'; +		wait for 1 ns; +		RESET <= '0'; +		wait for 100 ns; +		RESET <= '1'; +		wait for 5 ns; +		RESET <= '0'; +		wait; +	end process;  end; diff --git a/basys3/basys3.srcs/ppu_plut.vhd b/basys3/basys3.srcs/ppu_plut.vhd index d2e132e..2379274 100644 --- a/basys3/basys3.srcs/ppu_plut.vhd +++ b/basys3/basys3.srcs/ppu_plut.vhd @@ -34,7 +34,8 @@ architecture Behavioral of ppu_plut is  	end component;  	signal PLUT : std_logic_vector((64 * PPU_PAL_DATA_WIDTH)-1 downto 0) := (others => '0'); -	signal CHECK_ZERO_CIDX : std_logic_vector(PPU_PALETTE_CIDX_WIDTH-1 downto 0) := (others => '0'); -- color in +	signal COLOR : std_logic_vector(PPU_PAL_DATA_WIDTH-1 downto 0) := (others => '0'); -- COLORS RGB IN +	signal CIDX_INT : integer := 0;  begin  	RAM : component er_ram port map(  		CLK => CLK, @@ -44,26 +45,9 @@ begin  		DATA => PAL_DATA,  		REG => PLUT); -	process(CLK, RESET) -		variable COLOR : std_logic_vector(PPU_PAL_DATA_WIDTH-1 downto 0) := (others => '0'); -- COLORS RGB IN -		variable CIDX_INT : integer := 0; -	begin -		if RESET = '1' then -			PLUT <= (others => '0'); -		else -			if rising_edge (CLK) then -				if (CIDX /= CHECK_ZERO_CIDX) then -					CIDX_INT := to_integer(unsigned(CIDX)); -					COLOR := PLUT((12 * CIDX_INT) + 11 downto (12*CIDX_INT)); -					R <= COLOR(11 downto  8); -					G <= COLOR(7 downto 4); -					B <= COLOR(3 downto 0); -				else -					R <= x"0"; -					G <= x"0"; -					B <= x"0"; -				end if; -			end if; -		end if; -	end process; +	CIDX_INT <= to_integer(unsigned(CIDX)); +	COLOR <= PLUT((12 * CIDX_INT) + 11 downto (12*CIDX_INT)); +	R <= COLOR(11 downto  8); +	G <= COLOR(7 downto 4); +	B <= COLOR(3 downto 0);  end Behavioral; diff --git a/basys3/basys3.srcs/ppu_sprite_bg.vhd b/basys3/basys3.srcs/ppu_sprite_bg.vhd index dba5b8e..417210c 100644 --- a/basys3/basys3.srcs/ppu_sprite_bg.vhd +++ b/basys3/basys3.srcs/ppu_sprite_bg.vhd @@ -11,6 +11,7 @@ entity ppu_sprite_bg is port(  	-- inputs  	CLK : in std_logic; -- pipeline clock  	RESET : in std_logic; -- reset clock counter +	PL_RESET : in std_logic; -- reset pipeline clock counters  	OE : in std_logic; -- output enable (of CIDX)  	X : in std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x  	Y : in std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y @@ -67,8 +68,8 @@ architecture Behavioral of ppu_sprite_bg is  begin  	-- output drivers  	CIDX <= T_CIDX when OE = '1' else (others => 'Z'); -	BAM_ADDR <= R_BAM_ADDR; -	TMM_ADDR <= R_TMM_ADDR; +	BAM_ADDR <= R_BAM_ADDR when state = PL_BAM_ADDR else (others => 'Z'); +	TMM_ADDR <= R_TMM_ADDR when state = PL_TMM_ADDR else (others => 'Z');  	T_BAM_DATA <= BAM_DATA;  	T_TMM_DATA <= TMM_DATA;  	-- CIDX combination @@ -108,16 +109,18 @@ begin  		                    (others => '0') when others;  	-- state machine (pipeline stage counter) + sync r/w -	process(CLK, RESET) +	process(CLK, RESET, PL_RESET)  	begin -		if RESET = '1' then +		if RESET = '1' or PL_RESET = '1' then  			-- reset state  			state <= PL_BAM_ADDR; -			-- reset internal pipeline registers -			R_BAM_ADDR <= (others => '0'); -			R_BAM_DATA <= (others => '0'); -			R_TMM_ADDR <= (others => '0'); -			R_TMM_DATA <= (others => '0'); +			if RESET = '1' then +				-- reset internal pipeline registers +				R_BAM_ADDR <= (others => '0'); +				R_BAM_DATA <= (others => '0'); +				R_TMM_ADDR <= (others => '0'); +				R_TMM_DATA <= (others => '0'); +			end if;  		elsif rising_edge(CLK) then  			case state is  				when PL_BAM_ADDR => diff --git a/basys3/basys3.srcs/ppu_sprite_fg.vhd b/basys3/basys3.srcs/ppu_sprite_fg.vhd index af7cfa3..3b4d2c6 100644 --- a/basys3/basys3.srcs/ppu_sprite_fg.vhd +++ b/basys3/basys3.srcs/ppu_sprite_fg.vhd @@ -14,6 +14,8 @@ entity ppu_sprite_fg is -- foreground sprite  		-- inputs  		CLK : in std_logic; -- system clock  		RESET : in std_logic; -- reset internal memory and clock counters +		PL_CLK : in std_logic; -- pipeline clock +		PL_RESET : in std_logic; -- reset pipeline clock counters  		OE : in std_logic; -- output enable (of CIDX)  		X : in std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x  		Y : in std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y @@ -57,9 +59,9 @@ architecture Behavioral of ppu_sprite_fg is  			REG : out std_logic_vector((ADDR_RANGE*DATA_W)-1 downto 0)); -- exposed register output  	end component; -	-- FAM and TMM in/out lines -	signal T_TMM_ADDR : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0) := (others => '0'); -	signal T_TMM_DATA : std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0) := (others => '0'); +	-- TMM in/out temp + registers +	signal T_TMM_ADDR, R_TMM_ADDR : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0) := (others => '0'); +	signal T_TMM_DATA, R_TMM_DATA : std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0) := (others => '0');  	-- auxiliary signals (temp variables)  	signal T_CIDX : std_logic_vector(PPU_PALETTE_CIDX_WIDTH-1 downto 0) := (others => '0'); -- output color buffer/register @@ -75,23 +77,15 @@ architecture Behavioral of ppu_sprite_fg is  	signal SPRITE_ACTIVE : std_logic := '0'; -- is pixel in bounding box of sprite  	signal PIXEL_ABS_X, PIXEL_ABS_Y : integer := 0; -- absolute pixel position (relative to FG canvas instead of viewport) +	signal PIXEL_BIT_OFFSET : integer := 0; -- pixel index within word of TMM  	signal TILE_PIDX_X, TRANS_TILE_PIDX_X : unsigned(PPU_SPRITE_POS_H_WIDTH-1 downto 0) := (others => '0'); -- xy position of pixel within tile (local tile coords)  	signal TILE_PIDX_Y, TRANS_TILE_PIDX_Y : unsigned(PPU_SPRITE_POS_V_WIDTH-1 downto 0) := (others => '0'); -- xy position of pixel within tile (local tile coords) -	signal TRANS_TILE_PIXEL_IDX : integer := 0; -- index of pixel within tile (reading order) +	signal TRANS_TILE_PIDX : integer := 0; -- index of pixel within tile (reading order) +	signal TILEMAP_WORD : unsigned(PPU_TMM_ADDR_WIDTH-1 downto 0) := (others => '0');  	signal TILEMAP_WORD_OFFSET : integer := 0; -- word offset from tile start address in TMM  	signal TMM_DATA_PAL_IDX : std_logic_vector(PPU_PALETTE_COLOR_WIDTH-1 downto 0); -- color of palette -	-- TMM cache lines -	signal TMM_CACHE_WEN, TMM_CACHE_UPDATE_TURN : std_logic := '0'; -	signal TMM_CACHE_DATA : std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0) := (others => '0'); -	signal TMM_CACHE_ADDR : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0) := (others => '0'); -	signal TMM_CACHE : std_logic_vector((PPU_SPRITE_WORD_COUNT * PPU_TMM_DATA_WIDTH)-1 downto 0);  begin -	-- output drivers -	CIDX <= T_CIDX when OE = '1' else (others => 'Z'); -	-- CIDX combination -	T_CIDX <= FAM_REG_COL_IDX & TMM_DATA_PAL_IDX; -  	-- FAM memory  	FAM : component er_ram  		generic map( @@ -107,11 +101,18 @@ begin  			DATA => FAM_DATA,  			REG => INT_FAM); +	-- CIDX combination +	T_CIDX <= FAM_REG_COL_IDX & TMM_DATA_PAL_IDX; +	-- output drivers +	CIDX <= T_CIDX when OE = '1' else (others => 'Z'); +	-- TMM memory +	T_TMM_DATA <= TMM_DATA; +  	-- pixel position within bounding box of sprite  	SPRITE_ACTIVE <= '1' when ((unsigned(X) + 16) >= unsigned(FAM_REG_POS_H)) and -	                          ((unsigned(X) + 16) < (unsigned(FAM_REG_POS_H) + to_unsigned(PPU_SPRITE_WIDTH, PPU_POS_H_WIDTH))) and -	                          ((unsigned(Y) + 16) >= unsigned(FAM_REG_POS_V)) and -	                          ((unsigned(Y) + 16) < (unsigned(FAM_REG_POS_V) + to_unsigned(PPU_SPRITE_HEIGHT, PPU_POS_V_WIDTH))) else '0'; +														((unsigned(X) + 16) < (unsigned(FAM_REG_POS_H) + to_unsigned(PPU_SPRITE_WIDTH, PPU_POS_H_WIDTH))) and +														((unsigned(Y) + 16) >= unsigned(FAM_REG_POS_V)) and +														((unsigned(Y) + 16) < (unsigned(FAM_REG_POS_V) + to_unsigned(PPU_SPRITE_HEIGHT, PPU_POS_V_WIDTH))) else '0';  	-- (sprite local) pixel coords  	TILE_PIDX_X <= resize(unsigned(X) + 16 - resize(unsigned(FAM_REG_POS_H), TILE_PIDX_X'length), TILE_PIDX_X'length); @@ -127,66 +128,118 @@ begin  		YO => TRANS_TILE_PIDX_Y);  	-- pixel index -	TRANS_TILE_PIXEL_IDX <= integer(PPU_SPRITE_WIDTH) * to_integer(TRANS_TILE_PIDX_Y) + to_integer(TRANS_TILE_PIDX_X); -	-- palette color at pixel -	TMM_DATA_PAL_IDX <= TMM_CACHE(TRANS_TILE_PIXEL_IDX * integer(PPU_PALETTE_COLOR_WIDTH) + integer(PPU_PALETTE_COLOR_WIDTH)-1 downto TRANS_TILE_PIXEL_IDX * integer(PPU_PALETTE_COLOR_WIDTH)); -	-- if pixel in sprite hitbox and TMM_DATA_PAL_IDX > 0 -	HIT <= SPRITE_ACTIVE and (nor TMM_DATA_PAL_IDX); - -	-- FETCH LOGIC BELOW -	TMM_ADDR <= T_TMM_ADDR when TMM_CACHE_UPDATE_TURN else (others => 'Z'); -	T_TMM_DATA <= TMM_DATA; - -	-- TTM cache -	ttm_cache : component er_ram -		generic map( -			ADDR_W => PPU_TMM_ADDR_WIDTH, -			DATA_W => PPU_TMM_DATA_WIDTH, -			ADDR_LOW => 0, -			ADDR_RANGE => PPU_SPRITE_WORD_COUNT) -		port map( -			CLK => CLK, -			RST => RESET, -			WEN => TMM_CACHE_WEN, -			ADDR => TMM_CACHE_ADDR, -			DATA => TMM_CACHE_DATA, -			REG => TMM_CACHE); - -	-- fetch machine, should do the following (offset data read by one clock -> propagation/lookup delay): -	-- CLK[53 * IDX + 0] (addr = 0) -	-- CLK[53 * IDX + 1] (addr = 1, read data[0]) -	-- CLK[53 * IDX + 2] (addr = 2, read data[1]), etc -	-- a full tile is 52 words, but since the offset is 1 clock, a total copy takes 53 clock cycles -	process(CLK, RESET, FETCH) -		constant TMM_FETCH_CLK_RANGE_BEGIN : natural := PPU_TMM_CACHE_FETCH_C_COUNT * IDX; -- fetch CLK count for copying this module's sprite from TMM -		variable TMM_FETCH_CTR : unsigned(PPU_TMM_CACHE_FETCH_A_WIDTH-1 downto 0) := (others => '0'); -- CLK counter while FETCH=1 -		variable TMM_FETCH_CTR_REL : unsigned(PPU_TMM_CACHE_FETCH_A_WIDTH-1 downto 0) := (others => '0'); -- CLK counter relative for sprite[IDX] +	TRANS_TILE_PIDX <= integer(PPU_SPRITE_WIDTH) * to_integer(TRANS_TILE_PIDX_Y) + to_integer(TRANS_TILE_PIDX_X); +	TILEMAP_WORD <= resize(unsigned(FAM_REG_TILE_IDX) * PPU_SPRITE_WORD_COUNT, TILEMAP_WORD'length); -- TMM sprite starting word +	TILEMAP_WORD_OFFSET <= TRANS_TILE_PIDX / PPU_PIXELS_PER_TILE_WORD; -- word offset from starting word of sprite +	PIXEL_BIT_OFFSET <= TRANS_TILE_PIDX mod PPU_PIXELS_PER_TILE_WORD; -- pixel bit offset + +	inaccurate_occlusion_shims: if IDX >= PPU_ACCURATE_FG_SPRITE_COUNT generate +		-- state machine for synchronizing pipeline stages +		type states is (PL_TMM_ADDR, PL_TMM_DATA); +		signal state : states := PL_TMM_ADDR;  	begin -		if RESET = '1' or FETCH = '0' then -			TMM_FETCH_CTR := (others => '0'); -			TMM_FETCH_CTR_REL := (others => '0'); -			TMM_CACHE_WEN <= '0'; -			TMM_CACHE_UPDATE_TURN <= '0'; -		elsif rising_edge(CLK) then -			TMM_FETCH_CTR := TMM_FETCH_CTR + 1; -			TMM_FETCH_CTR_REL := TMM_FETCH_CTR - TMM_FETCH_CLK_RANGE_BEGIN; - -			if TMM_FETCH_CTR >= TMM_FETCH_CLK_RANGE_BEGIN and -			   TMM_FETCH_CTR < (TMM_FETCH_CLK_RANGE_BEGIN + PPU_TMM_CACHE_FETCH_C_COUNT) then -				TMM_CACHE_UPDATE_TURN <= '1'; -				if TMM_FETCH_CTR_REL < PPU_TMM_CACHE_FETCH_C_COUNT - 1 then -- calculate address until second to last clock -					T_TMM_ADDR <= std_logic_vector(resize(TMM_FETCH_CTR - IDX, T_TMM_ADDR'length)); -					TMM_CACHE_ADDR <= std_logic_vector(resize(TMM_FETCH_CTR_REL - 1, TMM_CACHE_ADDR'length)); +		HIT <= SPRITE_ACTIVE; +		-- only fetch if OE is high, and during the second pipeline stage +		TMM_ADDR <= R_TMM_ADDR when OE = '1' and state = PL_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 +		with PIXEL_BIT_OFFSET select +			TMM_DATA_PAL_IDX <= R_TMM_DATA(2 downto 0) when 0, +													R_TMM_DATA(5 downto 3) when 1, +													R_TMM_DATA(8 downto 6) when 2, +													R_TMM_DATA(11 downto 9) when 3, +													R_TMM_DATA(14 downto 12) when 4, +													(others => '0') when others; + +		process(PL_CLK, RESET, PL_RESET) +		begin +			if RESET = '1' or PL_RESET = '1' then +				-- reset state +				state <= PL_TMM_ADDR; +				if RESET = '1' then +					-- reset internal pipeline registers +					R_TMM_ADDR <= (others => '0'); +					R_TMM_DATA <= (others => '0');  				end if; - -				if TMM_FETCH_CTR_REL > 0 then -- read offset -					TMM_CACHE_DATA <= T_TMM_DATA; -					TMM_CACHE_WEN <= '1'; -				end if; -			else +			elsif rising_edge(CLK) then +				case state is +					when PL_TMM_ADDR => +						state <= PL_TMM_DATA; +						R_TMM_ADDR <= T_TMM_ADDR; +					when PL_TMM_DATA => +						state <= PL_TMM_ADDR; +						R_TMM_DATA <= T_TMM_DATA; +				end case; +			end if; +		end process; +	end generate; + +	accurate_occlusion_logic: if IDX < PPU_ACCURATE_FG_SPRITE_COUNT generate +		-- TMM cache lines +		signal TMM_CACHE_WEN, TMM_CACHE_UPDATE_TURN : std_logic := '0'; +		signal TMM_CACHE_DATA : std_logic_vector(PPU_TMM_DATA_WIDTH-1 downto 0) := (others => '0'); +		signal TMM_CACHE_ADDR : std_logic_vector(PPU_TMM_ADDR_WIDTH-1 downto 0) := (others => '0'); +		signal TMM_CACHE : std_logic_vector((PPU_SPRITE_WORD_COUNT * PPU_TMM_DATA_WIDTH)-1 downto 0); +	begin +		HIT <= SPRITE_ACTIVE and (nor TMM_DATA_PAL_IDX); + +		-- palette color at pixel +		TMM_DATA_PAL_IDX <= TMM_CACHE(TRANS_TILE_PIDX * integer(PPU_PALETTE_COLOR_WIDTH) + integer(PPU_PALETTE_COLOR_WIDTH)-1 downto TRANS_TILE_PIDX * integer(PPU_PALETTE_COLOR_WIDTH)); + +		TMM_ADDR <= T_TMM_ADDR when TMM_CACHE_UPDATE_TURN else (others => 'Z'); + +		-- TTM cache +		ttm_cache : component er_ram +			generic map( +				ADDR_W => PPU_TMM_ADDR_WIDTH, +				DATA_W => PPU_TMM_DATA_WIDTH, +				ADDR_LOW => 0, +				ADDR_RANGE => PPU_SPRITE_WORD_COUNT) +			port map( +				CLK => CLK, +				RST => RESET, +				WEN => TMM_CACHE_WEN, +				ADDR => TMM_CACHE_ADDR, +				DATA => TMM_CACHE_DATA, +				REG => TMM_CACHE); + +		-- fetch machine, should do the following (offset data read by one clock -> propagation/lookup delay): +		-- CLK[53 * IDX + 0] (addr = 0) +		-- CLK[53 * IDX + 1] (addr = 1, read data[0]) +		-- CLK[53 * IDX + 2] (addr = 2, read data[1]), etc +		-- a full tile is 52 words, but since the offset is 1 clock, a total copy takes 53 clock cycles +		process(CLK, RESET, FETCH) +			constant TMM_FETCH_CLK_RANGE_BEGIN : natural := PPU_TMM_CACHE_FETCH_C_COUNT * IDX; -- fetch CLK count for copying this module's sprite from TMM +			variable TMM_FETCH_CTR : unsigned(PPU_TMM_CACHE_FETCH_A_WIDTH-1 downto 0) := (others => '0'); -- CLK counter while FETCH=1 +			variable TMM_FETCH_CTR_REL : unsigned(PPU_TMM_CACHE_FETCH_A_WIDTH-1 downto 0) := (others => '0'); -- CLK counter relative for sprite[IDX] +		begin +			if RESET = '1' or FETCH = '0' then +				TMM_FETCH_CTR := (others => '0'); +				TMM_FETCH_CTR_REL := (others => '0');  				TMM_CACHE_WEN <= '0';  				TMM_CACHE_UPDATE_TURN <= '0'; +			elsif rising_edge(CLK) then +				TMM_FETCH_CTR := TMM_FETCH_CTR + 1; +				TMM_FETCH_CTR_REL := TMM_FETCH_CTR - TMM_FETCH_CLK_RANGE_BEGIN; + +				if TMM_FETCH_CTR >= TMM_FETCH_CLK_RANGE_BEGIN and +					 TMM_FETCH_CTR < (TMM_FETCH_CLK_RANGE_BEGIN + PPU_TMM_CACHE_FETCH_C_COUNT) then +					TMM_CACHE_UPDATE_TURN <= '1'; +					if TMM_FETCH_CTR_REL < PPU_TMM_CACHE_FETCH_C_COUNT - 1 then -- calculate address until second to last clock +						T_TMM_ADDR <= std_logic_vector(resize(TMM_FETCH_CTR - IDX, T_TMM_ADDR'length)); -- -IDX to correct for each fetch cycle taking 1 extra clock cycle +						TMM_CACHE_ADDR <= std_logic_vector(resize(TMM_FETCH_CTR_REL - 1, TMM_CACHE_ADDR'length)); +					end if; + +					if TMM_FETCH_CTR_REL > 0 then -- read offset +						TMM_CACHE_DATA <= T_TMM_DATA; +						TMM_CACHE_WEN <= '1'; +					end if; +				else +					TMM_CACHE_WEN <= '0'; +					TMM_CACHE_UPDATE_TURN <= '0'; +				end if;  			end if; -		end if; -	end process; +		end process; +	end generate;  end Behavioral; diff --git a/basys3/basys3.srcs/ppu_vga_native.vhd b/basys3/basys3.srcs/ppu_vga_native.vhd deleted file mode 100644 index 47288e9..0000000 --- a/basys3/basys3.srcs/ppu_vga_native.vhd +++ /dev/null @@ -1,95 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use work.ppu_consts.all; -use ieee.numeric_std.all; -use ieee.std_logic_unsigned.all; - -entity ppu_vga_native is port ( -	CLK: in std_logic; -- system clock -	RESET: in std_logic; - -	X: in std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x -	Y: in std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y -	PREADY: in std_logic; -- current pixel ready (pixel color is stable) -	RI,GI,BI: in std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- VGA color in - -	RO,GO,BO: out std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- VGA color out -	VSYNC, HSYNC: out std_logic); -- VGA sync outputs -end ppu_vga_native; - -architecture Behavioral of ppu_vga_native is -	type line_buffer is array(319 downto 0) of std_logic_vector(11 downto 0); -	signal ram_x0 : line_buffer; -- buffer 0 -	signal ram_x1: line_buffer; -- buffer 1 -	signal hcount: std_logic_vector(9 downto 0):= (others => '0'); -	signal vcount: std_logic_vector(9 downto 0):= (others => '0'); -	signal clk_counter: std_logic_vector(1 downto 0):= (others => '0'); -	signal rgb_out : std_logic_vector(11 downto 0):= (others => '0'); -- output colors -	signal px : integer; -- conversion for hcount -	signal py :integer; -- conversion for vcount -	signal buffer_filled_on_buffer0 : integer; -	signal buffer_filled_on_buffer1 : integer; -begin -	process (clk, x, y) -		variable v_x : integer; -- integer to hold vector X -	begin -		if rising_edge(clk) then -			clk_counter <= clk_counter + 1; -			if clk_counter = "11" then -				v_x := to_integer(unsigned(x) - 72); -				if v_x >= 0 and v_x < 320 and PREADY = '1' then -					if y(0) = '0' then -						ram_x0(v_x) <= RI & GI & BI; -						if v_x = 319 then -							buffer_filled_on_buffer0 <= to_integer(unsigned(y) - 14); -						end if; -					else -						ram_x1(v_x) <= RI & GI & BI; -						if v_x = 319 then -							buffer_filled_on_buffer1 <= to_integer(unsigned(y) - 14); -						end if; -					end if; -				end if; -				-- T display(display data) -				if (hcount >= 144) and (hcount < 784) and (vcount >= 31) and (vcount < 511) then -					px <= to_integer(unsigned(hcount) - 144); -					py <= to_integer(unsigned(vcount) - 31); -					if buffer_filled_on_buffer0 = (py/2) then -						rgb_out <= ram_x0(px/2); -					elsif buffer_filled_on_buffer1 = (py/2) then -						rgb_out <= ram_x1(px/2); -					else -						rgb_out <= (others => '0'); -					end if; -				end if; -				-- pulse width -				hsync <= '1'; -				if hcount < 97 then -					hsync <= '0'; -				end if; - -				vsync <= '1'; -				if vcount < 3 then -					vsync <= '0'; -				end if; - -				-- sync pulse time -				hcount <= hcount + 1; - -				if hcount = 800 then -					vcount <= vcount + 1; -					hcount <= (others => '0'); -				end if; - -				if vcount = 521 then -					vcount <= (others => '0'); -				end if; -			end if; - -			-- output colors -		RO <= rgb_out(11 downto 8); -		GO <= rgb_out(7 downto 4); -		BO <= rgb_out(3 downto 0); -		end if; -	end process; -end Behavioral; diff --git a/basys3/basys3.srcs/ppu_vga_native_tb.vhd b/basys3/basys3.srcs/ppu_vga_native_tb.vhd deleted file mode 100644 index 06061a0..0000000 --- a/basys3/basys3.srcs/ppu_vga_native_tb.vhd +++ /dev/null @@ -1,89 +0,0 @@ -library ieee; -library unisim; -use ieee.std_logic_1164.all; -use work.ppu_consts.all; -use ieee.numeric_std.all; -use ieee.std_logic_unsigned.all; -use unisim.vcomponents.all; - -entity ppu_vga_native_tb is -end ppu_vga_native_tb; - -architecture Behavioral of ppu_vga_native_tb is -	component ppu_vga_native port ( -		CLK : in std_logic; -- system clock -		RESET : in std_logic; - -		X : in std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x -		Y : in std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y -		PREADY : in std_logic; -- current pixel ready (pixel color is stable) -		RI,GI,BI : in std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- VGA color in - -		RO,GO,BO : out std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0); -- VGA color out -		VSYNC, HSYNC : out std_logic); -- VGA sync outputs -	end component; -	signal CLK : std_logic := '0'; -	signal RST : std_logic := '0'; -	signal PREADY : std_logic := '0'; - -	signal X : std_logic_vector(PPU_POS_H_WIDTH-1 downto 0) := (others => '0'); -	signal Y : std_logic_vector(PPU_POS_V_WIDTH-1 downto 0) := (others => '0'); - -	signal RI,GI,BI : std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0) := (others => '0'); -- VGA color in -	signal RO,GO,BO : std_logic_vector(PPU_COLOR_OUTPUT_DEPTH-1 downto 0) := (others => '0'); -- VGA color out -	signal VSYNC, HSYNC :  std_logic := '0'; - -	signal Xas : integer := 72; -	signal Yas : integer := 14; -	signal counter : std_logic_vector(1 downto 0) := (others => '0'); -begin -	uut : ppu_vga_native port map( -		CLK => CLK, -		RESET => RST, -		X => X, -		Y => Y, -		PREADY => PREADY, -		RI => RI, -		GI => GI, -		BI => BI, -		RO => RO, -		GO => GO, -		BO => BO, -		VSYNC => VSYNC, -		HSYNC => HSYNC -	); - -	tb : process -	begin -		CLK <= '1'; -		wait for 1 ps; -		CLK <= '0'; -		wait for 1 ps; -	end process; - -	process(CLK) -	begin -		if rising_edge(CLK) then -			counter <= counter + 1; -		end if; - -		if(counter = "11") then -			pready <= '1'; -			ri <= x"d"; -			gi <= x"a"; -			bi <= x"d"; -			x <= std_logic_vector(to_unsigned(Xas, x'length)); -			if (Xas = 391) then -				Xas <= 72; -				y <= std_logic_vector(to_unsigned(Yas, y'length)); -				if (Yas = 255) then -					Yas <= 14; -				else -					Yas <= Yas + 1; -				end if; -			else -				Xas <= Xas + 1; -			end if; -		end if; -	end process; -end Behavioral; diff --git a/basys3/basys3.srcs/ppu_vga_tiny.vhd b/basys3/basys3.srcs/ppu_vga_tiny.vhd deleted file mode 100644 index 0e496f6..0000000 --- a/basys3/basys3.srcs/ppu_vga_tiny.vhd +++ /dev/null @@ -1,73 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; -use work.ppu_consts.all; -use ieee.numeric_std.all; -use ieee.std_logic_unsigned.all; - -entity ppu_vga_tiny is port ( -	CLK : in std_logic; -- system clock -	RESET : in std_logic; - -	X : out std_logic_vector(PPU_POS_H_WIDTH-1 downto 0); -- current screen pixel x -	Y : out std_logic_vector(PPU_POS_V_WIDTH-1 downto 0); -- current screen pixel y - -	VSYNC, VBLANK, -	HSYNC, HBLANK : out std_logic); -- VGA sync outputs -end ppu_vga_tiny; - -architecture Behavioral of ppu_vga_tiny is -	signal hcount : std_logic_vector(PPU_POS_H_WIDTH-1 downto 0) := (others => '0'); -	signal vcount : std_logic_vector(PPU_POS_V_WIDTH-1 downto 0) := (others => '0'); -	signal clk_counter : std_logic_vector(4 downto 0) := (others => '0'); -begin -	process (CLK) -	begin -		if rising_edge(CLK) then -			clk_counter <= clk_counter + 1; -			if(clk_counter > 15) then -				clk_counter <= (others => '0'); -				-- x,y data out -				X <= hcount; -				Y <= vcount; - -				--pulse width -				if hcount < 32 or hcount >= 320-80 then -					hsync <= '0'; -				else -					hsync <= '1'; -				end if; - -				if vcount < 8 or vcount >= 240-15 then -					vsync <= '0'; -				else -					vsync <= '1'; -				end if; - -				-- Hblank and Vblank outputs -				if hcount >= 320-80 then -					hblank <= '1'; -				else -					hblank <= '0'; -				end if; - -				if vcount >= 240-15 then -					vblank <= '1'; -				else -					vblank <= '0'; -				end if; - -				-- sync pulse time -				hcount <= hcount + 1; - -				if hcount = 400 then -					vcount <= vcount + 1; -					hcount <= (others => '0'); -				end if; - -				if vcount = 255 then -					vcount <= (others => '0'); -				end if; -			end if; -		end if; -	end process; -end Behavioral; 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 e299ea1..9f293d6 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 @@ -13,12 +13,12 @@          "AXI_Slave_Type": [ { "value": "Memory_Slave", "resolve_type": "user", "usage": "all" } ],          "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": "Single_Port_RAM", "resolve_type": "user", "usage": "all" } ], -        "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "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" } ],          "Enable_32bit_Address": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "ecctype": [ { "value": "No_ECC", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], -        "softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "ecctype": [ { "value": "No_ECC", "resolve_type": "user", "usage": "all" } ], +        "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],          "EN_SLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],          "EN_DEEPSLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ],          "EN_SHUTDOWN_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], @@ -27,49 +27,49 @@          "RD_ADDR_CHNG_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ],          "Use_Error_Injection_Pins": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ],          "Error_Injection_Type": [ { "value": "Single_Bit_Error_Injection", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Use_Byte_Write_Enable": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Use_Byte_Write_Enable": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ],          "Byte_Size": [ { "value": "9", "resolve_type": "user", "enabled": false, "usage": "all" } ],          "Algorithm": [ { "value": "Minimum_Area", "resolve_type": "user", "usage": "all" } ],          "Primitive": [ { "value": "8kx2", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Assume_Synchronous_Clk": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Assume_Synchronous_Clk": [ { "value": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ],          "Write_Width_A": [ { "value": "15", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ],          "Write_Depth_A": [ { "value": "1200", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], -        "Read_Width_A": [ { "value": "15", "resolve_type": "user", "usage": "all" } ], -        "Operating_Mode_A": [ { "value": "WRITE_FIRST", "resolve_type": "user", "usage": "all" } ], +        "Read_Width_A": [ { "value": "15", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Operating_Mode_A": [ { "value": "NO_CHANGE", "resolve_type": "user", "usage": "all" } ],          "Enable_A": [ { "value": "Always_Enabled", "value_src": "user", "resolve_type": "user", "usage": "all" } ], -        "Write_Width_B": [ { "value": "15", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Read_Width_B": [ { "value": "15", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Operating_Mode_B": [ { "value": "WRITE_FIRST", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Enable_B": [ { "value": "Always_Enabled", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Register_PortA_Output_of_Memory_Primitives": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Register_PortA_Output_of_Memory_Core": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Use_REGCEA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Register_PortB_Output_of_Memory_Primitives": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], -        "Register_PortB_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], -        "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Write_Width_B": [ { "value": "15", "resolve_type": "user", "usage": "all" } ], +        "Read_Width_B": [ { "value": "15", "resolve_type": "user", "usage": "all" } ], +        "Operating_Mode_B": [ { "value": "READ_FIRST", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Enable_B": [ { "value": "Always_Enabled", "value_src": "user", "resolve_type": "user", "usage": "all" } ], +        "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_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "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": "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": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Reset_Memory_Latch_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Reset_Priority_A": [ { "value": "CE", "resolve_type": "user", "usage": "all" } ], -        "Output_Reset_Value_A": [ { "value": "0", "resolve_type": "user", "usage": "all" } ], -        "Use_RSTB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "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" } ], +        "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", "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" } ],          "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" } ],          "Port_A_Write_Rate": [ { "value": "50", "resolve_type": "user", "format": "long", "usage": "all" } ], -        "Port_B_Clock": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], -        "Port_B_Write_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Write_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ],          "Port_A_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], -        "Port_B_Enable_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ],          "Collision_Warnings": [ { "value": "ALL", "resolve_type": "user", "usage": "all" } ],          "Disable_Collision_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],          "Disable_Out_of_Range_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], @@ -92,16 +92,16 @@          "C_CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "generated", "usage": "all" } ],          "C_HAS_AXI_ID": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], -        "C_MEM_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MEM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_BYTE_SIZE": [ { "value": "9", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_ALGORITHM": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_PRIM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "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": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], -        "C_HAS_RSTA": [ { "value": "1", "resolve_type": "generated", "format": "long", "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" } ],          "C_RSTRAM_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_INITA_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], @@ -109,13 +109,13 @@          "C_HAS_REGCEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_USE_BYTE_WEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_WEA_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], -        "C_WRITE_MODE_A": [ { "value": "WRITE_FIRST", "resolve_type": "generated", "usage": "all" } ], +        "C_WRITE_MODE_A": [ { "value": "NO_CHANGE", "resolve_type": "generated", "usage": "all" } ],          "C_WRITE_WIDTH_A": [ { "value": "15", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_READ_WIDTH_A": [ { "value": "15", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "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": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_RSTB": [ { "value": "1", "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" } ], @@ -123,14 +123,14 @@          "C_HAS_REGCEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_USE_BYTE_WEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_WEB_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], -        "C_WRITE_MODE_B": [ { "value": "WRITE_FIRST", "resolve_type": "generated", "usage": "all" } ], +        "C_WRITE_MODE_B": [ { "value": "READ_FIRST", "resolve_type": "generated", "usage": "all" } ],          "C_WRITE_WIDTH_B": [ { "value": "15", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_READ_WIDTH_B": [ { "value": "15", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_WRITE_DEPTH_B": [ { "value": "1200", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "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": "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_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_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" } ], @@ -143,7 +143,7 @@          "C_READ_LATENCY_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_HAS_INJECTERR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_SIM_COLLISION_CHECK": [ { "value": "ALL", "resolve_type": "generated", "usage": "all" } ], -        "C_COMMON_CLK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_COMMON_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_DISABLE_WARN_BHV_COLL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_EN_SLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_USE_URAM": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], @@ -155,7 +155,7 @@          "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" } ], -        "C_EST_POWER_SUMMARY": [ { "value": "Estimated Power for IP     :     2.6537 mW", "resolve_type": "generated", "usage": "all" } ] +        "C_EST_POWER_SUMMARY": [ { "value": "Estimated Power for IP     :     4.9121 mW", "resolve_type": "generated", "usage": "all" } ]        },        "project_parameters": {          "ARCHITECTURE": [ { "value": "artix7" } ], @@ -186,12 +186,15 @@      "boundary": {        "ports": {          "clka": [ { "direction": "in", "driver_value": "0" } ], -        "rsta": [ { "direction": "in", "driver_value": "0" } ],          "wea": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ],          "addra": [ { "direction": "in", "size_left": "10", "size_right": "0", "driver_value": "0" } ],          "dina": [ { "direction": "in", "size_left": "14", "size_right": "0", "driver_value": "0" } ], -        "douta": [ { "direction": "out", "size_left": "14", "size_right": "0" } ], -        "rsta_busy": [ { "direction": "out" } ] +        "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" } ]        },        "interfaces": {          "CLK.ACLK": { @@ -234,10 +237,27 @@              "ADDR": [ { "physical_name": "addra" } ],              "CLK": [ { "physical_name": "clka" } ],              "DIN": [ { "physical_name": "dina" } ], -            "DOUT": [ { "physical_name": "douta" } ], -            "RST": [ { "physical_name": "rsta" } ],              "WE": [ { "physical_name": "wea" } ]            } +        }, +        "BRAM_PORTB": { +          "vlnv": "xilinx.com:interface:bram:1.0", +          "abstraction_type": "xilinx.com:interface:bram_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "MEM_SIZE": [ { "value": "8192", "resolve_type": "generated", "format": "long", "is_static_object": false } ], +            "MEM_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "is_static_object": false } ], +            "MEM_ECC": [ { "value": "NONE", "resolve_type": "generated", "is_static_object": false } ], +            "MASTER_TYPE": [ { "value": "OTHER", "resolve_type": "generated", "is_static_object": false } ], +            "READ_WRITE_MODE": [ { "value": "", "resolve_type": "generated", "is_static_object": false } ], +            "READ_LATENCY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_static_object": false } ] +          }, +          "port_maps": { +            "ADDR": [ { "physical_name": "addrb" } ], +            "CLK": [ { "physical_name": "clkb" } ], +            "DOUT": [ { "physical_name": "doutb" } ], +            "RST": [ { "physical_name": "rstb" } ] +          }          }        },        "memory_maps": { diff --git a/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_pixclk/ppu_dispctl_pixclk.xci b/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_pixclk/ppu_dispctl_pixclk.xci new file mode 100644 index 0000000..71185e4 --- /dev/null +++ b/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_pixclk/ppu_dispctl_pixclk.xci @@ -0,0 +1,690 @@ +{ +  "schema": "xilinx.com:schema:json_instance:1.0", +  "ip_inst": { +    "xci_name": "ppu_dispctl_pixclk", +    "component_reference": "xilinx.com:ip:clk_wiz:6.0", +    "ip_revision": "11", +    "gen_directory": "../../../../basys3.gen/sources_1/ip/ppu_dispctl_pixclk", +    "parameters": { +      "component_parameters": { +        "Component_Name": [ { "value": "ppu_dispctl_pixclk", "resolve_type": "user", "usage": "all" } ], +        "USER_CLK_FREQ0": [ { "value": "100.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "USER_CLK_FREQ1": [ { "value": "100.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "USER_CLK_FREQ2": [ { "value": "100.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "USER_CLK_FREQ3": [ { "value": "100.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "ENABLE_CLOCK_MONITOR": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "OPTIMIZE_CLOCKING_STRUCTURE_EN": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "ENABLE_USER_CLOCK0": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "ENABLE_USER_CLOCK1": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "ENABLE_USER_CLOCK2": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "ENABLE_USER_CLOCK3": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Enable_PLL0": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Enable_PLL1": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "REF_CLK_FREQ": [ { "value": "100.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PRECISION": [ { "value": "1", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PRIMITIVE": [ { "value": "MMCM", "resolve_type": "user", "usage": "all" } ], +        "PRIMTYPE_SEL": [ { "value": "mmcm_adv", "resolve_type": "user", "usage": "all" } ], +        "CLOCK_MGR_TYPE": [ { "value": "auto", "resolve_type": "user", "usage": "all" } ], +        "USE_FREQ_SYNTH": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_SPREAD_SPECTRUM": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_PHASE_ALIGNMENT": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_MIN_POWER": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_DYN_PHASE_SHIFT": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_DYN_RECONFIG": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "JITTER_SEL": [ { "value": "No_Jitter", "resolve_type": "user", "usage": "all" } ], +        "PRIM_IN_FREQ": [ { "value": "100.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PRIM_IN_TIMEPERIOD": [ { "value": "10.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "IN_FREQ_UNITS": [ { "value": "Units_MHz", "resolve_type": "user", "usage": "all" } ], +        "PHASESHIFT_MODE": [ { "value": "WAVEFORM", "resolve_type": "user", "usage": "all" } ], +        "IN_JITTER_UNITS": [ { "value": "Units_UI", "resolve_type": "user", "usage": "all" } ], +        "RELATIVE_INCLK": [ { "value": "REL_PRIMARY", "resolve_type": "user", "usage": "all" } ], +        "USE_INCLK_SWITCHOVER": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "SECONDARY_IN_FREQ": [ { "value": "100.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "SECONDARY_IN_TIMEPERIOD": [ { "value": "10.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "SECONDARY_PORT": [ { "value": "clk_in2", "resolve_type": "user", "usage": "all" } ], +        "SECONDARY_SOURCE": [ { "value": "Single_ended_clock_capable_pin", "resolve_type": "user", "usage": "all" } ], +        "JITTER_OPTIONS": [ { "value": "UI", "resolve_type": "user", "usage": "all" } ], +        "CLKIN1_UI_JITTER": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKIN2_UI_JITTER": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PRIM_IN_JITTER": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "SECONDARY_IN_JITTER": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKIN1_JITTER_PS": [ { "value": "100.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKIN2_JITTER_PS": [ { "value": "100.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT1_USED": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT2_USED": [ { "value": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT3_USED": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT4_USED": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT5_USED": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT6_USED": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT7_USED": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "NUM_OUT_CLKS": [ { "value": "2", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "CLK_OUT1_USE_FINE_PS_GUI": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLK_OUT2_USE_FINE_PS_GUI": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLK_OUT3_USE_FINE_PS_GUI": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLK_OUT4_USE_FINE_PS_GUI": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLK_OUT5_USE_FINE_PS_GUI": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLK_OUT6_USE_FINE_PS_GUI": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLK_OUT7_USE_FINE_PS_GUI": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "PRIMARY_PORT": [ { "value": "clk_in1", "resolve_type": "user", "usage": "all" } ], +        "CLK_OUT1_PORT": [ { "value": "clk_out1", "resolve_type": "user", "usage": "all" } ], +        "CLK_OUT2_PORT": [ { "value": "clk_out2", "resolve_type": "user", "usage": "all" } ], +        "CLK_OUT3_PORT": [ { "value": "clk_out3", "resolve_type": "user", "usage": "all" } ], +        "CLK_OUT4_PORT": [ { "value": "clk_out4", "resolve_type": "user", "usage": "all" } ], +        "CLK_OUT5_PORT": [ { "value": "clk_out5", "resolve_type": "user", "usage": "all" } ], +        "CLK_OUT6_PORT": [ { "value": "clk_out6", "resolve_type": "user", "usage": "all" } ], +        "CLK_OUT7_PORT": [ { "value": "clk_out7", "resolve_type": "user", "usage": "all" } ], +        "DADDR_PORT": [ { "value": "daddr", "resolve_type": "user", "usage": "all" } ], +        "DCLK_PORT": [ { "value": "dclk", "resolve_type": "user", "usage": "all" } ], +        "DRDY_PORT": [ { "value": "drdy", "resolve_type": "user", "usage": "all" } ], +        "DWE_PORT": [ { "value": "dwe", "resolve_type": "user", "usage": "all" } ], +        "DIN_PORT": [ { "value": "din", "resolve_type": "user", "usage": "all" } ], +        "DOUT_PORT": [ { "value": "dout", "resolve_type": "user", "usage": "all" } ], +        "DEN_PORT": [ { "value": "den", "resolve_type": "user", "usage": "all" } ], +        "PSCLK_PORT": [ { "value": "psclk", "resolve_type": "user", "usage": "all" } ], +        "PSEN_PORT": [ { "value": "psen", "resolve_type": "user", "usage": "all" } ], +        "PSINCDEC_PORT": [ { "value": "psincdec", "resolve_type": "user", "usage": "all" } ], +        "PSDONE_PORT": [ { "value": "psdone", "resolve_type": "user", "usage": "all" } ], +        "CLKOUT1_REQUESTED_OUT_FREQ": [ { "value": "25.0", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT1_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT1_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT2_REQUESTED_OUT_FREQ": [ { "value": "6.25", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT2_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT2_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT3_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT3_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT3_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT4_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT4_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT4_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT5_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT5_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT5_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT6_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT6_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT6_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT7_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT7_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT7_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "USE_MAX_I_JITTER": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_MIN_O_JITTER": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT1_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT2_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT3_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT4_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT5_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT6_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT7_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "PRIM_SOURCE": [ { "value": "Single_ended_clock_capable_pin", "resolve_type": "user", "usage": "all" } ], +        "CLKOUT1_DRIVES": [ { "value": "BUFG", "resolve_type": "user", "usage": "all" } ], +        "CLKOUT2_DRIVES": [ { "value": "BUFG", "resolve_type": "user", "usage": "all" } ], +        "CLKOUT3_DRIVES": [ { "value": "BUFG", "resolve_type": "user", "usage": "all" } ], +        "CLKOUT4_DRIVES": [ { "value": "BUFG", "resolve_type": "user", "usage": "all" } ], +        "CLKOUT5_DRIVES": [ { "value": "BUFG", "resolve_type": "user", "usage": "all" } ], +        "CLKOUT6_DRIVES": [ { "value": "BUFG", "resolve_type": "user", "usage": "all" } ], +        "CLKOUT7_DRIVES": [ { "value": "BUFG", "resolve_type": "user", "usage": "all" } ], +        "FEEDBACK_SOURCE": [ { "value": "FDBK_AUTO", "resolve_type": "user", "usage": "all" } ], +        "CLKFB_IN_SIGNALING": [ { "value": "SINGLE", "resolve_type": "user", "usage": "all" } ], +        "CLKFB_IN_PORT": [ { "value": "clkfb_in", "resolve_type": "user", "usage": "all" } ], +        "CLKFB_IN_P_PORT": [ { "value": "clkfb_in_p", "resolve_type": "user", "usage": "all" } ], +        "CLKFB_IN_N_PORT": [ { "value": "clkfb_in_n", "resolve_type": "user", "usage": "all" } ], +        "CLKFB_OUT_PORT": [ { "value": "clkfb_out", "resolve_type": "user", "usage": "all" } ], +        "CLKFB_OUT_P_PORT": [ { "value": "clkfb_out_p", "resolve_type": "user", "usage": "all" } ], +        "CLKFB_OUT_N_PORT": [ { "value": "clkfb_out_n", "resolve_type": "user", "usage": "all" } ], +        "PLATFORM": [ { "value": "UNKNOWN", "resolve_type": "user", "usage": "all" } ], +        "SUMMARY_STRINGS": [ { "value": "empty", "resolve_type": "user", "usage": "all" } ], +        "USE_LOCKED": [ { "value": "false", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CALC_DONE": [ { "value": "empty", "resolve_type": "user", "usage": "all" } ], +        "USE_RESET": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_POWER_DOWN": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_STATUS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_FREEZE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_CLK_VALID": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_INCLK_STOPPED": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_CLKFB_STOPPED": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "RESET_PORT": [ { "value": "reset", "resolve_type": "user", "usage": "all" } ], +        "LOCKED_PORT": [ { "value": "locked", "resolve_type": "user", "usage": "all" } ], +        "POWER_DOWN_PORT": [ { "value": "power_down", "resolve_type": "user", "usage": "all" } ], +        "CLK_VALID_PORT": [ { "value": "CLK_VALID", "resolve_type": "user", "usage": "all" } ], +        "STATUS_PORT": [ { "value": "STATUS", "resolve_type": "user", "usage": "all" } ], +        "CLK_IN_SEL_PORT": [ { "value": "clk_in_sel", "resolve_type": "user", "usage": "all" } ], +        "INPUT_CLK_STOPPED_PORT": [ { "value": "input_clk_stopped", "resolve_type": "user", "usage": "all" } ], +        "CLKFB_STOPPED_PORT": [ { "value": "clkfb_stopped", "resolve_type": "user", "usage": "all" } ], +        "SS_MODE": [ { "value": "CENTER_HIGH", "resolve_type": "user", "usage": "all" } ], +        "SS_MOD_FREQ": [ { "value": "250", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "SS_MOD_TIME": [ { "value": "0.004", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "OVERRIDE_MMCM": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_NOTES": [ { "value": "None", "resolve_type": "user", "usage": "all" } ], +        "MMCM_DIVCLK_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "MMCM_BANDWIDTH": [ { "value": "OPTIMIZED", "resolve_type": "user", "usage": "all" } ], +        "MMCM_CLKFBOUT_MULT_F": [ { "value": "8.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKFBOUT_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKFBOUT_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_CLKIN1_PERIOD": [ { "value": "10.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKIN2_PERIOD": [ { "value": "10.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT4_CASCADE": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_CLOCK_HOLD": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_COMPENSATION": [ { "value": "ZHOLD", "resolve_type": "user", "usage": "all" } ], +        "MMCM_REF_JITTER1": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_REF_JITTER2": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_STARTUP_WAIT": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_CLKOUT0_DIVIDE_F": [ { "value": "32.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT0_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT0_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT0_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_CLKOUT1_DIVIDE": [ { "value": "128", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "MMCM_CLKOUT1_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT1_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT1_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_CLKOUT2_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "MMCM_CLKOUT2_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT2_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT2_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_CLKOUT3_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "MMCM_CLKOUT3_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT3_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT3_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_CLKOUT4_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "MMCM_CLKOUT4_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT4_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT4_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_CLKOUT5_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "MMCM_CLKOUT5_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT5_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT5_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "MMCM_CLKOUT6_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "MMCM_CLKOUT6_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT6_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "MMCM_CLKOUT6_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "OVERRIDE_PLL": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "PLL_NOTES": [ { "value": "None", "resolve_type": "user", "usage": "all" } ], +        "PLL_BANDWIDTH": [ { "value": "OPTIMIZED", "resolve_type": "user", "usage": "all" } ], +        "PLL_CLKFBOUT_MULT": [ { "value": "4", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "PLL_CLKFBOUT_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLK_FEEDBACK": [ { "value": "CLKFBOUT", "resolve_type": "user", "usage": "all" } ], +        "PLL_DIVCLK_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "PLL_CLKIN_PERIOD": [ { "value": "10.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_COMPENSATION": [ { "value": "SYSTEM_SYNCHRONOUS", "resolve_type": "user", "usage": "all" } ], +        "PLL_REF_JITTER": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT0_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "PLL_CLKOUT0_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT0_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT1_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "PLL_CLKOUT1_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT1_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT2_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "PLL_CLKOUT2_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT2_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT3_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "PLL_CLKOUT3_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT3_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT4_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "PLL_CLKOUT4_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT4_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT5_DIVIDE": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "PLL_CLKOUT5_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "PLL_CLKOUT5_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "RESET_TYPE": [ { "value": "ACTIVE_HIGH", "resolve_type": "user", "usage": "all" } ], +        "USE_SAFE_CLOCK_STARTUP": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "USE_CLOCK_SEQUENCING": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUT1_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "CLKOUT2_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "CLKOUT3_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "CLKOUT4_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "CLKOUT5_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "CLKOUT6_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "CLKOUT7_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "USE_BOARD_FLOW": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLK_IN1_BOARD_INTERFACE": [ { "value": "sys_clock", "value_src": "user", "resolve_type": "user", "usage": "all" } ], +        "CLK_IN2_BOARD_INTERFACE": [ { "value": "Custom", "resolve_type": "user", "usage": "all" } ], +        "DIFF_CLK_IN1_BOARD_INTERFACE": [ { "value": "Custom", "resolve_type": "user", "usage": "all" } ], +        "DIFF_CLK_IN2_BOARD_INTERFACE": [ { "value": "Custom", "resolve_type": "user", "usage": "all" } ], +        "AUTO_PRIMITIVE": [ { "value": "MMCM", "resolve_type": "user", "usage": "all" } ], +        "RESET_BOARD_INTERFACE": [ { "value": "Custom", "resolve_type": "user", "usage": "all" } ], +        "ENABLE_CDDC": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CDDCDONE_PORT": [ { "value": "cddcdone", "resolve_type": "user", "usage": "all" } ], +        "CDDCREQ_PORT": [ { "value": "cddcreq", "resolve_type": "user", "usage": "all" } ], +        "ENABLE_CLKOUTPHY": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "CLKOUTPHY_REQUESTED_FREQ": [ { "value": "600.000", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT1_JITTER": [ { "value": "191.696", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT1_PHASE_ERROR": [ { "value": "114.212", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT2_JITTER": [ { "value": "251.196", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT2_PHASE_ERROR": [ { "value": "114.212", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT3_JITTER": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT3_PHASE_ERROR": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT4_JITTER": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT4_PHASE_ERROR": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT5_JITTER": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT5_PHASE_ERROR": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT6_JITTER": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT6_PHASE_ERROR": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT7_JITTER": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "CLKOUT7_PHASE_ERROR": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ], +        "INPUT_MODE": [ { "value": "frequency", "resolve_type": "user", "usage": "all" } ], +        "INTERFACE_SELECTION": [ { "value": "Enable_AXI", "resolve_type": "user", "usage": "all" } ], +        "AXI_DRP": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "PHASE_DUTY_CONFIG": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ] +      }, +      "model_parameters": { +        "C_CLKOUT2_USED": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USER_CLK_FREQ0": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_AUTO_PRIMITIVE": [ { "value": "MMCM", "resolve_type": "generated", "usage": "all" } ], +        "C_USER_CLK_FREQ1": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_USER_CLK_FREQ2": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_USER_CLK_FREQ3": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_ENABLE_CLOCK_MONITOR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ENABLE_USER_CLOCK0": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ENABLE_USER_CLOCK1": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ENABLE_USER_CLOCK2": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ENABLE_USER_CLOCK3": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_Enable_PLL0": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_Enable_PLL1": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_REF_CLK_FREQ": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PRECISION": [ { "value": "1", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT3_USED": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT4_USED": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT5_USED": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT6_USED": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT7_USED": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_CLKOUT1_BAR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_CLKOUT2_BAR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_CLKOUT3_BAR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_CLKOUT4_BAR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "c_component_name": [ { "value": "ppu_dispctl_pixclk", "resolve_type": "generated", "usage": "all" } ], +        "C_PLATFORM": [ { "value": "UNKNOWN", "resolve_type": "generated", "usage": "all" } ], +        "C_USE_FREQ_SYNTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_PHASE_ALIGNMENT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PRIM_IN_JITTER": [ { "value": "0.010", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_SECONDARY_IN_JITTER": [ { "value": "0.010", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_JITTER_SEL": [ { "value": "No_Jitter", "resolve_type": "generated", "usage": "all" } ], +        "C_USE_MIN_POWER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_MIN_O_JITTER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_MAX_I_JITTER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_DYN_PHASE_SHIFT": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_OPTIMIZE_CLOCKING_STRUCTURE_EN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_INCLK_SWITCHOVER": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_DYN_RECONFIG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_SPREAD_SPECTRUM": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_FAST_SIMULATION": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PRIMTYPE_SEL": [ { "value": "AUTO", "resolve_type": "generated", "usage": "all" } ], +        "C_USE_CLK_VALID": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PRIM_IN_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PRIM_IN_TIMEPERIOD": [ { "value": "10.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_IN_FREQ_UNITS": [ { "value": "Units_MHz", "resolve_type": "generated", "usage": "all" } ], +        "C_SECONDARY_IN_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_SECONDARY_IN_TIMEPERIOD": [ { "value": "10.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_FEEDBACK_SOURCE": [ { "value": "FDBK_AUTO", "resolve_type": "generated", "usage": "all" } ], +        "C_PRIM_SOURCE": [ { "value": "Single_ended_clock_capable_pin", "resolve_type": "generated", "usage": "all" } ], +        "C_PHASESHIFT_MODE": [ { "value": "WAVEFORM", "resolve_type": "generated", "usage": "all" } ], +        "C_SECONDARY_SOURCE": [ { "value": "Single_ended_clock_capable_pin", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFB_IN_SIGNALING": [ { "value": "SINGLE", "resolve_type": "generated", "usage": "all" } ], +        "C_USE_RESET": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_RESET_LOW": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_LOCKED": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_INCLK_STOPPED": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_CLKFB_STOPPED": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_POWER_DOWN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_STATUS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_FREEZE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_NUM_OUT_CLKS": [ { "value": "2", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT1_DRIVES": [ { "value": "BUFG", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT2_DRIVES": [ { "value": "BUFG", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT3_DRIVES": [ { "value": "BUFG", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT4_DRIVES": [ { "value": "BUFG", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT5_DRIVES": [ { "value": "BUFG", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT6_DRIVES": [ { "value": "BUFG", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT7_DRIVES": [ { "value": "BUFG", "resolve_type": "generated", "usage": "all" } ], +        "C_INCLK_SUM_ROW0": [ { "value": "Input Clock   Freq (MHz)    Input Jitter (UI)", "resolve_type": "generated", "usage": "all" } ], +        "C_INCLK_SUM_ROW1": [ { "value": "__primary_________100.000____________0.010", "resolve_type": "generated", "usage": "all" } ], +        "C_INCLK_SUM_ROW2": [ { "value": "no_secondary_input_clock ", "resolve_type": "generated", "usage": "all" } ], +        "C_OUTCLK_SUM_ROW0A": [ { "value": " Output     Output      Phase    Duty Cycle   Pk-to-Pk     Phase", "resolve_type": "generated", "usage": "all" } ], +        "C_OUTCLK_SUM_ROW0B": [ { "value": "  Clock     Freq (MHz)  (degrees)    (%)     Jitter (ps)  Error (ps)", "resolve_type": "generated", "usage": "all" } ], +        "C_OUTCLK_SUM_ROW1": [ { "value": "clk_out1__25.00000______0.000______50.0______191.696____114.212", "resolve_type": "generated", "usage": "all" } ], +        "C_OUTCLK_SUM_ROW2": [ { "value": "clk_out2___6.25000______0.000______50.0______251.196____114.212", "resolve_type": "generated", "usage": "all" } ], +        "C_OUTCLK_SUM_ROW3": [ { "value": "no_CLK_OUT3_output", "resolve_type": "generated", "usage": "all" } ], +        "C_OUTCLK_SUM_ROW4": [ { "value": "no_CLK_OUT4_output", "resolve_type": "generated", "usage": "all" } ], +        "C_OUTCLK_SUM_ROW5": [ { "value": "no_CLK_OUT5_output", "resolve_type": "generated", "usage": "all" } ], +        "C_OUTCLK_SUM_ROW6": [ { "value": "no_CLK_OUT6_output", "resolve_type": "generated", "usage": "all" } ], +        "C_OUTCLK_SUM_ROW7": [ { "value": "no_CLK_OUT7_output", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT1_REQUESTED_OUT_FREQ": [ { "value": "25.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT2_REQUESTED_OUT_FREQ": [ { "value": "6.25", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT3_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT4_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT5_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT6_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT7_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT1_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT2_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT3_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT4_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT5_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT6_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT7_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT1_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT2_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT3_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT4_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT5_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT6_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT7_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT1_OUT_FREQ": [ { "value": "25.00000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT2_OUT_FREQ": [ { "value": "6.25000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT3_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT4_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT5_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT6_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT7_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT1_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT2_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT3_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT4_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT5_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT6_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT7_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT1_DUTY_CYCLE": [ { "value": "50.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT2_DUTY_CYCLE": [ { "value": "50.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT3_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT4_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT5_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT6_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKOUT7_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_USE_SAFE_CLOCK_STARTUP": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_CLOCK_SEQUENCING": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT1_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT2_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT3_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT4_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT5_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT6_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CLKOUT7_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MMCM_NOTES": [ { "value": "None", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_BANDWIDTH": [ { "value": "OPTIMIZED", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_CLKFBOUT_MULT_F": [ { "value": "8.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKIN1_PERIOD": [ { "value": "10.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKIN2_PERIOD": [ { "value": "10.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT4_CASCADE": [ { "value": "FALSE", "resolve_type": "generated", "format": "bool", "usage": "all" } ], +        "C_MMCM_CLOCK_HOLD": [ { "value": "FALSE", "resolve_type": "generated", "format": "bool", "usage": "all" } ], +        "C_MMCM_COMPENSATION": [ { "value": "ZHOLD", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_DIVCLK_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MMCM_REF_JITTER1": [ { "value": "0.010", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_REF_JITTER2": [ { "value": "0.010", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_STARTUP_WAIT": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_CLKOUT0_DIVIDE_F": [ { "value": "32.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT1_DIVIDE": [ { "value": "128", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MMCM_CLKOUT2_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MMCM_CLKOUT3_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MMCM_CLKOUT4_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MMCM_CLKOUT5_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MMCM_CLKOUT6_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MMCM_CLKOUT0_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT1_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT2_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT3_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT4_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT5_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT6_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKFBOUT_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT0_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT1_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT2_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT3_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT4_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT5_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKOUT6_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_MMCM_CLKFBOUT_USE_FINE_PS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_CLKOUT0_USE_FINE_PS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_CLKOUT1_USE_FINE_PS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_CLKOUT2_USE_FINE_PS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_CLKOUT3_USE_FINE_PS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_CLKOUT4_USE_FINE_PS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_CLKOUT5_USE_FINE_PS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCM_CLKOUT6_USE_FINE_PS": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ], +        "C_PLL_NOTES": [ { "value": "No notes", "resolve_type": "generated", "usage": "all" } ], +        "C_PLL_BANDWIDTH": [ { "value": "OPTIMIZED", "resolve_type": "generated", "usage": "all" } ], +        "C_PLL_CLK_FEEDBACK": [ { "value": "CLKFBOUT", "resolve_type": "generated", "usage": "all" } ], +        "C_PLL_CLKFBOUT_MULT": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PLL_CLKIN_PERIOD": [ { "value": "1.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_COMPENSATION": [ { "value": "SYSTEM_SYNCHRONOUS", "resolve_type": "generated", "usage": "all" } ], +        "C_PLL_DIVCLK_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PLL_REF_JITTER": [ { "value": "0.010", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT0_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PLL_CLKOUT1_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PLL_CLKOUT2_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PLL_CLKOUT3_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PLL_CLKOUT4_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PLL_CLKOUT5_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PLL_CLKOUT0_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT1_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT2_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT3_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT4_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT5_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKFBOUT_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT0_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT1_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT2_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT3_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT4_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PLL_CLKOUT5_PHASE": [ { "value": "0.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLOCK_MGR_TYPE": [ { "value": "NA", "resolve_type": "generated", "usage": "all" } ], +        "C_OVERRIDE_MMCM": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_OVERRIDE_PLL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PRIMARY_PORT": [ { "value": "clk_in1", "resolve_type": "generated", "usage": "all" } ], +        "C_SECONDARY_PORT": [ { "value": "clk_in2", "resolve_type": "generated", "usage": "all" } ], +        "C_CLK_OUT1_PORT": [ { "value": "clk_out1", "resolve_type": "generated", "usage": "all" } ], +        "C_CLK_OUT2_PORT": [ { "value": "clk_out2", "resolve_type": "generated", "usage": "all" } ], +        "C_CLK_OUT3_PORT": [ { "value": "clk_out3", "resolve_type": "generated", "usage": "all" } ], +        "C_CLK_OUT4_PORT": [ { "value": "clk_out4", "resolve_type": "generated", "usage": "all" } ], +        "C_CLK_OUT5_PORT": [ { "value": "clk_out5", "resolve_type": "generated", "usage": "all" } ], +        "C_CLK_OUT6_PORT": [ { "value": "clk_out6", "resolve_type": "generated", "usage": "all" } ], +        "C_CLK_OUT7_PORT": [ { "value": "clk_out7", "resolve_type": "generated", "usage": "all" } ], +        "C_RESET_PORT": [ { "value": "reset", "resolve_type": "generated", "usage": "all" } ], +        "C_LOCKED_PORT": [ { "value": "locked", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFB_IN_PORT": [ { "value": "clkfb_in", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFB_IN_P_PORT": [ { "value": "clkfb_in_p", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFB_IN_N_PORT": [ { "value": "clkfb_in_n", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFB_OUT_PORT": [ { "value": "clkfb_out", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFB_OUT_P_PORT": [ { "value": "clkfb_out_p", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFB_OUT_N_PORT": [ { "value": "clkfb_out_n", "resolve_type": "generated", "usage": "all" } ], +        "C_POWER_DOWN_PORT": [ { "value": "power_down", "resolve_type": "generated", "usage": "all" } ], +        "C_DADDR_PORT": [ { "value": "daddr", "resolve_type": "generated", "usage": "all" } ], +        "C_DCLK_PORT": [ { "value": "dclk", "resolve_type": "generated", "usage": "all" } ], +        "C_DRDY_PORT": [ { "value": "drdy", "resolve_type": "generated", "usage": "all" } ], +        "C_DWE_PORT": [ { "value": "dwe", "resolve_type": "generated", "usage": "all" } ], +        "C_DIN_PORT": [ { "value": "din", "resolve_type": "generated", "usage": "all" } ], +        "C_DOUT_PORT": [ { "value": "dout", "resolve_type": "generated", "usage": "all" } ], +        "C_DEN_PORT": [ { "value": "den", "resolve_type": "generated", "usage": "all" } ], +        "C_PSCLK_PORT": [ { "value": "psclk", "resolve_type": "generated", "usage": "all" } ], +        "C_PSEN_PORT": [ { "value": "psen", "resolve_type": "generated", "usage": "all" } ], +        "C_PSINCDEC_PORT": [ { "value": "psincdec", "resolve_type": "generated", "usage": "all" } ], +        "C_PSDONE_PORT": [ { "value": "psdone", "resolve_type": "generated", "usage": "all" } ], +        "C_CLK_VALID_PORT": [ { "value": "CLK_VALID", "resolve_type": "generated", "usage": "all" } ], +        "C_STATUS_PORT": [ { "value": "STATUS", "resolve_type": "generated", "usage": "all" } ], +        "C_CLK_IN_SEL_PORT": [ { "value": "clk_in_sel", "resolve_type": "generated", "usage": "all" } ], +        "C_INPUT_CLK_STOPPED_PORT": [ { "value": "input_clk_stopped", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFB_STOPPED_PORT": [ { "value": "clkfb_stopped", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKIN1_JITTER_PS": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_CLKIN2_JITTER_PS": [ { "value": "100.0", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_PRIMITIVE": [ { "value": "MMCM", "resolve_type": "generated", "usage": "all" } ], +        "C_SS_MODE": [ { "value": "CENTER_HIGH", "resolve_type": "generated", "usage": "all" } ], +        "C_SS_MOD_PERIOD": [ { "value": "4000", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_SS_MOD_TIME": [ { "value": "0.004", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_HAS_CDDC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CDDCDONE_PORT": [ { "value": "cddcdone", "resolve_type": "generated", "usage": "all" } ], +        "C_CDDCREQ_PORT": [ { "value": "cddcreq", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUTPHY_MODE": [ { "value": "VCO", "resolve_type": "generated", "usage": "all" } ], +        "C_ENABLE_CLKOUTPHY": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_INTERFACE_SELECTION": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_S_AXI_ADDR_WIDTH": [ { "value": "11", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_S_AXI_DATA_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_POWER_REG": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT0_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT0_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT1_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT1_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT2_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT2_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT3_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT3_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT4_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT4_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT5_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT5_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT6_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT6_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFBOUT_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKFBOUT_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_DIVCLK": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_LOCK_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_LOCK_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_LOCK_3": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_FILTER_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_FILTER_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ], +        "C_DIVIDE1_AUTO": [ { "value": "1", "resolve_type": "generated", "usage": "all" } ], +        "C_DIVIDE2_AUTO": [ { "value": "4.0", "resolve_type": "generated", "usage": "all" } ], +        "C_DIVIDE3_AUTO": [ { "value": "0.03125", "resolve_type": "generated", "usage": "all" } ], +        "C_DIVIDE4_AUTO": [ { "value": "0.03125", "resolve_type": "generated", "usage": "all" } ], +        "C_DIVIDE5_AUTO": [ { "value": "0.03125", "resolve_type": "generated", "usage": "all" } ], +        "C_DIVIDE6_AUTO": [ { "value": "0.03125", "resolve_type": "generated", "usage": "all" } ], +        "C_DIVIDE7_AUTO": [ { "value": "0.03125", "resolve_type": "generated", "usage": "all" } ], +        "C_PLLBUFGCEDIV": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCMBUFGCEDIV": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_PLLBUFGCEDIV1": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_PLLBUFGCEDIV2": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_PLLBUFGCEDIV3": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_PLLBUFGCEDIV4": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCMBUFGCEDIV1": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCMBUFGCEDIV2": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCMBUFGCEDIV3": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCMBUFGCEDIV4": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCMBUFGCEDIV5": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCMBUFGCEDIV6": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_MMCMBUFGCEDIV7": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT1_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT2_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT3_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT4_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT5_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT6_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT7_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT0_ACTUAL_FREQ": [ { "value": "25.00000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT1_ACTUAL_FREQ": [ { "value": "6.25000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT2_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT3_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT4_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT5_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ], +        "C_CLKOUT6_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ], +        "C_M_MAX": [ { "value": "64.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_M_MIN": [ { "value": "2.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_D_MAX": [ { "value": "80.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_D_MIN": [ { "value": "1.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_O_MAX": [ { "value": "128.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_O_MIN": [ { "value": "1.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_VCO_MIN": [ { "value": "600.000", "resolve_type": "generated", "format": "float", "usage": "all" } ], +        "C_VCO_MAX": [ { "value": "1200.000", "resolve_type": "generated", "format": "float", "usage": "all" } ] +      }, +      "project_parameters": { +        "ARCHITECTURE": [ { "value": "artix7" } ], +        "BASE_BOARD_PART": [ { "value": "digilentinc.com:basys3:part0:1.2" } ], +        "BOARD_CONNECTIONS": [ { "value": "" } ], +        "DEVICE": [ { "value": "xc7a35t" } ], +        "PACKAGE": [ { "value": "cpg236" } ], +        "PREFHDL": [ { "value": "VHDL" } ], +        "SILICON_REVISION": [ { "value": "" } ], +        "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], +        "SPEEDGRADE": [ { "value": "-1" } ], +        "STATIC_POWER": [ { "value": "" } ], +        "TEMPERATURE_GRADE": [ { "value": "" } ], +        "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], +        "USE_RDI_GENERATION": [ { "value": "TRUE" } ] +      }, +      "runtime_parameters": { +        "IPCONTEXT": [ { "value": "IP_Flow" } ], +        "IPREVISION": [ { "value": "11" } ], +        "MANAGED": [ { "value": "TRUE" } ], +        "OUTPUTDIR": [ { "value": "../../../../basys3.gen/sources_1/ip/ppu_dispctl_pixclk" } ], +        "SELECTEDSIMMODEL": [ { "value": "" } ], +        "SHAREDDIR": [ { "value": "." } ], +        "SWVERSION": [ { "value": "2022.2" } ], +        "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] +      } +    }, +    "boundary": { +      "ports": { +        "reset": [ { "direction": "in", "driver_value": "0" } ], +        "clk_in1": [ { "direction": "in" } ], +        "clk_out1": [ { "direction": "out" } ], +        "clk_out2": [ { "direction": "out" } ] +      }, +      "interfaces": { +        "reset": { +          "vlnv": "xilinx.com:signal:reset:1.0", +          "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "POLARITY": [ { "value": "ACTIVE_HIGH", "value_src": "constant", "usage": "all" } ], +            "BOARD.ASSOCIATED_PARAM": [ { "value": "RESET_BOARD_INTERFACE", "value_src": "constant", "usage": "all" } ], +            "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] +          }, +          "port_maps": { +            "RST": [ { "physical_name": "reset" } ] +          } +        }, +        "clock_CLK_IN1": { +          "vlnv": "xilinx.com:signal:clock:1.0", +          "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], +            "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ], +            "BOARD.ASSOCIATED_PARAM": [ { "value": "CLK_IN1_BOARD_INTERFACE", "usage": "all", "is_static_object": false } ] +          }, +          "port_maps": { +            "CLK_IN1": [ { "physical_name": "clk_in1" } ] +          } +        }, +        "clock_CLK_OUT1": { +          "vlnv": "xilinx.com:signal:clock:1.0", +          "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", +          "mode": "master", +          "parameters": { +            "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], +            "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] +          }, +          "port_maps": { +            "CLK_OUT1": [ { "physical_name": "clk_out1" } ] +          } +        }, +        "clock_CLK_OUT2": { +          "vlnv": "xilinx.com:signal:clock:1.0", +          "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", +          "mode": "master", +          "parameters": { +            "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], +            "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_BUSIF": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_RESET": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] +          }, +          "port_maps": { +            "CLK_OUT2": [ { "physical_name": "clk_out2" } ] +          } +        } +      } +    } +  } +}
\ No newline at end of file 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 new file mode 100644 index 0000000..4677e6b --- /dev/null +++ b/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_slbuf/ppu_dispctl_slbuf.xci @@ -0,0 +1,281 @@ +{ +  "schema": "xilinx.com:schema:json_instance:1.0", +  "ip_inst": { +    "xci_name": "ppu_dispctl_slbuf", +    "component_reference": "xilinx.com:ip:blk_mem_gen:8.4", +    "ip_revision": "5", +    "gen_directory": "../../../../basys3.gen/sources_1/ip/ppu_dispctl_slbuf", +    "parameters": { +      "component_parameters": { +        "Component_Name": [ { "value": "ppu_dispctl_slbuf", "resolve_type": "user", "usage": "all" } ], +        "Interface_Type": [ { "value": "Native", "resolve_type": "user", "usage": "all" } ], +        "AXI_Type": [ { "value": "AXI4_Full", "resolve_type": "user", "usage": "all" } ], +        "AXI_Slave_Type": [ { "value": "Memory_Slave", "resolve_type": "user", "usage": "all" } ], +        "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" } ], +        "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" } ], +        "softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "EN_SLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "EN_DEEPSLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "EN_SHUTDOWN_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "EN_ECC_PIPE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "RD_ADDR_CHNG_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "RD_ADDR_CHNG_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Use_Error_Injection_Pins": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Error_Injection_Type": [ { "value": "Single_Bit_Error_Injection", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Use_Byte_Write_Enable": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Byte_Size": [ { "value": "9", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Algorithm": [ { "value": "Minimum_Area", "resolve_type": "user", "usage": "all" } ], +        "Primitive": [ { "value": "8kx2", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Assume_Synchronous_Clk": [ { "value": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Write_Width_A": [ { "value": "12", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Write_Depth_A": [ { "value": "640", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Read_Width_A": [ { "value": "12", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Operating_Mode_A": [ { "value": "READ_FIRST", "value_src": "user", "resolve_type": "user", "usage": "all" } ], +        "Enable_A": [ { "value": "Always_Enabled", "value_src": "user", "resolve_type": "user", "usage": "all" } ], +        "Write_Width_B": [ { "value": "12", "resolve_type": "user", "usage": "all" } ], +        "Read_Width_B": [ { "value": "12", "resolve_type": "user", "usage": "all" } ], +        "Operating_Mode_B": [ { "value": "READ_FIRST", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Enable_B": [ { "value": "Always_Enabled", "value_src": "user", "resolve_type": "user", "usage": "all" } ], +        "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_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" } ], +        "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" } ], +        "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" } ], +        "Port_A_Write_Rate": [ { "value": "50", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Write_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ], +        "Port_A_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Collision_Warnings": [ { "value": "ALL", "resolve_type": "user", "usage": "all" } ], +        "Disable_Collision_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Disable_Out_of_Range_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "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" } ], +        "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" } ] +      }, +      "model_parameters": { +        "C_FAMILY": [ { "value": "artix7", "resolve_type": "generated", "usage": "all" } ], +        "C_XDEVICEFAMILY": [ { "value": "artix7", "resolve_type": "generated", "usage": "all" } ], +        "C_ELABORATION_DIR": [ { "value": "./", "resolve_type": "generated", "usage": "all" } ], +        "C_INTERFACE_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_AXI_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_AXI_SLAVE_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_BRAM_BLOCK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ENABLE_32BIT_ADDRESS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "generated", "usage": "all" } ], +        "C_HAS_AXI_ID": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MEM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_BYTE_SIZE": [ { "value": "9", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ALGORITHM": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PRIM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "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_dispctl_slbuf.mem", "resolve_type": "generated", "usage": "all" } ], +        "C_USE_DEFAULT_DATA": [ { "value": "0", "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" } ], +        "C_RSTRAM_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_INITA_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], +        "C_HAS_ENA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_REGCEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_BYTE_WEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WEA_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WRITE_MODE_A": [ { "value": "READ_FIRST", "resolve_type": "generated", "usage": "all" } ], +        "C_WRITE_WIDTH_A": [ { "value": "12", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_WIDTH_A": [ { "value": "12", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "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_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" } ], +        "C_HAS_ENB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_REGCEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_BYTE_WEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WEB_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WRITE_MODE_B": [ { "value": "READ_FIRST", "resolve_type": "generated", "usage": "all" } ], +        "C_WRITE_WIDTH_B": [ { "value": "12", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_WIDTH_B": [ { "value": "12", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WRITE_DEPTH_B": [ { "value": "640", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "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_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" } ], +        "C_HAS_SOFTECC_INPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_SOFTECC_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_SOFTECC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_ECC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_EN_ECC_PIPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_LATENCY_A": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_LATENCY_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_INJECTERR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_SIM_COLLISION_CHECK": [ { "value": "ALL", "resolve_type": "generated", "usage": "all" } ], +        "C_COMMON_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_DISABLE_WARN_BHV_COLL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_EN_SLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_URAM": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_EN_RDADDRA_CHG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "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_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" } ], +        "C_EST_POWER_SUMMARY": [ { "value": "Estimated Power for IP     :     2.81195 mW", "resolve_type": "generated", "usage": "all" } ] +      }, +      "project_parameters": { +        "ARCHITECTURE": [ { "value": "artix7" } ], +        "BASE_BOARD_PART": [ { "value": "digilentinc.com:basys3:part0:1.2" } ], +        "BOARD_CONNECTIONS": [ { "value": "" } ], +        "DEVICE": [ { "value": "xc7a35t" } ], +        "PACKAGE": [ { "value": "cpg236" } ], +        "PREFHDL": [ { "value": "VHDL" } ], +        "SILICON_REVISION": [ { "value": "" } ], +        "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], +        "SPEEDGRADE": [ { "value": "-1" } ], +        "STATIC_POWER": [ { "value": "" } ], +        "TEMPERATURE_GRADE": [ { "value": "" } ], +        "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], +        "USE_RDI_GENERATION": [ { "value": "TRUE" } ] +      }, +      "runtime_parameters": { +        "IPCONTEXT": [ { "value": "IP_Flow" } ], +        "IPREVISION": [ { "value": "5" } ], +        "MANAGED": [ { "value": "TRUE" } ], +        "OUTPUTDIR": [ { "value": "../../../../basys3.gen/sources_1/ip/ppu_dispctl_slbuf" } ], +        "SELECTEDSIMMODEL": [ { "value": "" } ], +        "SHAREDDIR": [ { "value": "." } ], +        "SWVERSION": [ { "value": "2022.2" } ], +        "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] +      } +    }, +    "boundary": { +      "ports": { +        "clka": [ { "direction": "in", "driver_value": "0" } ], +        "wea": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ], +        "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" } ] +      }, +      "interfaces": { +        "CLK.ACLK": { +          "vlnv": "xilinx.com:signal:clock:1.0", +          "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "ASSOCIATED_BUSIF": [ { "value": "AXI_SLAVE_S_AXI:AXILite_SLAVE_S_AXI", "value_src": "constant", "usage": "all" } ], +            "ASSOCIATED_RESET": [ { "value": "s_aresetn", "value_src": "constant", "usage": "all" } ], +            "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], +            "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] +          } +        }, +        "RST.ARESETN": { +          "vlnv": "xilinx.com:signal:reset:1.0", +          "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ], +            "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] +          } +        }, +        "BRAM_PORTA": { +          "vlnv": "xilinx.com:interface:bram:1.0", +          "abstraction_type": "xilinx.com:interface:bram_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "MEM_SIZE": [ { "value": "8192", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "MEM_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "MEM_ECC": [ { "value": "NONE", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "MASTER_TYPE": [ { "value": "OTHER", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "READ_WRITE_MODE": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "READ_LATENCY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ] +          }, +          "port_maps": { +            "ADDR": [ { "physical_name": "addra" } ], +            "CLK": [ { "physical_name": "clka" } ], +            "DIN": [ { "physical_name": "dina" } ], +            "WE": [ { "physical_name": "wea" } ] +          } +        }, +        "BRAM_PORTB": { +          "vlnv": "xilinx.com:interface:bram:1.0", +          "abstraction_type": "xilinx.com:interface:bram_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "MEM_SIZE": [ { "value": "8192", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "MEM_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "MEM_ECC": [ { "value": "NONE", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "MASTER_TYPE": [ { "value": "OTHER", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "READ_WRITE_MODE": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "READ_LATENCY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ] +          }, +          "port_maps": { +            "ADDR": [ { "physical_name": "addrb" } ], +            "CLK": [ { "physical_name": "clkb" } ], +            "DOUT": [ { "physical_name": "doutb" } ], +            "RST": [ { "physical_name": "rstb" } ] +          } +        } +      }, +      "memory_maps": { +        "S_1": { +          "address_blocks": { +            "Mem0": { +              "base_address": "0", +              "range": "4096", +              "usage": "memory", +              "access": "read-write", +              "parameters": { +                "OFFSET_BASE_PARAM": [ { "value": "C_BASEADDR" } ], +                "OFFSET_HIGH_PARAM": [ { "value": "C_HIGHADDR" } ] +              } +            } +          } +        } +      } +    } +  } +}
\ No newline at end of file diff --git a/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_test_img/ppu_dispctl_test_img.xci b/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_test_img/ppu_dispctl_test_img.xci new file mode 100644 index 0000000..f6ddeb4 --- /dev/null +++ b/basys3/basys3.srcs/sources_1/ip/ppu_dispctl_test_img/ppu_dispctl_test_img.xci @@ -0,0 +1,254 @@ +{ +  "schema": "xilinx.com:schema:json_instance:1.0", +  "ip_inst": { +    "xci_name": "ppu_dispctl_test_img", +    "component_reference": "xilinx.com:ip:blk_mem_gen:8.4", +    "ip_revision": "5", +    "gen_directory": "../../../../basys3.gen/sources_1/ip/ppu_dispctl_test_img", +    "parameters": { +      "component_parameters": { +        "Component_Name": [ { "value": "ppu_dispctl_test_img", "resolve_type": "user", "usage": "all" } ], +        "Interface_Type": [ { "value": "Native", "resolve_type": "user", "usage": "all" } ], +        "AXI_Type": [ { "value": "AXI4_Full", "resolve_type": "user", "usage": "all" } ], +        "AXI_Slave_Type": [ { "value": "Memory_Slave", "resolve_type": "user", "usage": "all" } ], +        "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": "Single_Port_ROM", "value_src": "user", "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", "enabled": false, "usage": "all" } ], +        "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "EN_SLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "EN_DEEPSLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "EN_SHUTDOWN_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "EN_ECC_PIPE": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "RD_ADDR_CHNG_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "RD_ADDR_CHNG_B": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Use_Error_Injection_Pins": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Error_Injection_Type": [ { "value": "Single_Bit_Error_Injection", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Use_Byte_Write_Enable": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Byte_Size": [ { "value": "9", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Algorithm": [ { "value": "Minimum_Area", "resolve_type": "user", "usage": "all" } ], +        "Primitive": [ { "value": "8kx2", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Assume_Synchronous_Clk": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Write_Width_A": [ { "value": "12", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Write_Depth_A": [ { "value": "76800", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Read_Width_A": [ { "value": "12", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Operating_Mode_A": [ { "value": "WRITE_FIRST", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Enable_A": [ { "value": "Always_Enabled", "value_src": "user", "resolve_type": "user", "usage": "all" } ], +        "Write_Width_B": [ { "value": "12", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Read_Width_B": [ { "value": "12", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Operating_Mode_B": [ { "value": "WRITE_FIRST", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Enable_B": [ { "value": "Always_Enabled", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Register_PortA_Output_of_Memory_Primitives": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Register_PortA_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Use_REGCEA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Register_PortB_Output_of_Memory_Primitives": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Register_PortB_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "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": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Coe_File": [ { "value": "../../../../../test/upscaler/img.coe", "value_src": "user", "resolve_type": "user", "usage": "all" } ], +        "Fill_Remaining_Memory_Locations": [ { "value": "false", "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", "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": "false", "resolve_type": "user", "format": "bool", "enabled": false, "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" } ], +        "Port_A_Write_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Clock": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Write_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_A_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Enable_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Collision_Warnings": [ { "value": "ALL", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Disable_Collision_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "Disable_Out_of_Range_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "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": "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" } ] +      }, +      "model_parameters": { +        "C_FAMILY": [ { "value": "artix7", "resolve_type": "generated", "usage": "all" } ], +        "C_XDEVICEFAMILY": [ { "value": "artix7", "resolve_type": "generated", "usage": "all" } ], +        "C_ELABORATION_DIR": [ { "value": "./", "resolve_type": "generated", "usage": "all" } ], +        "C_INTERFACE_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_AXI_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_AXI_SLAVE_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_BRAM_BLOCK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ENABLE_32BIT_ADDRESS": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "generated", "usage": "all" } ], +        "C_HAS_AXI_ID": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MEM_TYPE": [ { "value": "3", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_BYTE_SIZE": [ { "value": "9", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ALGORITHM": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_PRIM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_LOAD_INIT_FILE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_INIT_FILE_NAME": [ { "value": "ppu_dispctl_test_img.mif", "resolve_type": "generated", "usage": "all" } ], +        "C_INIT_FILE": [ { "value": "ppu_dispctl_test_img.mem", "resolve_type": "generated", "usage": "all" } ], +        "C_USE_DEFAULT_DATA": [ { "value": "0", "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" } ], +        "C_RSTRAM_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_INITA_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], +        "C_HAS_ENA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_REGCEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_BYTE_WEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WEA_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WRITE_MODE_A": [ { "value": "WRITE_FIRST", "resolve_type": "generated", "usage": "all" } ], +        "C_WRITE_WIDTH_A": [ { "value": "12", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_WIDTH_A": [ { "value": "12", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WRITE_DEPTH_A": [ { "value": "76800", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_DEPTH_A": [ { "value": "76800", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ADDRA_WIDTH": [ { "value": "17", "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" } ], +        "C_HAS_ENB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_REGCEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_BYTE_WEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WEB_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WRITE_MODE_B": [ { "value": "WRITE_FIRST", "resolve_type": "generated", "usage": "all" } ], +        "C_WRITE_WIDTH_B": [ { "value": "12", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_WIDTH_B": [ { "value": "12", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_WRITE_DEPTH_B": [ { "value": "76800", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_DEPTH_B": [ { "value": "76800", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_ADDRB_WIDTH": [ { "value": "17", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_MEM_OUTPUT_REGS_A": [ { "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" } ], +        "C_HAS_SOFTECC_INPUT_REGS_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_SOFTECC_OUTPUT_REGS_B": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_SOFTECC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_ECC": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_EN_ECC_PIPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_LATENCY_A": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_READ_LATENCY_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_INJECTERR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_SIM_COLLISION_CHECK": [ { "value": "ALL", "resolve_type": "generated", "usage": "all" } ], +        "C_COMMON_CLK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_DISABLE_WARN_BHV_COLL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_EN_SLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_URAM": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_EN_RDADDRA_CHG": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "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": "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": "26", "resolve_type": "generated", "usage": "all" } ], +        "C_COUNT_18K_BRAM": [ { "value": "1", "resolve_type": "generated", "usage": "all" } ], +        "C_EST_POWER_SUMMARY": [ { "value": "Estimated Power for IP     :     8.356818 mW", "resolve_type": "generated", "usage": "all" } ] +      }, +      "project_parameters": { +        "ARCHITECTURE": [ { "value": "artix7" } ], +        "BASE_BOARD_PART": [ { "value": "digilentinc.com:basys3:part0:1.2" } ], +        "BOARD_CONNECTIONS": [ { "value": "" } ], +        "DEVICE": [ { "value": "xc7a35t" } ], +        "PACKAGE": [ { "value": "cpg236" } ], +        "PREFHDL": [ { "value": "VHDL" } ], +        "SILICON_REVISION": [ { "value": "" } ], +        "SIMULATOR_LANGUAGE": [ { "value": "MIXED" } ], +        "SPEEDGRADE": [ { "value": "-1" } ], +        "STATIC_POWER": [ { "value": "" } ], +        "TEMPERATURE_GRADE": [ { "value": "" } ], +        "USE_RDI_CUSTOMIZATION": [ { "value": "TRUE" } ], +        "USE_RDI_GENERATION": [ { "value": "TRUE" } ] +      }, +      "runtime_parameters": { +        "IPCONTEXT": [ { "value": "IP_Flow" } ], +        "IPREVISION": [ { "value": "5" } ], +        "MANAGED": [ { "value": "TRUE" } ], +        "OUTPUTDIR": [ { "value": "../../../../basys3.gen/sources_1/ip/ppu_dispctl_test_img" } ], +        "SELECTEDSIMMODEL": [ { "value": "" } ], +        "SHAREDDIR": [ { "value": "." } ], +        "SWVERSION": [ { "value": "2022.2" } ], +        "SYNTHESISFLOW": [ { "value": "OUT_OF_CONTEXT" } ] +      } +    }, +    "boundary": { +      "ports": { +        "clka": [ { "direction": "in", "driver_value": "0" } ], +        "addra": [ { "direction": "in", "size_left": "16", "size_right": "0", "driver_value": "0" } ], +        "douta": [ { "direction": "out", "size_left": "11", "size_right": "0" } ] +      }, +      "interfaces": { +        "CLK.ACLK": { +          "vlnv": "xilinx.com:signal:clock:1.0", +          "abstraction_type": "xilinx.com:signal:clock_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "ASSOCIATED_BUSIF": [ { "value": "AXI_SLAVE_S_AXI:AXILite_SLAVE_S_AXI", "value_src": "constant", "usage": "all" } ], +            "ASSOCIATED_RESET": [ { "value": "s_aresetn", "value_src": "constant", "usage": "all" } ], +            "FREQ_HZ": [ { "value": "100000000", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "FREQ_TOLERANCE_HZ": [ { "value": "0", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "PHASE": [ { "value": "0.0", "resolve_type": "generated", "format": "float", "is_ips_inferred": true, "is_static_object": false } ], +            "CLK_DOMAIN": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "ASSOCIATED_PORT": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] +          } +        }, +        "RST.ARESETN": { +          "vlnv": "xilinx.com:signal:reset:1.0", +          "abstraction_type": "xilinx.com:signal:reset_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "POLARITY": [ { "value": "ACTIVE_LOW", "value_src": "constant", "usage": "all" } ], +            "INSERT_VIP": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "simulation.rtl", "is_ips_inferred": true, "is_static_object": false } ] +          } +        }, +        "BRAM_PORTA": { +          "vlnv": "xilinx.com:interface:bram:1.0", +          "abstraction_type": "xilinx.com:interface:bram_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "MEM_SIZE": [ { "value": "8192", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "MEM_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ], +            "MEM_ECC": [ { "value": "NONE", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "MASTER_TYPE": [ { "value": "OTHER", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "READ_WRITE_MODE": [ { "value": "", "resolve_type": "generated", "is_ips_inferred": true, "is_static_object": false } ], +            "READ_LATENCY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_ips_inferred": true, "is_static_object": false } ] +          }, +          "port_maps": { +            "ADDR": [ { "physical_name": "addra" } ], +            "CLK": [ { "physical_name": "clka" } ], +            "DOUT": [ { "physical_name": "douta" } ] +          } +        } +      }, +      "memory_maps": { +        "S_1": { +          "address_blocks": { +            "Mem0": { +              "base_address": "0", +              "range": "4096", +              "usage": "memory", +              "access": "read-write", +              "parameters": { +                "OFFSET_BASE_PARAM": [ { "value": "C_BASEADDR" } ], +                "OFFSET_HIGH_PARAM": [ { "value": "C_HIGHADDR" } ] +              } +            } +          } +        } +      } +    } +  } +}
\ No newline at end of file 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 9663635..958b9b9 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 @@ -13,12 +13,12 @@          "AXI_Slave_Type": [ { "value": "Memory_Slave", "resolve_type": "user", "usage": "all" } ],          "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": "Single_Port_RAM", "resolve_type": "user", "usage": "all" } ], -        "PRIM_type_to_Implement": [ { "value": "BRAM", "resolve_type": "user", "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" } ],          "Enable_32bit_Address": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "ecctype": [ { "value": "No_ECC", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], -        "softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "ecctype": [ { "value": "No_ECC", "resolve_type": "user", "usage": "all" } ], +        "ECC": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], +        "softecc": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],          "EN_SLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],          "EN_DEEPSLEEP_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ],          "EN_SHUTDOWN_PIN": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], @@ -31,45 +31,45 @@          "Byte_Size": [ { "value": "9", "resolve_type": "user", "enabled": false, "usage": "all" } ],          "Algorithm": [ { "value": "Minimum_Area", "resolve_type": "user", "usage": "all" } ],          "Primitive": [ { "value": "8kx2", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Assume_Synchronous_Clk": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Assume_Synchronous_Clk": [ { "value": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ],          "Write_Width_A": [ { "value": "15", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ],          "Write_Depth_A": [ { "value": "53248", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ], -        "Read_Width_A": [ { "value": "15", "resolve_type": "user", "usage": "all" } ], -        "Operating_Mode_A": [ { "value": "WRITE_FIRST", "resolve_type": "user", "usage": "all" } ], +        "Read_Width_A": [ { "value": "15", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Operating_Mode_A": [ { "value": "NO_CHANGE", "resolve_type": "user", "usage": "all" } ],          "Enable_A": [ { "value": "Always_Enabled", "value_src": "user", "resolve_type": "user", "usage": "all" } ], -        "Write_Width_B": [ { "value": "15", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Read_Width_B": [ { "value": "15", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Operating_Mode_B": [ { "value": "WRITE_FIRST", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Enable_B": [ { "value": "Always_Enabled", "resolve_type": "user", "enabled": false, "usage": "all" } ], -        "Register_PortA_Output_of_Memory_Primitives": [ { "value": "true", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Register_PortA_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Use_REGCEA_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Register_PortB_Output_of_Memory_Primitives": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], -        "Register_PortB_Output_of_Memory_Core": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], -        "Use_REGCEB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "usage": "all" } ], +        "Write_Width_B": [ { "value": "15", "resolve_type": "user", "usage": "all" } ], +        "Read_Width_B": [ { "value": "15", "resolve_type": "user", "usage": "all" } ], +        "Operating_Mode_B": [ { "value": "READ_FIRST", "resolve_type": "user", "enabled": false, "usage": "all" } ], +        "Enable_B": [ { "value": "Always_Enabled", "value_src": "user", "resolve_type": "user", "usage": "all" } ], +        "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_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": "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": "true", "value_src": "user", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Reset_Memory_Latch_A": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], -        "Reset_Priority_A": [ { "value": "CE", "resolve_type": "user", "usage": "all" } ], -        "Output_Reset_Value_A": [ { "value": "0", "resolve_type": "user", "usage": "all" } ], -        "Use_RSTB_Pin": [ { "value": "false", "resolve_type": "user", "format": "bool", "enabled": false, "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" } ], +        "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", "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" } ],          "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" } ],          "Port_A_Write_Rate": [ { "value": "50", "resolve_type": "user", "format": "long", "usage": "all" } ], -        "Port_B_Clock": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], -        "Port_B_Write_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Clock": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Write_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "enabled": false, "usage": "all" } ],          "Port_A_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ], -        "Port_B_Enable_Rate": [ { "value": "0", "resolve_type": "user", "format": "long", "usage": "all" } ], +        "Port_B_Enable_Rate": [ { "value": "100", "resolve_type": "user", "format": "long", "usage": "all" } ],          "Collision_Warnings": [ { "value": "ALL", "resolve_type": "user", "usage": "all" } ],          "Disable_Collision_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],          "Disable_Out_of_Range_Warnings": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ], @@ -92,16 +92,16 @@          "C_CTRL_ECC_ALGO": [ { "value": "NONE", "resolve_type": "generated", "usage": "all" } ],          "C_HAS_AXI_ID": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_AXI_ID_WIDTH": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ], -        "C_MEM_TYPE": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_MEM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_BYTE_SIZE": [ { "value": "9", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_ALGORITHM": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_PRIM_TYPE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "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_tmm.mem", "resolve_type": "generated", "usage": "all" } ], -        "C_USE_DEFAULT_DATA": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_USE_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_DEFAULT_DATA": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], -        "C_HAS_RSTA": [ { "value": "1", "resolve_type": "generated", "format": "long", "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" } ],          "C_RSTRAM_A": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_INITA_VAL": [ { "value": "0", "resolve_type": "generated", "usage": "all" } ], @@ -109,13 +109,13 @@          "C_HAS_REGCEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_USE_BYTE_WEA": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_WEA_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], -        "C_WRITE_MODE_A": [ { "value": "WRITE_FIRST", "resolve_type": "generated", "usage": "all" } ], +        "C_WRITE_MODE_A": [ { "value": "NO_CHANGE", "resolve_type": "generated", "usage": "all" } ],          "C_WRITE_WIDTH_A": [ { "value": "15", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_READ_WIDTH_A": [ { "value": "15", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "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": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_HAS_RSTB": [ { "value": "1", "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" } ], @@ -123,14 +123,14 @@          "C_HAS_REGCEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_USE_BYTE_WEB": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_WEB_WIDTH": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ], -        "C_WRITE_MODE_B": [ { "value": "WRITE_FIRST", "resolve_type": "generated", "usage": "all" } ], +        "C_WRITE_MODE_B": [ { "value": "READ_FIRST", "resolve_type": "generated", "usage": "all" } ],          "C_WRITE_WIDTH_B": [ { "value": "15", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_READ_WIDTH_B": [ { "value": "15", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_WRITE_DEPTH_B": [ { "value": "53248", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "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": "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_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_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" } ], @@ -143,7 +143,7 @@          "C_READ_LATENCY_B": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_HAS_INJECTERR": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_SIM_COLLISION_CHECK": [ { "value": "ALL", "resolve_type": "generated", "usage": "all" } ], -        "C_COMMON_CLK": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], +        "C_COMMON_CLK": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_DISABLE_WARN_BHV_COLL": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_EN_SLEEP_PIN": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ],          "C_USE_URAM": [ { "value": "0", "resolve_type": "generated", "format": "long", "usage": "all" } ], @@ -155,7 +155,7 @@          "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" } ], -        "C_EST_POWER_SUMMARY": [ { "value": "Estimated Power for IP     :     13.861152 mW", "resolve_type": "generated", "usage": "all" } ] +        "C_EST_POWER_SUMMARY": [ { "value": "Estimated Power for IP     :     25.994176 mW", "resolve_type": "generated", "usage": "all" } ]        },        "project_parameters": {          "ARCHITECTURE": [ { "value": "artix7" } ], @@ -186,12 +186,15 @@      "boundary": {        "ports": {          "clka": [ { "direction": "in", "driver_value": "0" } ], -        "rsta": [ { "direction": "in", "driver_value": "0" } ],          "wea": [ { "direction": "in", "size_left": "0", "size_right": "0", "driver_value": "0" } ],          "addra": [ { "direction": "in", "size_left": "15", "size_right": "0", "driver_value": "0" } ],          "dina": [ { "direction": "in", "size_left": "14", "size_right": "0", "driver_value": "0" } ], -        "douta": [ { "direction": "out", "size_left": "14", "size_right": "0" } ], -        "rsta_busy": [ { "direction": "out" } ] +        "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" } ]        },        "interfaces": {          "CLK.ACLK": { @@ -234,10 +237,27 @@              "ADDR": [ { "physical_name": "addra" } ],              "CLK": [ { "physical_name": "clka" } ],              "DIN": [ { "physical_name": "dina" } ], -            "DOUT": [ { "physical_name": "douta" } ], -            "RST": [ { "physical_name": "rsta" } ],              "WE": [ { "physical_name": "wea" } ]            } +        }, +        "BRAM_PORTB": { +          "vlnv": "xilinx.com:interface:bram:1.0", +          "abstraction_type": "xilinx.com:interface:bram_rtl:1.0", +          "mode": "slave", +          "parameters": { +            "MEM_SIZE": [ { "value": "8192", "resolve_type": "generated", "format": "long", "is_static_object": false } ], +            "MEM_WIDTH": [ { "value": "32", "resolve_type": "generated", "format": "long", "is_static_object": false } ], +            "MEM_ECC": [ { "value": "NONE", "resolve_type": "generated", "is_static_object": false } ], +            "MASTER_TYPE": [ { "value": "OTHER", "resolve_type": "generated", "is_static_object": false } ], +            "READ_WRITE_MODE": [ { "value": "", "resolve_type": "generated", "is_static_object": false } ], +            "READ_LATENCY": [ { "value": "1", "resolve_type": "generated", "format": "long", "is_static_object": false } ] +          }, +          "port_maps": { +            "ADDR": [ { "physical_name": "addrb" } ], +            "CLK": [ { "physical_name": "clkb" } ], +            "DOUT": [ { "physical_name": "doutb" } ], +            "RST": [ { "physical_name": "rstb" } ] +          }          }        },        "memory_maps": { diff --git a/basys3/basys3.xpr b/basys3/basys3.xpr index b4b83db..dc5e1eb 100644 --- a/basys3/basys3.xpr +++ b/basys3/basys3.xpr @@ -6,7 +6,7 @@  <Project Version="7" Minor="61" Path="/home/loek/docs/repos/avans-arcade/basys3/basys3.xpr">    <DefaultLaunch Dir="$PRUNDIR"/>    <Configuration> -    <Option Name="Id" Val="c71bd79008bf4728a2417b154418cb5f"/> +    <Option Name="Id" Val="ca3fd6267bfa422ca0883093e4774689"/>      <Option Name="Part" Val="xc7a35tcpg236-1"/>      <Option Name="CompiledLibDir" Val="$PCACHEDIR/compile_simlib"/>      <Option Name="CompiledLibDirXSim" Val=""/> @@ -42,10 +42,8 @@      <Option Name="SimulatorGccVersionVCS" Val="9.2.0"/>      <Option Name="SimulatorGccVersionRiviera" Val="9.3.0"/>      <Option Name="SimulatorGccVersionActiveHdl" Val="9.3.0"/> -    <Option Name="TargetLanguage" Val="VHDL"/>      <Option Name="BoardPart" Val="digilentinc.com:basys3:part0:1.2"/>      <Option Name="BoardPartRepoPaths" Val="$PPRDIR/../../../../.Xilinx/Vivado/2022.2/xhub/board_store/xilinx_board_store"/> -    <Option Name="SourceMgmtMode" Val="DisplayOnly"/>      <Option Name="ActiveSimSet" Val="sim_1"/>      <Option Name="DefaultLib" Val="xil_defaultlib"/>      <Option Name="ProjectType" Val="Default"/> @@ -61,20 +59,20 @@      <Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/>      <Option Name="EnableBDX" Val="FALSE"/>      <Option Name="DSABoardId" Val="basys3"/> -    <Option Name="WTXSimLaunchSim" Val="113"/> +    <Option Name="WTXSimLaunchSim" Val="0"/>      <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="4"/> -    <Option Name="WTModelSimExportSim" Val="4"/> -    <Option Name="WTQuestaExportSim" Val="4"/> +    <Option Name="WTXSimExportSim" Val="0"/> +    <Option Name="WTModelSimExportSim" Val="0"/> +    <Option Name="WTQuestaExportSim" Val="0"/>      <Option Name="WTIesExportSim" Val="0"/> -    <Option Name="WTVcsExportSim" Val="4"/> -    <Option Name="WTRivieraExportSim" Val="4"/> -    <Option Name="WTActivehdlExportSim" Val="4"/> +    <Option Name="WTVcsExportSim" Val="0"/> +    <Option Name="WTRivieraExportSim" Val="0"/> +    <Option Name="WTActivehdlExportSim" Val="0"/>      <Option Name="GenerateIPUpgradeLog" Val="TRUE"/>      <Option Name="XSimRadix" Val="hex"/>      <Option Name="XSimTimeUnit" Val="ns"/> @@ -93,50 +91,31 @@      <FileSet Name="sources_1" Type="DesignSrcs" RelSrcDir="$PSRCDIR/sources_1" RelGenDir="$PGENDIR/sources_1">        <Filter Type="Srcs"/>        <File Path="$PSRCDIR/ppu_consts.vhd"> -        <FileInfo> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/ppu_pceg.vhd">          <FileInfo SFType="VHDL2008"> +          <Attr Name="IsGlobalInclude" Val="1"/>            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/ppu.vhd"> +      <File Path="$PSRCDIR/er_ram.vhd">          <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/ppu_addr_dec.vhd"> +      <File Path="$PSRCDIR/er_ram_mod.vhd">          <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/apu.vhd"> -        <FileInfo> -          <Attr Name="UserDisabled" Val="1"/> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/apu_note_to_frequency.vhd"> -        <FileInfo> -          <Attr Name="UserDisabled" Val="1"/> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/er_ram.vhd"> +      <File Path="$PSRCDIR/ppu.vhd">          <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/er_ram_mod.vhd"> +      <File Path="$PSRCDIR/ppu_addr_dec.vhd">          <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/> @@ -148,63 +127,56 @@            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/ppu_sprite_bg.vhd"> -        <FileInfo> +      <File Path="$PSRCDIR/ppu_comp.vhd"> +        <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/ppu_sprite_transform.vhd"> -        <FileInfo> +      <File Path="$PSRCDIR/ppu_dispctl.vhd"> +        <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/ppu_sprite_fg.vhd"> +      <File Path="$PSRCDIR/ppu_pceg.vhd">          <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/ppu_vga_tiny.vhd"> -        <FileInfo> +      <File Path="$PSRCDIR/ppu_plut.vhd"> +        <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/ppu_comp.vhd"> -        <FileInfo> +      <File Path="$PSRCDIR/ppu_sprite_bg.vhd"> +        <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/ppu_plut.vhd"> -        <FileInfo> +      <File Path="$PSRCDIR/ppu_sprite_fg.vhd"> +        <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/ppu_vga_native.vhd"> -        <FileInfo> +      <File Path="$PSRCDIR/ppu_sprite_transform.vhd"> +        <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File> -      <File Path="$PSRCDIR/apu_lut_reader.vhd"> -        <FileInfo> -          <Attr Name="UserDisabled" Val="1"/> +      <File Path="$PSRCDIR/spi.vhd"> +        <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File>        <File Path="$PSRCDIR/top.vhd"> -        <FileInfo> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/spi.vhd"> -        <FileInfo> +        <FileInfo SFType="VHDL2008">            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo> @@ -212,6 +184,7 @@        <Config>          <Option Name="DesignMode" Val="RTL"/>          <Option Name="TopModule" Val="top"/> +        <Option Name="TopAutoSet" Val="TRUE"/>          <Option Name="dataflowViewerSettings" Val="min_width=16"/>        </Config>      </FileSet> @@ -224,70 +197,16 @@          </FileInfo>        </File>        <Config> +        <Option Name="TargetConstrsFile" Val="$PSRCDIR/io.xdc"/>          <Option Name="ConstrsType" Val="XDC"/>        </Config>      </FileSet>      <FileSet Name="sim_1" Type="SimulationSrcs" RelSrcDir="$PSRCDIR/sim_1" RelGenDir="$PGENDIR/sim_1"> -      <Filter Type="Srcs"/> -      <File Path="$PSRCDIR/ppu_addr_dec_tb.vhd"> -        <FileInfo> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/ppu_pceg_tb.vhd"> -        <FileInfo SFType="VHDL2008"> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/apu_note_to_frequency_tb.vhd"> -        <FileInfo> -          <Attr Name="UserDisabled" Val="1"/> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/er_ram_mod_tb.vhd"> -        <FileInfo SFType="VHDL2008"> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/er_ram_tb.vhd"> -        <FileInfo SFType="VHDL2008"> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/ppu_aux_tb.vhd"> -        <FileInfo> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/ppu_sprite_bg_tb.vhd"> -        <FileInfo SFType="VHDL2008"> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/ppu_sprite_transform_tb.vhd"> -        <FileInfo> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File> -      <File Path="$PSRCDIR/ppu_sprite_fg_tb.vhd"> -        <FileInfo SFType="VHDL2008"> -          <Attr Name="UsedIn" Val="synthesis"/> -          <Attr Name="UsedIn" Val="simulation"/> -        </FileInfo> -      </File>        <Config>          <Option Name="DesignMode" Val="RTL"/> -        <Option Name="TopModule" Val="ppu_sprite_fg_tb"/> +        <Option Name="TopModule" Val="top"/>          <Option Name="TopLib" Val="xil_defaultlib"/> +        <Option Name="TopAutoSet" Val="TRUE"/>          <Option Name="TransportPathDelay" Val="0"/>          <Option Name="TransportIntDelay" Val="0"/>          <Option Name="SelectedSimModel" Val="rtl"/> @@ -296,12 +215,13 @@          <Option Name="PamSignalDriverFile" Val="xil_bypass_driver"/>          <Option Name="PamPseudoTop" Val="pseudo_tb"/>          <Option Name="SrcSet" Val="sources_1"/> -        <Option Name="NLNetlistMode" Val="funcsim"/> +        <Option Name="Incremental" Val="0"/> +        <Option Name="xsim.simulate.runtime" Val="18 ms"/>        </Config>      </FileSet>      <FileSet Name="utils_1" Type="Utils" RelSrcDir="$PSRCDIR/utils_1" RelGenDir="$PGENDIR/utils_1">        <Filter Type="Utils"/> -      <File Path="$PSRCDIR/utils_1/imports/synth_1/ppu.dcp"> +      <File Path="$PSRCDIR/utils_1/imports/synth_1/top.dcp">          <FileInfo>            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="implementation"/> @@ -313,24 +233,37 @@          <Option Name="TopAutoSet" Val="TRUE"/>        </Config>      </FileSet> -    <FileSet Name="ppu_bam" Type="BlockSrcs" RelSrcDir="$PSRCDIR/ppu_bam" RelGenDir="$PGENDIR/ppu_bam"> -      <File Path="$PSRCDIR/sources_1/ip/ppu_bam/ppu_bam.xci"> +    <FileSet Name="ppu_dispctl_pixclk" Type="BlockSrcs" RelSrcDir="$PSRCDIR/ppu_dispctl_pixclk" RelGenDir="$PGENDIR/ppu_dispctl_pixclk"> +      <File Path="$PSRCDIR/sources_1/ip/ppu_dispctl_pixclk/ppu_dispctl_pixclk.xci">          <FileInfo> -          <Attr Name="UserDisabled" Val="1"/>            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="implementation"/>            <Attr Name="UsedIn" Val="simulation"/>          </FileInfo>        </File>        <Config> -        <Option Name="TopModule" Val="ppu_bam"/> +        <Option Name="TopModule" Val="ppu_dispctl_pixclk"/> +        <Option Name="dataflowViewerSettings" Val="min_width=16"/> +        <Option Name="UseBlackboxStub" Val="1"/> +      </Config> +    </FileSet> +    <FileSet Name="ppu_dispctl_slbuf" Type="BlockSrcs" RelSrcDir="$PSRCDIR/ppu_dispctl_slbuf" RelGenDir="$PGENDIR/ppu_dispctl_slbuf"> +      <File Path="$PSRCDIR/sources_1/ip/ppu_dispctl_slbuf/ppu_dispctl_slbuf.xci"> +        <FileInfo> +          <Attr Name="UsedIn" Val="synthesis"/> +          <Attr Name="UsedIn" Val="implementation"/> +          <Attr Name="UsedIn" Val="simulation"/> +        </FileInfo> +      </File> +      <Config> +        <Option Name="TopModule" Val="ppu_dispctl_slbuf"/> +        <Option Name="dataflowViewerSettings" Val="min_width=16"/>          <Option Name="UseBlackboxStub" Val="1"/>        </Config>      </FileSet>      <FileSet Name="ppu_tmm" Type="BlockSrcs" RelSrcDir="$PSRCDIR/ppu_tmm" RelGenDir="$PGENDIR/ppu_tmm">        <File Path="$PSRCDIR/sources_1/ip/ppu_tmm/ppu_tmm.xci">          <FileInfo> -          <Attr Name="UserDisabled" Val="1"/>            <Attr Name="UsedIn" Val="synthesis"/>            <Attr Name="UsedIn" Val="implementation"/>            <Attr Name="UsedIn" Val="simulation"/> @@ -338,6 +271,21 @@        </File>        <Config>          <Option Name="TopModule" Val="ppu_tmm"/> +        <Option Name="dataflowViewerSettings" Val="min_width=16"/> +        <Option Name="UseBlackboxStub" Val="1"/> +      </Config> +    </FileSet> +    <FileSet Name="ppu_bam" Type="BlockSrcs" RelSrcDir="$PSRCDIR/ppu_bam" RelGenDir="$PGENDIR/ppu_bam"> +      <File Path="$PSRCDIR/sources_1/ip/ppu_bam/ppu_bam.xci"> +        <FileInfo> +          <Attr Name="UsedIn" Val="synthesis"/> +          <Attr Name="UsedIn" Val="implementation"/> +          <Attr Name="UsedIn" Val="simulation"/> +        </FileInfo> +      </File> +      <Config> +        <Option Name="TopModule" Val="ppu_bam"/> +        <Option Name="dataflowViewerSettings" Val="min_width=16"/>          <Option Name="UseBlackboxStub" Val="1"/>        </Config>      </FileSet> @@ -364,9 +312,25 @@      </Simulator>    </Simulators>    <Runs Version="1" Minor="19"> -    <Run Id="synth_1" Type="Ft3:Synth" SrcSet="sources_1" Part="xc7a35tcpg236-1" ConstrsSet="constrs_1" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="true" IncrementalCheckpoint="$PSRCDIR/utils_1/imports/synth_1/ppu.dcp" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/synth_1"> +    <Run Id="synth_1" Type="Ft3:Synth" SrcSet="sources_1" Part="xc7a35tcpg236-1" ConstrsSet="constrs_1" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="true" IncrementalCheckpoint="$PSRCDIR/utils_1/imports/synth_1/top.dcp" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/synth_1">        <Strategy Version="1" Minor="2"> -        <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"/> +        <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"> +          <Desc>Vivado Synthesis Defaults</Desc> +        </StratHandle> +        <Step Id="synth_design"> +          <Option Id="FlattenHierarchy">0</Option> +        </Step> +      </Strategy> +      <GeneratedRun Dir="$PRUNDIR" File="gen_run.xml"/> +      <ReportStrategy Name="Vivado Synthesis Default Reports" Flow="Vivado Synthesis 2022"/> +      <Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/> +      <RQSFiles/> +    </Run> +    <Run Id="ppu_dispctl_pixclk_synth_1" Type="Ft3:Synth" SrcSet="ppu_dispctl_pixclk" Part="xc7a35tcpg236-1" ConstrsSet="ppu_dispctl_pixclk" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" Dir="$PRUNDIR/ppu_dispctl_pixclk_synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_dispctl_pixclk_synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_dispctl_pixclk_synth_1"> +      <Strategy Version="1" Minor="2"> +        <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"> +          <Desc>Vivado Synthesis Defaults</Desc> +        </StratHandle>          <Step Id="synth_design"/>        </Strategy>        <GeneratedRun Dir="$PRUNDIR" File="gen_run.xml"/> @@ -374,9 +338,11 @@        <Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/>        <RQSFiles/>      </Run> -    <Run Id="ppu_bam_synth_1" Type="Ft3:Synth" SrcSet="ppu_bam" Part="xc7a35tcpg236-1" ConstrsSet="ppu_bam" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" Dir="$PRUNDIR/ppu_bam_synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_bam_synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_bam_synth_1"> +    <Run Id="ppu_dispctl_slbuf_synth_1" Type="Ft3:Synth" SrcSet="ppu_dispctl_slbuf" Part="xc7a35tcpg236-1" ConstrsSet="ppu_dispctl_slbuf" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" Dir="$PRUNDIR/ppu_dispctl_slbuf_synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_dispctl_slbuf_synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_dispctl_slbuf_synth_1">        <Strategy Version="1" Minor="2"> -        <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"/> +        <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"> +          <Desc>Vivado Synthesis Defaults</Desc> +        </StratHandle>          <Step Id="synth_design"/>        </Strategy>        <GeneratedRun Dir="$PRUNDIR" File="gen_run.xml"/> @@ -386,7 +352,9 @@      </Run>      <Run Id="ppu_tmm_synth_1" Type="Ft3:Synth" SrcSet="ppu_tmm" Part="xc7a35tcpg236-1" ConstrsSet="ppu_tmm" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" Dir="$PRUNDIR/ppu_tmm_synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_tmm_synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_tmm_synth_1">        <Strategy Version="1" Minor="2"> -        <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"/> +        <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"> +          <Desc>Vivado Synthesis Defaults</Desc> +        </StratHandle>          <Step Id="synth_design"/>        </Strategy>        <GeneratedRun Dir="$PRUNDIR" File="gen_run.xml"/> @@ -394,9 +362,43 @@        <Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/>        <RQSFiles/>      </Run> -    <Run Id="impl_1" Type="Ft2:EntireDesign" Part="xc7a35tcpg236-1" ConstrsSet="constrs_1" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" State="current" SynthRun="synth_1" IncludeInArchive="true" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/impl_1" AutoRQSDir="$PSRCDIR/utils_1/imports/impl_1"> +    <Run Id="ppu_bam_synth_1" Type="Ft3:Synth" SrcSet="ppu_bam" Part="xc7a35tcpg236-1" ConstrsSet="ppu_bam" Description="Vivado Synthesis Defaults" AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" Dir="$PRUNDIR/ppu_bam_synth_1" IncludeInArchive="true" IsChild="false" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_bam_synth_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_bam_synth_1"> +      <Strategy Version="1" Minor="2"> +        <StratHandle Name="Vivado Synthesis Defaults" Flow="Vivado Synthesis 2022"> +          <Desc>Vivado Synthesis Defaults</Desc> +        </StratHandle> +        <Step Id="synth_design"/> +      </Strategy> +      <GeneratedRun Dir="$PRUNDIR" File="gen_run.xml"/> +      <ReportStrategy Name="Vivado Synthesis Default Reports" Flow="Vivado Synthesis 2022"/> +      <Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/> +      <RQSFiles/> +    </Run> +    <Run Id="impl_1" Type="Ft2:EntireDesign" Part="xc7a35tcpg236-1" ConstrsSet="constrs_1" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" State="current" Dir="$PRUNDIR/impl_1" SynthRun="synth_1" IncludeInArchive="true" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/impl_1" AutoRQSDir="$PSRCDIR/utils_1/imports/impl_1"> +      <Strategy Version="1" Minor="2"> +        <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"> +          <Desc>Default settings for Implementation.</Desc> +        </StratHandle> +        <Step Id="init_design"/> +        <Step Id="opt_design"/> +        <Step Id="power_opt_design"/> +        <Step Id="place_design"/> +        <Step Id="post_place_power_opt_design"/> +        <Step Id="phys_opt_design"/> +        <Step Id="route_design"/> +        <Step Id="post_route_phys_opt_design" EnableStepBool="1"/> +        <Step Id="write_bitstream"/> +      </Strategy> +      <GeneratedRun Dir="$PRUNDIR" File="gen_run.xml"/> +      <ReportStrategy Name="Vivado Implementation Default Reports" Flow="Vivado Implementation 2022"/> +      <Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/> +      <RQSFiles/> +    </Run> +    <Run Id="ppu_dispctl_pixclk_impl_1" Type="Ft2:EntireDesign" Part="xc7a35tcpg236-1" ConstrsSet="ppu_dispctl_pixclk" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" SynthRun="ppu_dispctl_pixclk_synth_1" IncludeInArchive="false" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_dispctl_pixclk_impl_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_dispctl_pixclk_impl_1">        <Strategy Version="1" Minor="2"> -        <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"/> +        <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"> +          <Desc>Default settings for Implementation.</Desc> +        </StratHandle>          <Step Id="init_design"/>          <Step Id="opt_design"/>          <Step Id="power_opt_design"/> @@ -411,9 +413,11 @@        <Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/>        <RQSFiles/>      </Run> -    <Run Id="ppu_bam_impl_1" Type="Ft2:EntireDesign" Part="xc7a35tcpg236-1" ConstrsSet="ppu_bam" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" SynthRun="ppu_bam_synth_1" IncludeInArchive="false" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_bam_impl_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_bam_impl_1"> +    <Run Id="ppu_dispctl_slbuf_impl_1" Type="Ft2:EntireDesign" Part="xc7a35tcpg236-1" ConstrsSet="ppu_dispctl_slbuf" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" SynthRun="ppu_dispctl_slbuf_synth_1" IncludeInArchive="false" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_dispctl_slbuf_impl_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_dispctl_slbuf_impl_1">        <Strategy Version="1" Minor="2"> -        <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"/> +        <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"> +          <Desc>Default settings for Implementation.</Desc> +        </StratHandle>          <Step Id="init_design"/>          <Step Id="opt_design"/>          <Step Id="power_opt_design"/> @@ -430,7 +434,28 @@      </Run>      <Run Id="ppu_tmm_impl_1" Type="Ft2:EntireDesign" Part="xc7a35tcpg236-1" ConstrsSet="ppu_tmm" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" SynthRun="ppu_tmm_synth_1" IncludeInArchive="false" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_tmm_impl_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_tmm_impl_1">        <Strategy Version="1" Minor="2"> -        <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"/> +        <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"> +          <Desc>Default settings for Implementation.</Desc> +        </StratHandle> +        <Step Id="init_design"/> +        <Step Id="opt_design"/> +        <Step Id="power_opt_design"/> +        <Step Id="place_design"/> +        <Step Id="post_place_power_opt_design"/> +        <Step Id="phys_opt_design"/> +        <Step Id="route_design"/> +        <Step Id="post_route_phys_opt_design"/> +        <Step Id="write_bitstream"/> +      </Strategy> +      <ReportStrategy Name="Vivado Implementation Default Reports" Flow="Vivado Implementation 2022"/> +      <Report Name="ROUTE_DESIGN.REPORT_METHODOLOGY" Enabled="1"/> +      <RQSFiles/> +    </Run> +    <Run Id="ppu_bam_impl_1" Type="Ft2:EntireDesign" Part="xc7a35tcpg236-1" ConstrsSet="ppu_bam" Description="Default settings for Implementation." AutoIncrementalCheckpoint="false" WriteIncrSynthDcp="false" SynthRun="ppu_bam_synth_1" IncludeInArchive="false" IsChild="false" GenFullBitstream="true" AutoIncrementalDir="$PSRCDIR/utils_1/imports/ppu_bam_impl_1" AutoRQSDir="$PSRCDIR/utils_1/imports/ppu_bam_impl_1"> +      <Strategy Version="1" Minor="2"> +        <StratHandle Name="Vivado Implementation Defaults" Flow="Vivado Implementation 2022"> +          <Desc>Default settings for Implementation.</Desc> +        </StratHandle>          <Step Id="init_design"/>          <Step Id="opt_design"/>          <Step Id="power_opt_design"/> diff --git a/docs/architecture.md b/docs/architecture.md index 5001eed..9a77e57 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -68,6 +68,7 @@ Here's a list of features our PPU has:  - 640x480 background canvas with scrolling  - NO background scrolling splits  - 128 total sprites on screen (NO scanline sprite limit) +  - the first 16 foreground sprites have accurate background occlusion  - sprites are always drawn on top of the background layer  - PPU control using DMA (dual-port asynchronous RAM)  - tiles can be flipped using FAM or BAM @@ -82,7 +83,9 @@ Notable differences:    Since we're using VGA, we can't use custom resolutions without an    upscaler/downscaler. This resolution was chosen because it's exactly half of -  the lowest standard VGA resolution 640x480. +  the lowest standard VGA resolution 640x480. The native resolution can't be +  used due to the pipelined pixel fetch logic, which needs at least 5 clock +  cycles to produce a stable color output.  - No scanline sprite limit      Unless not imposing any sprite limit makes the hardware implementation @@ -98,24 +101,24 @@ Notable differences:  - Single 1024 sprite tilemap shared between foreground and background sprites    The NES OAM registers contain a bit to select which tilemap to use (of two), -  which effectively expands each tile's index address by one byte. Instead of +  which effectively expands each tile's index address by one bit. Instead of    creating the illusion of two separate memory areas for tiles, having one -  large tilemap seems like a more sensible solution to indexed tiles. +  large tilemap seems like a more sensible solution.  - 8 total palettes, with 8 colors each -  More colors is better. Increasing the total palette count is a very memory -  intensive operation, while increasing the palette color count is likely slower +  More colors is better. Increasing the palette color count is a very memory +  intensive operation, while increasing the total amount of palettes is slower    when looking up color values for each pixel on real hardware.  - Sprites can be positioned partially off-screen on all screen edges using only    the offset bits in the FAM register    The NES has a separate PPUMASK register to control special color effects, and    to shift sprites off the left and top screen edges, as the sprite offsets -  count from 0. Our PPU's FAM sprite offset bits count from -15, so the sprite +  count from 0. Our PPU's FAM sprite offset bits count from -16, so the sprite    can shift past the top and left screen edges, as well as the standard bottom    and right edges. -- No status line register, only V-sync and H-sync outputs are supplied back to -  CPU +- No status line register, only vertical and horizontal blanking/sync outputs +  are supplied back to CPU    The NES status line register contains some handy lines, such as a buggy    status line for reaching the max sprite count per scanline, and a status line @@ -126,7 +129,7 @@ Notable differences:  - No background scrolling splits    This feature allows only part of the background canvas to be scrolled, while -  another portion stays still. This was used to draw HUD elements on the +  another portion remains still. This was used to draw HUD elements on the    background layer for displaying things like health bars or score counters.    Since we are working with a higher foreground sprite limit, we'll use regular    foreground sprites to display HUD elements. @@ -197,6 +200,7 @@ Important notes:    the RAM in it's own cache memory. The cache updates are fetched during the    VBLANK time between each frame. +<!-- inaccurate and no longer needed  ### Level 3  This diagram has several flaws, but a significant amount of time has already @@ -227,6 +231,24 @@ Important notes:    CIDX signal based on the EN signal from the compositor.  - All DATA and ADDR lines are shared between all RAM ports. WEN inputs are    controlled by the address decoder. +--> + +## Pipeline stage reference + +This table describes which components use which lines during pipeline stages +1-5. The pipeline stages happen for every pixel, and is run on the system clock +(100 MHz). + +|Stage|Component|Action|To|Type| +|-|-|-|-|-| +|1|`ppu_sprite_bg`|write|BAM address|bus| +|2|`ppu_sprite_bg`|read|BAM data|bus| +|2|`ppu_sprite_fg`|write|TMM address|bus| +|3|`ppu_sprite_bg`|write|TMM address|bus| +|3|`ppu_sprite_fg`|read|TMM data|bus| +|4|`ppu_sprite_bg`|read|TMM data|bus| +|5|`ppu_pceg`|write|pixel done|flag| +|6|`ppu_pceg`|write|pixel ready|flag|  ## Registers @@ -258,7 +280,7 @@ there is no address validity checking.    discarded padding bit per word)  - Pixel index order is from top-left to bottom-right in (English) reading    order. -- Bits `14 downto 3` of the byte with the highest address for a given tile are +- Bits `14 downto 3` of the word with the highest address for a given tile are    not used  - To calculate TMM address $a$ for any given pixel $p$ of tile with index $t$,    compute $a=52*t+\left\lfloor\frac{p}{5}\right\rfloor$ diff --git a/docs/ppu.drawio b/docs/ppu.drawio index c0ce0be..7d4d400 100644 --- a/docs/ppu.drawio +++ b/docs/ppu.drawio @@ -1 +1 @@ -<mxfile host="Electron" modified="2023-02-17T15:42:42.163Z" 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="F4f9xIP4TBzWa1ggQMnZ" version="20.8.16" type="device" pages="3"><diagram name="level-1" id="DBE48RpXtx8JnoEt3ekA">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</diagram><diagram id="MdQQJuunD4ehtDpxKxax" name="level-2">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</diagram><diagram id="lj51MlK96fuJFRP7cw84" name="level-3">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</diagram></mxfile>
\ No newline at end of file +<mxfile host="Electron" modified="2023-03-12T08:38:04.645Z" 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="52K4OrVv843H2dPzCX49" version="20.8.16" type="device" pages="4"><diagram name="level-1" id="DBE48RpXtx8JnoEt3ekA">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</diagram><diagram id="MdQQJuunD4ehtDpxKxax" name="level-2">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</diagram><diagram id="lj51MlK96fuJFRP7cw84" name="level-3">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</diagram><diagram id="1ySgP4OewCsUoPnmkRD4" name="display">7VhNc9owEP01zKSHdGwMDj3GQJNDmSFDkpKjsIWtIlseWWC7v74rW8YYy4RMPtrM9MJIT1pp973dRdCzxmF2w1EczJiHaa9veFnPmvT6/aFtw6cE8hKwBlcl4HPilZBZAwvyGyvQUOiWeDhpbBSMUUHiJuiyKMKuaGCIc5Y2t60Zbd4aIx+3gIWLaBv9STwRlOhoaNT4LSZ+UN1sGmolRNVmBSQB8lh6AFnTnjXmjIlyFGZjTCV3FS+l3feO1b1jHEfiHIMc3T49zCaLNLuZi4eZCB9v0GW/PGWH6FYFrJwVecWAz9k2VtswFzjT8Y5W1Xaj7Ze5jxayBLMQC57DlrTm07KUWXDAZb8iGSkN/b1tHSYMVKT6qKeDzdrYDl22/LYYJKPbu3v7ThO1g9yNDDTyZEwo2sGdfZuCJ86Kw8iXowt7YGSDkfGlxVFhieWVBuxLAyLwIkauXE2hLAALRAguTkwYShYJZNg1JX4E2IoJwUJYSMCERL7cJo9pE3lSwmNt2oRXq4rWvDk9lKOvk2PwXnKYGj2uZwBcwI1jDd1QSnHBLcpjRiQ7TrLBwg2UAGtC6UJtTxiVlztJ2VpsGBY2mE93QGyiRCmwIrCh0xtO1CFjRhkHMGIRGDscwykq1eU9nAkkDuYx5gQowdLExfKOeY04SYTiezYvHS4u9VASFFlzMi2QAihey0gpWmE6ZwkRhEmYlxLt7X8crYfE86SHB+l1efUe6XWQQNr8eYP00XpofkQP6+amu86OCs1uF5p5pSHKtN6t0FpMzecPADwSnMaMC03Lg1aQQeW/suVpaqmR+2fybXZI+IpWZ9o6Bd4iV/UKWC0JEpdjHP3vdv9Etzs/wz6g22kzqJ1A1w9LAJ5aeYM9eMmqKaYrlk5rwGmWL9R+wHwWAZ+MxUqiX1iIXL3I0VawZkkDjzxfSvuvw2r6pI4rJpOsMcvVrON5CJ6zLXfxqdpRlArEfSyeb3My/pMSckyRILvmS//tS77ddUvFln9NsYZetXwdihWewLgquVeJOPqUGo6ef2K86Puw0Qo1rTcRnG3wEdhJ+hnd6sQX4Mc+9Y3PzmTWyaT2V5P5ciZhWv8rUKwd/LViTf8A</diagram></mxfile>
\ No newline at end of file diff --git a/test/upscaler/.gitignore b/test/upscaler/.gitignore new file mode 100644 index 0000000..5c9a6b6 --- /dev/null +++ b/test/upscaler/.gitignore @@ -0,0 +1 @@ +*.coe diff --git a/test/upscaler/img.png b/test/upscaler/img.png Binary files differnew file mode 100644 index 0000000..946d624 --- /dev/null +++ b/test/upscaler/img.png diff --git a/test/upscaler/img2coe.py b/test/upscaler/img2coe.py new file mode 100755 index 0000000..fb4c442 --- /dev/null +++ b/test/upscaler/img2coe.py @@ -0,0 +1,28 @@ +#!/bin/python3 + +from PIL import Image +import sys + +# return array of 12-bit color values (0bRRRGGGBBB) +def pixeldata(): +  image = Image.open(sys.argv[-1]) # use last argument as input image file +  pixels = image.load() +  pixarr = [] +  w,h = image.size +  for y in range(h): +    for x in range(w): +      color = pixels[x, y] +      crushed_color = ((color[0] >> 4) << 8 | (color[1] >> 4) << 4 | (color[2] >> 4) << 0) +      pixarr.append(crushed_color) +  return pixarr + +if __name__ == "__main__": +  # get array of 12-bit pixels +  pixels = pixeldata() +  # coe file header +  print("memory_initialization_radix=16;\nmemory_initialization_vector=", end='') +  # format pixel value as 12-bit hexadecimal with padding seperated by comma and space +  formatted_pixels = ','.join([f"{hex(c)[2:].zfill(3)}" for c in pixels]) +  print(f"{formatted_pixels};") + + diff --git a/test/upscaler/makefile b/test/upscaler/makefile new file mode 100644 index 0000000..393eda4 --- /dev/null +++ b/test/upscaler/makefile @@ -0,0 +1,4 @@ +img.coe: img.png + +%.coe: %.png +	./img2coe.py $< > $@  |