aboutsummaryrefslogtreecommitdiff
path: root/basys3/basys3.srcs/ppu_addr_dec.vhd
blob: e0c374fdf18126df0a460a2ab73c6d8e7c9cc141 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
library ieee;
library work;
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)
	WEN : in std_logic; -- EXT write enable
	TMM_WEN,
	BAM_WEN,
	FAM_WEN,
	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));
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;

	-- WEN MUX
	TMM_WEN <= TMM_RANGE and WEN;
	BAM_WEN <= BAM_RANGE and WEN;
	FAM_WEN <= FAM_RANGE and WEN;
	PAL_WEN <= PAL_RANGE and WEN;
	AUX_WEN <= AUX_RANGE and WEN;

	-- address ranges
	TMM_RANGE <= '1' when not ((ADDR(15) and ADDR(14) and ADDR(13)) or (ADDR(15) and ADDR(14) and ADDR(12))) else '0';
	BAM_RANGE <= '1' when TMM_RANGE = '0' and (ADDR(11) = '0') else '0';
	FAM_RANGE <= '1' when TMM_RANGE = '0' and (ADDR(11) = '1' and ADDR(10) = '0') else '0';
	PAL_RANGE <= '1' when TMM_RANGE = '0' and (ADDR(11) = '1' and ADDR(10) = '1' and ADDR(9) = '0') else '0';
	AUX_RANGE <= '1' when TMM_RANGE = '0' and (ADDR(11) = '1' and ADDR(10) = '1' and ADDR(9) = '1') else '0';
end Behavioral;