Простой флаг в VHDL [Ошибка 10820]

Я хочу разработать сниффер IIC на VHDL, и я борюсь с очень простым моментом.

Чтобы сохранить его «последовательным», я хочу установить флаг после каждой части, которая будет выполняться сущностью.

Теперь я хочу установить флаг в состоянии START (SCL = HIGH & RISING_EDGE на SDA). Этот флаг должен быть сброшен в состоянии STOP (SCL = HIGH & FALLING_EDGE на SDA) и когда я нажимаю кнопку сброса.

Теперь у меня проблема, что я не могу установить флаг командой START и сбросить командой STOP.

Как мне подойти, чтобы получить флаг на этот период?

entity scltest is
port(   scl, sda: in std_logic;
        scled, sdaled, flag: out std_logic
        );
end scltest;

architecture test of scltest is
begin 
scled <= scl;
sdaled <= sda;

process(sda)
begin
if (scl = '1' AND rising_edge(sda)) then
flag <= '1';
else
    if (scl = '1' AND falling_edge(sda)) then
    flag <= '0';
    end if;
end if;
end process;

end test;

Этот код не работает, потому что: «Ошибка (10820): ошибка списка соединений в scltest.vhd (18): невозможно определить регистр для флага, поскольку его поведение зависит от границ нескольких отдельных часов».

Я понимаю, почему это не сработает, но я не могу придумать конструкцию, которая будет работать и даст мне ту же функцию.

Заранее спасибо.


person Hundevadda    schedule 24.02.2017    source источник


Ответы (1)


Ваша основная идея, кажется, заключается в том, что вы хотите сделать всю свою логику с автобусными часами. Однако ваш проект не должен полностью зависеть от тактовой частоты шины, тем более что I²C очень медленный.

Вам понадобится работающая система, которая может выполнять другие задачи (например, USB, USART...), чтобы сообщать вашей хост-системе (ПК, SoC...) о состоянии шины I²C.

С этой целью вам нужно будет сэмплировать как SCL, так и SDA, и иметь ядро, тактируемое вашими системными часами, для фактического анализа нарастающих/спадающих фронтов, состояний шины и т. д. Таким образом, вся ваша логика будет синхронизирована с вашими системными часами. .

В зависимости от вашей платы разработки могут существовать примеры проектов, которые уже имеют готовую хост-сторону, и вам нужно будет только «подключить» свой модуль в нужном месте. Хорошей отправной точкой, IMHO1, была бы одна из плат Digilent Spartan, поскольку код на стороне хоста находится в свободном доступе с инструментами и программным API.

1 Я никоим образом не связан с Digilent.

person FRob    schedule 24.02.2017
comment
Спасибо за ваш ответ. Означает ли это, что я должен реализовать детектор границ самостоятельно? - person Hundevadda; 24.02.2017
comment
Да, это то, что будет включать в себя сниффер автобуса. - person FRob; 28.02.2017