Так, мой вопрос остался без ответа, попробуем по другому.
Я попытался переложить интерфейс SD карты, написанный на vhdl Keeper на AHDL.
Но нифига не работает зараза и не врублюсь почему.
Может кто незамутненным взглядом найдет ошибку.
Вот мой кусок кода
Почему то cчетчик SD_count доходя до 8 не останавливается и продолжает считать.Код:------------------------------------------------------------------------------------ -- Интерфейс 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;
А вот исходный вариант на 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;




Ответить с цитированием