Первый: вы должны использовать неблокирующие назначения в синхронизированном разделе. <=
В вашем случае вы говорите мне, что у вас есть 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 синхронен с пиксельными часами.
- Этот код не имеет сброса, который, кажется, стал нормой в коде ПЛИС, но который я лично осуждаю.