Определение начала кадра

Я реализовал передатчик и приемник HDMI на плате Atlys Spartan 6. Он работает правильно. Я использую 1080p @ 60 Гц. Плата берет один пиксель, декодирует его, кодирует обратно и отправляет на монитор.

Теперь мне нужно определить начало нового кадра. Потому что я хочу нарисовать квадрат посередине экрана (используя FPGA). Я думал, что когда HSYNC и VSYNC равны «1», это означает начало нового кадра. Но похоже, что это не так.

Может ли кто-нибудь сказать мне, как определить начало нового кадра HDMI?

Спасибо!


person user2389323    schedule 25.11.2013    source источник
comment
Там, где значения HSYNC и VSYNC равны «1», фактически должно быть началом нового кадра. Вы ищете положительное преимущество в обоих этих сигналах?   -  person Russell    schedule 26.11.2013
comment
Спасибо за ответ... всегда @ (posedge pclk) begin if(h_sync & v_sync) begin start = 1'b1; конец Это часть кода. pclk — это clk пикселя.   -  person user2389323    schedule 26.11.2013
comment
прочитайте этот пост о поиске краев. Способ, который вы описали в своем комментарии, недостаточен. Вам нужно зарегистрировать предыдущее значение сигнала, текущее значение сигнала и искать условие, когда предыдущее значение = 0, а текущее значение = 1. stackoverflow.com/questions/8413661/.   -  person Russell    schedule 26.11.2013
comment
Идея моей части кодирования заключается в том, что она начнет считать кадры с нуля вскоре после обнаружения (h_sync и v_sync). Эти два провода выходят из выходного регистра модуля декодирования. После того, как я впервые установил переменную «start» в «1», я начинаю считать. Так почему не правильно?   -  person user2389323    schedule 26.11.2013


Ответы (1)


Начало нового кадра после того, как VSYNC изменился на «1» и позже (или в то же время, это зависит от вашего источника данных) HSYNC также изменился на «1».

Вам нужно обнаружить края. В VHDL такой процесс:

process(clk)
   variable last_hsync, last_vsync, got_vsync : std_logic;
begin
   if rising_edge(clk) then
       if vsync = '1' and last_vsync = '0' then
           got_vsync := '1';
       end if;
       if got_vsync and hsync = '1' and last_hsync = '0' then
           first_pixel <= '1';
       end if;
       last_vsync := vsync;
       last_hsync := hsync;
    end if;
end process;

Это может указывать на ложное начало кадра, если вы подходите к середине кадра — вам может понадобиться дополнительное состояние для управления этими случаями, если это имеет значение, но это зависит от системы.

person Martin Thompson    schedule 26.11.2013
comment
@ user2389323: рад помочь - зеленая галочка - уже спасибо :) - person Martin Thompson; 27.11.2013