24C512 это ивасевые микрухи (I2C). У них вроде протокол другой.
А ПЛИС альтеровские или может Xilinx или еще какие?
Вид для печати
Народ, вопрос по Кактусу. Можно ли настроить его чтобы он в отчетах показывал как он преобразует исходный текст в логическое представление, т.е. его логический синтез. Вот в Мах Plus в файле с расширением rpt это можно увидеть.
А как бы в Кактусе такое провернуть.
А то заткнулся на одной вещи, понять не могу во что он ее синтезирует.
Спрошу и я: возможно ли у Cyclone II включить On-Chip Termination (встроенный последовательный резистор) для выхода типа Open Drain?
Так, мой вопрос остался без ответа, попробуем по другому.
Я попытался переложить интерфейс 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;
А объясни как в твоем языке происходит инкремент счетчика - в VHDL коде там в последней секции он инкрементится
а в твоем куске он только присваивается но никаких движняков именно по изменению, я в коде не вижу. Может конечно в AHDL есть какое то автоинкрементирование - но я в этом сомневаюсь.Код:if CLC'event and CLC = '0' then
if COUNTER_EN = '1' then
COUNTER <= COUNTER+"0001";
---------- Post added at 09:51 ---------- Previous post was at 09:29 ----------
Ага тормозю - нашел!
твой код :
попробуй переписать как :Код:IF SD_count_en ==1 THEN
SD_count[].d = SD_count[].q+1;
Синтаксис я мог нарушить ( не знаю его ) но идея думаю ясна.Код:IF SD_count_en ==1 THEN
IF SD_count[].d == 7 THEN SD_count[].d=0;
ELSE
SD_count[].d = SD_count[].q+1;
Это если должно считать 8 раз от 0 до 7.
И вопросы по .d и .q не понятно - почему разная разрядность до и после присваивания (SD_count[].d = SD_count[].q+1). если я правильно врубаюсь - это дабл и квад ? По идее оно должно быть одинаковым. А приведение сделать потом, типа and 7 если надо только 3 разряда. Но вообще - желательно просто ввести условие дополнительное а операнды делать равными по ширине. для данного случая - 4 бита.
В смысле разная разрядность.
Счетчик в данном примере основан на D триггерах, у которых
.d - это D-вход,
.q - это выход
[] тоже самое что и [3..0] - тоесть применительно ко всем разрядам
А запись SD_count[].d = SD_count[].q+1 равносильна записи в VHDL как SD_count = SD_count+1
Ух как все интересно .
Я не увидел что это обращение к полям структуры.
Теперь понятно. Но вопросы - остаются.
И все таки попробуйте ввести проверку о которой я написал - если код равен 7 на выходе тригера при необходимости увеличить счетчик - присваивать входу значение 0. А то я так и не понял - было ли это сделано или нет.
Откопал у себя в завалах старенький даташит на CPLD MAX3000A. Там внятно расписан часто возникающий вопрос о совместимости любимых народом EPM3032, 3064, 3128 с пятивольтовым окружением. Раздел Output Configuration.
В упрощенном переводе с ангельского - чипы полностью толерантны к пятивольтовым входным сигналам, танцы с бубном не требуются. Выходные сигналы (при питании ядра 3.3вольт) - вполне укладываются для подключения к пятивольтовой логике. В общем, ничего нового, просто для закрепления информации :)
a Mick то куда пропал ? Одолел интересно или нет? Вернее даже добавил сброс счетчика при переходе через 7 или оставил переполняться?