Так, мой вопрос остался без ответа, попробуем по другому.

Я попытался переложить интерфейс SD карты, написанный на vhdl Keeper на AHDL.
Но нифига не работает зараза и не врублюсь почему.
Может кто незамутненным взглядом найдет ошибку.

Вот мой кусок кода
Код:
    ------------------------------------------------------------------------------------
    --  Интерфейс SD карты, работает на частоте 14МГц   
    ------------------------------------------------------------------------------------
    -- Порт xx57h = 01010111b
    ------------------------------------------------------------------------------------
    CS_57 = CA[7] # !CA[6] # CA[5] # !CA[4] # CSx7 # IO_ENABLE; 
    
    SD_start_sync.d   = !CS_57;
    SD_start_sync.clk = CLK_14MHZ;
    -----------------------------------------------------------------------------------
    -- Счетчик 
    ------------------------------------------------------------------------------------
    SD_count_en = SD_count[0].q # SD_count[1].q # SD_count[2].q # !SD_count[3].q;

    SD_count[].clk = !CLK_14MHZ;
    SD_count[0].clrn  = !SD_start_sync.q;       
    SD_count[1].prn   = !SD_start_sync.q;       
    SD_count[2].prn   = !SD_start_sync.q;       
    SD_count[3].prn   = !SD_start_sync.q;       
    IF SD_count_en ==1 THEN 
       SD_count[].d = SD_count[].q+1;
    END IF;
    ------------------------------------------------------------------------------------
    -- Входной сдвигающий регистр
    ------------------------------------------------------------------------------------
    SD_shift_in[].clk   = CLK_14MHZ;
    IF SD_count[3].q ==0 THEN 
       SD_shift_in[].d = (SD_shift_in[7-1..0].q,SD_MISO);
    END IF;
    ------------------------------------------------------------------------------------
    -- Выходной сдвигающий регистр = xx57h = 01010111b
    ------------------------------------------------------------------------------------
    WR_57 = CS_57 # C_WR; 

    SD_shift_out[].clk = !CLK_14MHZ;
    IF WR_57 ==0 THEN 
       SD_shift_out[].d = CD[];
    ELSIF SD_count[3].q ==0 THEN 
       SD_shift_out[].d = (SD_shift_out[7-1..0].q,VCC);
    END IF;
    -----------------------------------------------------------------------------------
    -- Вывод данных в SD 
    ------------------------------------------------------------------------------------
    SD_MOSI = SD_shift_out[7].q;
    ------------------------------------------------------------------------------------
    -- Выходная частота SD
    ------------------------------------------------------------------------------------
    SD_SCK = CLK_14MHZ & !SD_count[3].q;
    ------------------------------------------------------------------------------------
    -- Процесс записи в порт управления SD карты = xx77h = 01110111b
    ------------------------------------------------------------------------------------
    WR_77 = CA[7] # !CA[6] # !CA[5] # !CA[4] # CSx7 # IO_WR; 

    SD_rule_r.d = CD[1];
    SD_rule_r.clk = WR_77;
    SD_rule_r.prn = C_RESET; 

    SD_CS = SD_rule_r.q;
Почему то cчетчик SD_count доходя до 8 не останавливается и продолжает считать.

А вот исходный вариант на vhdl
Код:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity SPI is
port(
--INPUTS
DI      : in std_logic_vector(7 downto 0);
CLC     : in std_logic;
START   : in std_logic;
MISO    : in std_logic;
WR_EN   : in std_logic;
--OUTPUTS
DO      : out std_logic_vector(7 downto 0);
SCK     : out std_logic;
MOSI    : out std_logic
);
end;

architecture spi_rtl of SPI is

signal COUNTER      : std_logic_vector(3 downto 0);
signal SHIFT_IN     : std_logic_vector(7 downto 0);
signal SHIFT_OUT    : std_logic_vector(7 downto 0);
signal COUNTER_EN   : std_logic;
signal START_SYNC   : std_logic;

begin        
        SCK             <= CLC and not COUNTER(3);
        DO              <= SHIFT_IN;
        MOSI            <= SHIFT_OUT(7);
        COUNTER_EN      <= not COUNTER(3) or COUNTER(2) or COUNTER(1) or COUNTER(0);

        process(CLC)
        begin
            if CLC'event and CLC = '1' then
                START_SYNC <= START;
            end if;
        end process;
        
        process(CLC,COUNTER(3))
        begin
            if CLC'event and CLC = '1' then
                if COUNTER(3) = '0' then
                    SHIFT_IN <= SHIFT_IN(6 downto 0)&MISO;
                end if;
            end if;
        end process;
        
        process(CLC,WR_EN,COUNTER(3))
        begin
            if CLC'event and CLC = '0' then
                if WR_EN = '1' then
                    SHIFT_OUT <= DI;
                else
                    if COUNTER(3) = '0' then
                        SHIFT_OUT(7 downto 0) <= SHIFT_OUT(6 downto 0)&'1';
                    end if;
                end if;
            end if;
        end process;

        process(CLC,START_SYNC,COUNTER_EN)
        begin
            if START_SYNC = '1' then
                COUNTER <= "1110";
            else
                if CLC'event and CLC = '0' then
                    if COUNTER_EN = '1' then
                        COUNTER <= COUNTER+"0001";
                    end if;
                end if;
            end if;
        end process;

end spi_rtl;