Revision 1327
Added by markw about 4 years ago
| atari_chips/pokeyv2/iox_gluev1.vhdl | ||
|---|---|---|
|
POT_RESET : IN STD_LOGIC;
|
||
|
KEYBOARD_SCAN : IN STD_LOGIC_VECTOR(5 downto 0);
|
||
|
KEYBOARD_RESPONSE : OUT STD_LOGIC_VECTOR(1 downto 0);
|
||
|
KEYBOARD_SCAN_UPDATE : IN STD_LOGIC;
|
||
|
KEYBOARD_SCAN_ENABLE : OUT STD_LOGIC
|
||
|
);
|
||
|
END iox_glue;
|
||
| atari_chips/pokeyv2/pokeymax.vhd.v1.diff | ||
|---|---|---|
|
--- pokeymax.vhd 2020-10-23 17:05:24.416773341 +0200
|
||
|
+++ pokeymaxv1.vhd 2020-10-23 17:26:19.264305175 +0200
|
||
|
@@ -60,7 +60,6 @@
|
||
|
--- pokeymax.vhd 2021-09-01 21:35:50.610031442 +0200
|
||
|
+++ pokeymaxv1.vhd 2021-09-01 21:50:36.284379953 +0200
|
||
|
@@ -75,7 +75,6 @@
|
||
|
ACLK : OUT STD_LOGIC;
|
||
|
BCLK : INOUT STD_LOGIC;
|
||
|
SID : IN STD_LOGIC;
|
||
| ... | ... | |
|
CS1 : IN STD_LOGIC;
|
||
|
|
||
|
AUD : OUT STD_LOGIC_VECTOR(4 DOWNTO 1);
|
||
|
@@ -68,7 +67,6 @@
|
||
|
@@ -83,7 +82,6 @@
|
||
|
EXT : INOUT STD_LOGIC_VECTOR(EXT_BITS DOWNTO 1);
|
||
|
|
||
|
PADDLE : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
|
||
| ... | ... | |
|
|
||
|
IOX_RST : OUT STD_LOGIC;
|
||
|
IOX_INT : IN STD_LOGIC;
|
||
|
@@ -173,7 +171,7 @@
|
||
|
@@ -530,7 +528,7 @@
|
||
|
|
||
|
signal KEYBOARD_SCAN : std_logic_vector(5 downto 0);
|
||
|
signal KEYBOARD_RESPONSE : std_logic_vector(1 downto 0);
|
||
|
- signal KEYBOARD_SCAN_UPDATE : std_logic;
|
||
|
+ signal KEYBOARD_SCAN_ENABLE : std_logic;
|
||
|
|
||
|
signal POKEY_PROFILE_ADDR : std_logic_vector(5 downto 0);
|
||
|
signal POKEY_PROFILE_REQUEST : std_logic;
|
||
|
@@ -457,7 +455,7 @@
|
||
|
|
||
|
EXT_INT(0) <= '0'; --force to 0
|
||
|
EXT_INT(17 downto ext_bits+1) <= (others=>'1');
|
||
|
- EXT_INT(18) <= CS0_N;
|
||
| ... | ... | |
|
EXT_INT(19) <= CS1;
|
||
|
EXT_INT(20) <= '1';
|
||
|
EXT_INT(ext_bits downto 1) <= EXT;
|
||
|
@@ -634,10 +632,10 @@
|
||
|
-- PRIMARY POKEY GTIA_VOLUME_
|
||
|
--------------------------------------------------------
|
||
|
pokey1 : entity work.pokey
|
||
|
---GENERIC MAP
|
||
|
---(
|
||
|
--- custom_keyboard_scan => 1
|
||
|
---)
|
||
|
+GENERIC MAP
|
||
|
+(
|
||
|
+ custom_keyboard_scan => 1
|
||
|
+)
|
||
|
PORT MAP(CLK => CLK,
|
||
|
ENABLE_179 => ENABLE_CYCLE,
|
||
|
WR_EN => POKEY_WRITE_ENABLE(0),
|
||
|
@@ -665,7 +663,7 @@
|
||
|
DATA_OUT => POKEY_DO(0),
|
||
|
keyboard_scan => KEYBOARD_SCAN,
|
||
|
keyboard_scan_enable => open,
|
||
|
- keyboard_scan_update => KEYBOARD_SCAN_UPDATE
|
||
|
+ keyboard_scan_enable => KEYBOARD_SCAN_ENABLE
|
||
|
);
|
||
|
@@ -1816,6 +1814,8 @@
|
||
|
|
||
|
--------------------------------------------------------
|
||
|
@@ -1616,8 +1614,9 @@
|
||
|
|
||
|
int=>iox_int,
|
||
|
|
||
|
+ pot_reset=>potreset,
|
||
|
+
|
||
|
keyboard_scan=>keyboard_scan,
|
||
|
- keyboard_scan_update=>keyboard_scan_update,
|
||
|
+ keyboard_scan_enable=>keyboard_scan_enable,
|
||
|
keyboard_response=>keyboard_response
|
||
|
);
|
||
|
keyboard_scan_update=>keyboard_scan_update,
|
||
|
keyboard_response=>iox_keyboard_response,
|
||
|
@@ -1888,6 +1888,4 @@
|
||
|
|
||
|
@@ -1642,6 +1641,4 @@
|
||
|
|
||
|
D <= BUS_DATA when BUS_OE='1' else (others=>'Z');
|
||
|
|
||
|
-POTRESET_N <= not(POTRESET) when ext_clk_enable=0 else '1';
|
||
| atari_chips/pokeyv2/pokeymaxv1.qsf | ||
|---|---|---|
|
set_global_assignment -name VHDL_FILE audiotypes.vhdl
|
||
|
set_global_assignment -name VHDL_FILE mixer.vhdl
|
||
|
set_global_assignment -name VHDL_FILE clockgen.vhd
|
||
|
set_global_assignment -name VHDL_FILE spdif_transmitter.vhdl
|
||
|
set_global_assignment -name VHDL_FILE ps2_keyboard.vhdl
|
||
|
set_global_assignment -name VHDL_FILE ps2_to_atari800.vhdl
|
||
|
set_global_assignment -name VHDL_FILE pokeymax.vhd
|
||
|
set_global_assignment -name VHDL_FILE PSG/envelope.vhdl
|
||
|
set_global_assignment -name VHDL_FILE PSG/noise.vhdl
|
||
| atari_chips/pokeyv2/pokeymaxv1.vhd | ||
|---|---|---|
|
fancy_switch_bit : integer := 20; -- 0=ext is low => mono
|
||
|
gtia_audio_bit : integer := 0; -- 0=no gtia on l/r,1=gtia mixed on l/r
|
||
|
detect_right_on_by_default : integer := 1;
|
||
|
saturate_on_by_default : integer := 1;
|
||
|
a4_bit : integer := 0;
|
||
|
a5_bit : integer := 0;
|
||
|
a6_bit : integer := 0;
|
||
|
a7_bit : integer := 0;
|
||
|
cs0_bit : integer := 18;
|
||
|
cs1_bit : integer := 19;
|
||
|
spdif_bit : integer := 0;
|
||
|
ps2clk_bit : integer := 0;
|
||
|
ps2dat_bit : integer := 0;
|
||
|
|
||
|
ext_bits : integer := 3;
|
||
|
pll_v2 : integer := 1;
|
||
|
|
||
|
enable_config : integer := 1;
|
||
|
enable_sid : integer := 0;
|
||
| ... | ... | |
|
enable_sample : integer := 0;
|
||
|
enable_flash : integer := 0;
|
||
|
enable_audout2: integer := 1;
|
||
|
enable_spdif: integer := 0;
|
||
|
enable_ps2: integer := 0;
|
||
|
|
||
|
sid_wave_base : integer := 42496; --to_integer(unsigned(x"a600"));
|
||
|
|
||
| ... | ... | |
|
|
||
|
CLK_OUT : OUT STD_LOGIC; -- Use PHI2 and internal oscillator to create a clock, feed out here
|
||
|
CLK_SLOW : IN STD_LOGIC; -- ... and back in here, then to pll!
|
||
|
|
||
|
CLK0 : IN STD_LOGIC; -- 50MHz on v3 only
|
||
|
CLK1 : IN STD_LOGIC; -- 50MHz on v3 only
|
||
|
|
||
|
D : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);
|
||
|
A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
|
||
| ... | ... | |
|
);
|
||
|
end component;
|
||
|
|
||
|
component pllv3
|
||
|
port (
|
||
|
inclk0 : in std_logic := '0';
|
||
|
c0 : out std_logic;
|
||
|
c1 : out std_logic;
|
||
|
c2 : out std_logic;
|
||
|
c3 : out std_logic;
|
||
|
locked : out std_logic
|
||
|
);
|
||
|
end component;
|
||
|
|
||
|
signal OSC_CLK : std_logic; -- about 82MHz! Always?? Massive range on data sheet
|
||
|
|
||
|
signal CLK : std_logic;
|
||
| ... | ... | |
|
SIGNAL POKEY_WRITE_ENABLE : STD_LOGIC_VECTOR(3 downto 0);
|
||
|
|
||
|
SIGNAL SID_WRITE_ENABLE : STD_LOGIC_VECTOR(1 downto 0);
|
||
|
SIGNAL SID_READ_ENABLE : STD_LOGIC_VECTOR(1 downto 0);
|
||
|
|
||
|
SIGNAL PSG_WRITE_ENABLE : STD_LOGIC_VECTOR(1 downto 0);
|
||
|
|
||
| ... | ... | |
|
|
||
|
signal SIO_TXD : std_logic;
|
||
|
signal SIO_RXD : std_logic;
|
||
|
signal SIO_RXD_SYNC : std_logic;
|
||
|
|
||
|
signal POKEY_IRQ : std_logic_vector(3 downto 0);
|
||
|
|
||
| ... | ... | |
|
signal AUDIO_3_SIGMADELTA : std_logic;
|
||
|
|
||
|
signal KEYBOARD_SCAN : std_logic_vector(5 downto 0);
|
||
|
signal IOX_KEYBOARD_RESPONSE : std_logic_vector(1 downto 0);
|
||
|
signal PS2_KEYBOARD_RESPONSE : std_logic_vector(1 downto 0);
|
||
|
signal KEYBOARD_RESPONSE : std_logic_vector(1 downto 0);
|
||
|
signal KEYBOARD_SCAN_UPDATE : std_logic;
|
||
|
signal KEYBOARD_SCAN_ENABLE : std_logic;
|
||
| ... | ... | |
|
signal MHZ1_ENABLE : std_logic;
|
||
|
signal MHZ2_ENABLE : std_logic;
|
||
|
|
||
|
-- spdif
|
||
|
signal spdif_mux : std_logic_vector(15 downto 0);
|
||
|
signal spdif_right : std_logic;
|
||
|
signal spdif_out : std_logic;
|
||
|
signal CLK6144 : std_logic; --spdif
|
||
|
signal AUDIO_2_FILTERED : unsigned(15 downto 0);
|
||
|
signal AUDIO_3_FILTERED : unsigned(15 downto 0);
|
||
|
|
||
|
-- ps2
|
||
|
signal PS2CLK : std_logic;
|
||
|
signal PS2DAT : std_logic;
|
||
|
|
||
|
function getByte(a : string; x : integer) return std_logic_vector is
|
||
|
variable ret : std_logic_vector(7 downto 0);
|
||
|
begin
|
||
| ... | ... | |
|
|
||
|
CLK_OUT <= OSC_CLK;
|
||
|
|
||
|
|
||
|
pll_v2_inst : if pll_v2=1 generate
|
||
|
pll_inst : pll
|
||
|
PORT MAP(inclk0 => CLK_SLOW,
|
||
|
c0 => CLK, --56 ish
|
||
|
c1 => CLK116, --113ish
|
||
|
c2 => CLK106, --106ish
|
||
|
locked => RESET_N);
|
||
|
end generate;
|
||
|
|
||
|
pll_v3_inst : if pll_v2=0 generate
|
||
|
pll_inst : pllv3
|
||
|
PORT MAP(inclk0 => CLK0, --49.192 (50 on prototype)
|
||
|
c0 => CLK, --49.192
|
||
|
c1 => CLK116, --113ish
|
||
|
c2 => CLK106, --106ish
|
||
|
c3 => CLK6144, --6.44MHz
|
||
|
locked => RESET_N);
|
||
|
end generate;
|
||
|
|
||
|
|
||
|
AIN(3 downto 0) <= A;
|
||
|
AIN(7) <= EXT_INT(a7_bit);
|
||
|
AIN(6) <= EXT_INT(a6_bit);
|
||
| ... | ... | |
|
ENABLE => SID_CLK_ENABLE, --1MHz
|
||
|
|
||
|
WRITE_ENABLE => SID_WRITE_ENABLE(0),
|
||
|
READ_ENABLE => SID_READ_ENABLE(0),
|
||
|
ADDR => ADDR_IN(4 downto 0),
|
||
|
DI => WRITE_DATA(7 downto 0),
|
||
|
DO => SID_DO(0),
|
||
| ... | ... | |
|
--EXTFILTER_EN => '0',
|
||
|
AUDIO => SID_AUDIO(0),
|
||
|
|
||
|
SIDTYPE => SID_FILTER1_REG,
|
||
|
SIDTYPE => SID_FILTER1_REG(0),
|
||
|
EXT => "0"&SID_FILTER1_REG(1),
|
||
|
EXT_ADC => (others=>'0'),
|
||
|
|
||
|
POT_X => '0',
|
||
|
POT_Y => '0',
|
||
|
|
||
|
rom_addr => sid_flash1_addr,
|
||
|
rom_data => flash_do_slow,
|
||
|
rom_request => sid_flash1_romrequest,
|
||
| ... | ... | |
|
ENABLE => SID_CLK_ENABLE, --1MHz
|
||
|
|
||
|
WRITE_ENABLE => SID_WRITE_ENABLE(1),
|
||
|
READ_ENABLE => SID_READ_ENABLE(1),
|
||
|
ADDR => ADDR_IN(4 downto 0),
|
||
|
DI => WRITE_DATA(7 downto 0),
|
||
|
DO => SID_DO(1),
|
||
| ... | ... | |
|
--EXTFILTER_EN => '0',
|
||
|
AUDIO => SID_AUDIO(1),
|
||
|
|
||
|
SIDTYPE => SID_FILTER2_REG,
|
||
|
SIDTYPE => SID_FILTER2_REG(0),
|
||
|
EXT => "0"&SID_FILTER2_REG(1),
|
||
|
EXT_ADC => (others=>'0'),
|
||
|
|
||
|
POT_X => '0',
|
||
|
POT_Y => '0',
|
||
|
|
||
|
rom_addr => sid_flash2_addr,
|
||
|
rom_data => flash_do_slow,
|
||
|
rom_request => sid_flash2_romrequest,
|
||
| ... | ... | |
|
RESTRICT_CAPABILITY_REG
|
||
|
)
|
||
|
variable writereq : std_logic;
|
||
|
variable readreq : std_logic;
|
||
|
variable enable_region : std_logic;
|
||
|
begin
|
||
|
writereq := not(write_n) and request;
|
||
|
readreq := write_n and request;
|
||
|
|
||
|
POKEY_WRITE_ENABLE <= (others=>'0');
|
||
|
SID_WRITE_ENABLE <= (others=>'0');
|
||
|
SID_READ_ENABLE <= (others=>'0');
|
||
|
PSG_WRITE_ENABLE <= (others=>'0');
|
||
|
SAMPLE_WRITE_ENABLE <= '0';
|
||
|
CONFIG_WRITE_ENABLE <= '0';
|
||
| ... | ... | |
|
DO_MUX <= SID_DO(0);
|
||
|
DRIVE_DO_MUX <= SID_DRIVE_DO(0);
|
||
|
SID_WRITE_ENABLE(0) <= writereq;
|
||
|
SID_READ_ENABLE(0) <= readreq;
|
||
|
when "0110"|"0111" =>
|
||
|
enable_region := RESTRICT_CAPABILITY_REG(2);
|
||
|
DO_MUX <= SID_DO(1);
|
||
|
DRIVE_DO_MUX <= SID_DRIVE_DO(1);
|
||
|
SID_WRITE_ENABLE(1) <= writereq;
|
||
|
SID_READ_ENABLE(0) <= readreq;
|
||
|
when "1000"|"1001" =>
|
||
|
enable_region := RESTRICT_CAPABILITY_REG(4);
|
||
|
DO_MUX <= SAMPLE_DO;
|
||
| ... | ... | |
|
end if;
|
||
|
IRQ_EN_REG <= '0';
|
||
|
CHANNEL_MODE_REG <= '0';
|
||
|
SATURATE_REG <= '1';
|
||
|
if saturate_on_by_default=1 then
|
||
|
SATURATE_REG <= '1';
|
||
|
else
|
||
|
SATURATE_REG <= '0';
|
||
|
end if;
|
||
|
POST_DIVIDE_REG <= "10100000"; -- 1/2 5v, 3/4 1v
|
||
|
GTIA_ENABLE_REG <= "1100"; -- external only
|
||
|
CONFIG_ENABLE_REG <= '0';
|
||
| ... | ... | |
|
CHANNEL_MODE_NEXT <= flash_do_slow(2);
|
||
|
IRQ_EN_NEXT <= flash_do_slow(3);
|
||
|
DETECT_RIGHT_NEXT <= flash_do_slow(4);
|
||
|
-- 5-7 reserved
|
||
|
PAL_NEXT <= flash_do_slow(5);
|
||
|
-- 6-7 reserved
|
||
|
POST_DIVIDE_NEXT <= flash_do_slow(15 downto 8);
|
||
|
GTIA_ENABLE_NEXT <= flash_do_slow(19 downto 16);
|
||
|
-- 23 downto 20 reserved
|
||
| ... | ... | |
|
-- 6-7 reserved
|
||
|
RESTRICT_CAPABILITY_NEXT <= flash_do_slow(12 downto 8);
|
||
|
-- 13-15 reserved
|
||
|
PAL_NEXT <= flash_do_slow(16);
|
||
|
when others =>
|
||
|
end case;
|
||
|
elsif (CONFIG_WRITE_ENABLE='1') then
|
||
| ... | ... | |
|
CH7 => unsigned(SID_AUDIO(1)),
|
||
|
CH8 => unsigned(PSG_AUDIO(0)),
|
||
|
CH9 => unsigned(PSG_AUDIO(1)),
|
||
|
CHA(14 downto 0) => (others=>'0'),
|
||
|
CHA(14 downto 12) => (others=>'0'),
|
||
|
CHA(11) => SIO_RXD_SYNC,
|
||
|
CHA(10 downto 0) => (others=>'0'),
|
||
|
CHA(15) => GTIA_AUDIO,
|
||
|
|
||
|
AUDIO_0_UNSIGNED => AUDIO_0_UNSIGNED,
|
||
| ... | ... | |
|
AUDOUT => AUDIO_3_SIGMADELTA
|
||
|
);
|
||
|
|
||
|
-- Digital audio output
|
||
|
spdif_on : if enable_spdif=1 generate
|
||
|
|
||
|
-- todo: clock domain crossing!
|
||
|
spdif_mux <= std_logic_vector(audio_2_filtered) when spdif_right='0'
|
||
|
else std_logic_vector(audio_3_filtered);
|
||
|
|
||
|
filter_left : entity work.simple_low_pass_filter
|
||
|
PORT MAP
|
||
|
(
|
||
|
CLK => clk,
|
||
|
AUDIO_IN => audio_2_unsigned,
|
||
|
SAMPLE_IN => enable_cycle,
|
||
|
AUDIO_OUT => audio_2_filtered
|
||
|
);
|
||
|
|
||
|
filter_right : entity work.simple_low_pass_filter
|
||
|
PORT MAP
|
||
|
(
|
||
|
CLK => clk,
|
||
|
AUDIO_IN => audio_3_unsigned,
|
||
|
SAMPLE_IN => enable_cycle,
|
||
|
AUDIO_OUT => audio_3_filtered
|
||
|
);
|
||
|
|
||
|
spdif : entity work.spdif_transmitter
|
||
|
port map(
|
||
|
bit_clock => CLK6144, -- 128x Fsample (6.144MHz for 48K samplerate)
|
||
|
data_in(23 downto 8) => spdif_mux,
|
||
|
data_in(7 downto 0) => (others=>'0'),
|
||
|
address_out => spdif_right,
|
||
|
spdif_out => spdif_out
|
||
|
);
|
||
|
|
||
|
EXT(SPDIF_BIT) <= spdif_out;
|
||
|
end generate spdif_on;
|
||
|
|
||
|
-- io extension
|
||
|
-- drive to 0 for pot reset (otherwise high imp)
|
||
|
-- drive keyboard lines
|
||
| ... | ... | |
|
pot_reset=>potreset,
|
||
|
|
||
|
keyboard_scan=>keyboard_scan,
|
||
|
keyboard_response=>keyboard_response,
|
||
|
--keyboard_scan_update => KEYBOARD_SCAN_UPDATE,
|
||
|
keyboard_scan_update=>keyboard_scan_update,
|
||
|
keyboard_response=>iox_keyboard_response,
|
||
|
keyboard_scan_enable=>keyboard_scan_enable
|
||
|
);
|
||
|
|
||
|
-- PS2 keyboard
|
||
|
ps2_on : if enable_ps2=1 generate
|
||
|
PS2CLK <= EXT(PS2CLK_BIT);
|
||
|
PS2DAT <= EXT(PS2DAT_BIT);
|
||
|
keyboard_map1 : entity work.ps2_to_atari800
|
||
|
GENERIC MAP
|
||
|
(
|
||
|
ps2_enable => 1,
|
||
|
direct_enable => 0
|
||
|
)
|
||
|
PORT MAP
|
||
|
(
|
||
|
CLK => clk,
|
||
|
RESET_N => reset_n,
|
||
|
PS2_CLK => PS2CLK,
|
||
|
PS2_DAT => PS2DAT,
|
||
|
|
||
|
INPUT => open,
|
||
|
|
||
|
KEY_TYPE => '0', -- TODO 1 is US key_type - probably add editor to pokeycfg an put in flash?
|
||
|
ATARI_KEYBOARD_OUT => open,
|
||
|
|
||
|
KEYBOARD_SCAN => KEYBOARD_SCAN,
|
||
|
KEYBOARD_RESPONSE => PS2_KEYBOARD_RESPONSE,
|
||
|
|
||
|
CONSOL_START => open,
|
||
|
CONSOL_SELECT => open,
|
||
|
CONSOL_OPTION => open,
|
||
|
|
||
|
FKEYS => open,
|
||
|
FREEZER_ACTIVATE => open,
|
||
|
|
||
|
PS2_KEYS_NEXT_OUT => open,
|
||
|
PS2_KEYS => open
|
||
|
);
|
||
|
KEYBOARD_RESPONSE <= IOX_KEYBOARD_RESPONSE and PS2_KEYBOARD_RESPONSE;
|
||
|
end generate ps2_on;
|
||
|
|
||
|
ps2_off : if enable_ps2=0 generate
|
||
|
KEYBOARD_RESPONSE <= IOX_KEYBOARD_RESPONSE;
|
||
|
end generate ps2_off;
|
||
|
|
||
|
|
||
|
-- Wire up pins
|
||
|
ACLK <= SIO_CLOCKOUT;
|
||
|
BCLK <= '0' when (SIO_CLOCKIN_OE='1' and SIO_CLOCKIN_OUT='0') else 'Z';
|
||
| ... | ... | |
|
|
||
|
SOD <= '0' when SIO_TXD='0' else 'Z';
|
||
|
SIO_RXD <= SID;
|
||
|
synchronizer_SIO : entity work.synchronizer
|
||
|
port map (clk=>clk, raw=>SID, sync=>SIO_RXD_SYNC);
|
||
|
|
||
|
|
||
|
--1->pin37
|
||
Updated v1 build