Вопрос в следующем:
есть код который конвертирует последовательность из 8-битного серийного потока (т.е. байтный поток, один байт за другим) в параллельные слова каждые 3 последовательных байта.
Т.е. первые 2 байта загружаются в промеж. регистры, затем по третьему байту - все 3 считываются параллельно на выходе в соотв. раскладе.
В принципе, все работает в симуляции как надо, но начало работы конвертора динхронизировано с определенным сигналом. Фронт данного enable синхронизирован с фронтом первого релевантного клока.
Первый байт данных в потоке синхронизирован тоже по фронту того-же клока, т.е. должен загружаться в первый промеж. регистр по спаду первого клока.
Т.е. по фронту первого клока получаем enable, по его спаду должны загрузить первое данное в регистр.
Далее все продолжается синхронно, по каждому спаду идет загрузка в цепочку из 2х регистров, по каждому 3ему спаду - считывает параллельное данное.
Проблема в следующем: при симуляции вижу получив enable на первом клоке (по его фронту), загрузка не начинается по спаду того-же клока, а только по спаду следующего (второго) клока, т.е. пропускается первый байт потока. Пока не пойму почему. Клок достаточно медленный (примерно 20-25 MHz), 50% duty cycle, симуляция: post-route functional.
Вот релевантный кусок кода:
Код
process(nRST, IN_CLK, DV) --Input FIFO - buffering input RGB sequence
begin
if nRST = RST_pol or DV = not DV_active then
r0 <= x"00";
r1 <= x"00";
RGB_OUT <= x"0000";
elsif IN_CLK'event and IN_CLK = '0' then --FIFO is chain-loaded upon falling edge
r0 <= RGB_IN; --G sample (8 bits), 6 MSB bits will be picked
r1 <= r0; --R sample (8 bits), 5 MSB bits will be picked
if out_load_en = '1' then --loading the output RGB buffer (parallel RGB)
RGB_OUT <= r1(7 downto 3) & r0(7 downto 2) & RGB_IN(7 downto 3);
end if;
end if;
end process;
Пока не пойму что мешает по получении enable по фронту клока начать загруску по спаду того-же клока...?
Спасибо