So it finally got cool enough for me to go to the shed and not melt to death, and I had some issues getting the clock to work on the Pi.
Doesn't fix it. It has changed how it corrupts ie. FD 0A = FD 0A.
Here is the new Module I added.
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 15:25:06 12/10/2016
-- Design Name:
-- Module Name: TimeDomainTransfer - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity TimeDomainTransfer is
Port ( clk : in STD_LOGIC;
EOFIn : in STD_LOGIC;
LoadIn : in STD_LOGIC;
SelIn : in STD_LOGIC;
ShiftClkIn : in STD_LOGIC;
EOFOut : out STD_LOGIC;
LoadOut : out STD_LOGIC;
SelOut : out STD_LOGIC;
NotSelOut : out STD_LOGIC;
ShiftClkOut : out STD_LOGIC);
end TimeDomainTransfer;
architecture Behavioral of TimeDomainTransfer is
signal internalEOF : std_logic := '0';
signal internalLoad : std_logic := '0';
signal internalSel : std_logic := '0';
signal internalShiftClk : std_logic := '0';
begin
transfer : process (clk)
begin
if (rising_edge(clk)) then
internalEOF <= EOFIn;
internalLoad <= LoadIn;
internalSel <= SelIn;
internalShiftClk <= ShiftClkIn;
end if;
EOFOut <= EOFIn;
LoadOut <= LoadIn;
SelOut <= SelIn;
NotSelOut <= not SelIn;
ShiftClkOut <= internalShiftClk;
end process transfer;
end Behavioral;
Which is now linked in as signal SSRAsignal : std_logic := '0';
signal SSRBsignal : std_logic := '0';
signal nextDataI : std_logic := '0';
signal EOFInternal : std_logic := '0';
signal LoadInternal : std_logic := '0';
signal SelInternal : std_logic := '0';
signal NotSelInternal : std_logic := '0';
signal ShiftClkOutInternal : std_logic := '0';
begin
TDT:TimeDomainTransfer port map(clk => cpldClk, EOFIn => EOF, LoadIn => latch, SelIn => sel, ShiftClkIn => clk,
EOFOut => EOFInternal, LoadOut=>LoadInternal,SelOut=>SelInternal,NotSelOut=>NotSelInternal,ShiftClkOut=>ShiftClkOutInternal);
SSRAIOBUF:OBUFT port map(O => SSRA, I =>SSRAsignal, T => EOFInternal);
SSRBIOBUF:OBUFT port map(O => SSRB, I =>SSRBsignal, T => EOFInternal);
DONEIOBUF:OBUFT port map(O => dataDone, I => '0', T => EOFInternal);
SSRAo:SSRPISO8 port map(inBus => databus,shiftClk => ShiftClkOutInternal,load => LoadInternal,cs => SelInternal, dataOut => SSRAsignal);
SSRBo:SSRPISO8 port map(inBus => databus,shiftClk => ShiftClkOutInternal,load => LoadInternal,cs => NotSelInternal, dataOut => SSRBsignal);
CNTAIOBUF:OBUFT port map(O => CNTA, I=>ShiftClkOutInternal, T => EOFInternal);
CNTBIOBUF:OBUFT port map(O => CNTB, I=>ShiftClkOutInternal, T => EOFInternal);
clk = shiftout clock which gets 8 pulses and runs at about <250KHz cpldClk is the clock from the pi which I run at half speed so ~9.6mhz.
One thing I did fix with this was in the old code Sel was 'notted' inline so it had SSRAo:SSRPISO8 port map(inBus => databus,shiftClk => clk,load => latch,cs => sel, dataOut => SSRAsignal);
SSRBo:SSRPISO8 port map(inBus => databus,shiftClk => clk,load => latch,cs => not sel, dataOut => SSRBsignal);
as the not would have had a delay over the normal, as this was always while latch = 0, it shouldn't have been a problem, but buried in the compiler output it did have a warning.
The C64 still detects EOF going high sometimes, given it samples it at once every 20~30 microseconds it can just be a small glitch somewhere.
Here are the equations it generates
********** Mapped Logic **********
CNTA_I <= CNTB;
CNTA <= CNTA_I when EOF = '1' else 'Z';
FDCPE_CNTB: FDCPE port map (CNTB_I,clk,cpldClk,'0','0');
CNTB <= CNTB_I when EOF = '1' else 'Z';
LED <= dataRead;
LED2 <= NOT EOF;
FDCPE_SSRA: FDCPE port map (SSRA_I,SSRAo/ssr(6),NOT CNTB,SSRA_CLR,SSRA_PRE);
SSRA_CLR <= (sel AND latch AND NOT databus(7));
SSRA_PRE <= (sel AND latch AND databus(7));
SSRA <= SSRA_I when EOF = '1' else 'Z';
FDCPE_SSRAo/ssr0: FDCPE port map (SSRAo/ssr(0),'0',NOT CNTB,SSRAo/ssr_CLR(0),SSRAo/ssr_PRE(0));
SSRAo/ssr_CLR(0) <= (sel AND latch AND NOT databus(0));
SSRAo/ssr_PRE(0) <= (sel AND latch AND databus(0));
FDCPE_SSRAo/ssr1: FDCPE port map (SSRAo/ssr(1),SSRAo/ssr(0),NOT CNTB,SSRAo/ssr_CLR(1),SSRAo/ssr_PRE(1));
SSRAo/ssr_CLR(1) <= (sel AND latch AND NOT databus(1));
SSRAo/ssr_PRE(1) <= (sel AND latch AND databus(1));
FDCPE_SSRAo/ssr2: FDCPE port map (SSRAo/ssr(2),SSRAo/ssr(1),NOT CNTB,SSRAo/ssr_CLR(2),SSRAo/ssr_PRE(2));
SSRAo/ssr_CLR(2) <= (sel AND latch AND NOT databus(2));
SSRAo/ssr_PRE(2) <= (sel AND latch AND databus(2));
FDCPE_SSRAo/ssr3: FDCPE port map (SSRAo/ssr(3),SSRAo/ssr(2),NOT CNTB,SSRAo/ssr_CLR(3),SSRAo/ssr_PRE(3));
SSRAo/ssr_CLR(3) <= (sel AND latch AND NOT databus(3));
SSRAo/ssr_PRE(3) <= (sel AND latch AND databus(3));
FDCPE_SSRAo/ssr4: FDCPE port map (SSRAo/ssr(4),SSRAo/ssr(3),NOT CNTB,SSRAo/ssr_CLR(4),SSRAo/ssr_PRE(4));
SSRAo/ssr_CLR(4) <= (sel AND latch AND NOT databus(4));
SSRAo/ssr_PRE(4) <= (sel AND latch AND databus(4));
FDCPE_SSRAo/ssr5: FDCPE port map (SSRAo/ssr(5),SSRAo/ssr(4),NOT CNTB,SSRAo/ssr_CLR(5),SSRAo/ssr_PRE(5));
SSRAo/ssr_CLR(5) <= (sel AND latch AND NOT databus(5));
SSRAo/ssr_PRE(5) <= (sel AND latch AND databus(5));
FDCPE_SSRAo/ssr6: FDCPE port map (SSRAo/ssr(6),SSRAo/ssr(5),NOT CNTB,SSRAo/ssr_CLR(6),SSRAo/ssr_PRE(6));
SSRAo/ssr_CLR(6) <= (sel AND latch AND NOT databus(6));
SSRAo/ssr_PRE(6) <= (sel AND latch AND databus(6));
FDCPE_SSRB: FDCPE port map (SSRB_I,SSRBo/ssr(6),NOT CNTB,SSRB_CLR,SSRB_PRE);
SSRB_CLR <= (NOT sel AND latch AND NOT databus(7));
SSRB_PRE <= (NOT sel AND latch AND databus(7));
SSRB <= SSRB_I when EOF = '1' else 'Z';
FDCPE_SSRBo/ssr0: FDCPE port map (SSRBo/ssr(0),'0',NOT CNTB,SSRBo/ssr_CLR(0),SSRBo/ssr_PRE(0));
SSRBo/ssr_CLR(0) <= (NOT sel AND latch AND NOT databus(0));
SSRBo/ssr_PRE(0) <= (NOT sel AND latch AND databus(0));
FDCPE_SSRBo/ssr1: FDCPE port map (SSRBo/ssr(1),SSRBo/ssr(0),NOT CNTB,SSRBo/ssr_CLR(1),SSRBo/ssr_PRE(1));
SSRBo/ssr_CLR(1) <= (NOT sel AND latch AND NOT databus(1));
SSRBo/ssr_PRE(1) <= (NOT sel AND latch AND databus(1));
FDCPE_SSRBo/ssr2: FDCPE port map (SSRBo/ssr(2),SSRBo/ssr(1),NOT CNTB,SSRBo/ssr_CLR(2),SSRBo/ssr_PRE(2));
SSRBo/ssr_CLR(2) <= (NOT sel AND latch AND NOT databus(2));
SSRBo/ssr_PRE(2) <= (NOT sel AND latch AND databus(2));
FDCPE_SSRBo/ssr3: FDCPE port map (SSRBo/ssr(3),SSRBo/ssr(2),NOT CNTB,SSRBo/ssr_CLR(3),SSRBo/ssr_PRE(3));
SSRBo/ssr_CLR(3) <= (NOT sel AND latch AND NOT databus(3));
SSRBo/ssr_PRE(3) <= (NOT sel AND latch AND databus(3));
FDCPE_SSRBo/ssr4: FDCPE port map (SSRBo/ssr(4),SSRBo/ssr(3),NOT CNTB,SSRBo/ssr_CLR(4),SSRBo/ssr_PRE(4));
SSRBo/ssr_CLR(4) <= (NOT sel AND latch AND NOT databus(4));
SSRBo/ssr_PRE(4) <= (NOT sel AND latch AND databus(4));
FDCPE_SSRBo/ssr5: FDCPE port map (SSRBo/ssr(5),SSRBo/ssr(4),NOT CNTB,SSRBo/ssr_CLR(5),SSRBo/ssr_PRE(5));
SSRBo/ssr_CLR(5) <= (NOT sel AND latch AND NOT databus(5));
SSRBo/ssr_PRE(5) <= (NOT sel AND latch AND databus(5));
FDCPE_SSRBo/ssr6: FDCPE port map (SSRBo/ssr(6),SSRBo/ssr(5),NOT CNTB,SSRBo/ssr_CLR(6),SSRBo/ssr_PRE(6));
SSRBo/ssr_CLR(6) <= (NOT sel AND latch AND NOT databus(6));
SSRBo/ssr_PRE(6) <= (NOT sel AND latch AND databus(6));
dataDone_I <= '0';
dataDone <= dataDone_I when EOF = '1' else 'Z';
nextData <= dataRead;
Register Legend:
FDCPE (Q,D,C,CLR,PRE,CE);
FTCPE (Q,D,C,CLR,PRE,CE);
LDCP (Q,D,G,CLR,PRE);