Как найти среднюю точку между двумя импульсами в Verilog в FPGA? - PullRequest
1 голос
/ 14 апреля 2019

Я пытаюсь найти среднюю точку между синхроимпульсами в видеопотоке. Между синхроимпульсами много "тактовых импульсов". Как я могу получить импульс или сигнал точно в средней точке между двумя синхроимпульсами? По сути, я хочу найти горизонтальный центр экрана. Вот что у меня есть:

reg [30:0] count;
reg [30:0] counter;
wire left;

always @(posedge pixclk)
    begin
        if (hsync == 1'b1)
        begin
            count = counter;
            counter = 1'b0;
        end
        else
        begin
            counter = counter + 1;
        end
    end

assign left = (counter < (count / 2) ? 1'b1 : 1'b0);

Во-первых, я не знаю, является ли это концептуально правильным способом сделать это. Во-вторых, если hsync удерживается на низком уровне более одного цикла pixclk, то счетчик всегда будет равен нулю. Он будет работать только в том случае, если длительность импульса hsync составляет ровно один такт или менее.

1 Ответ

2 голосов
/ 14 апреля 2019

Первый: вы должны использовать неблокирующие назначения в синхронизированном разделе. <=

В вашем случае вы говорите мне, что у вас есть hsync, который длиннее, чем ваши пиксельные часы. Одним из способов является подсчет импульсов при низком уровне синхронизации и сохранение результата при высоком уровне. Это потребовало бы небольшого Fine-State-Machine (FSM) с двумя состояниями

Однако я лично считаю, что создание Fine-State-Machines - это бремя, которого следует избегать. Итак, вот что я бы сделал:
Определите край hysnc (когда он поднимется высоко или когда он опустится) и посчитайте между краями. Вот ядро ​​кода:

reg hsync_one_cycle_delayed;

always @(posedge pixclk)
begin
    hsync_one_cycle_delayed <= hsync;

    if (hsync==1'b1 && hsync_one_cycle_delayed==1'b0)
    // We have a detected a rising edge on hsync
    begin
        count <= counter;
        counter <= 31'h0;
    end
    else
        counter <= counter + 1;
end

Некоторые последние заметки:

  • Предполагается, что hsync синхронен с пиксельными часами.
  • Этот код не имеет сброса, который, кажется, стал нормой в коде ПЛИС, но который я лично осуждаю.
...