如何在FPGA的Verilog中找到2个脉冲之间的中间点?

时间:2019-04-14 01:36:17

标签: verilog fpga hdmi

我正在尝试找到视频流中hsync脉冲之间的中点。在水平同步脉冲之间有许多“像素时钟”。如何在两个hsync脉冲之间的中点准确获得脉冲或信号?基本上,我希望能够找到屏幕的水平中心。这是我所拥有的:

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 个答案:

答案 0 :(得分:2)

首先:您应该在计时部分中使用非阻塞分配。 <=

在您的情况下,您告诉我您的hsync时间比像素时钟长。 一种方法是在hsync为低电平时计数脉冲,并在hsync为高电平时存储结果。那将需要一个小的两态精细状态机(FSM)

但是,我个人认为使精细状态机成为一个可以避免的负担。所以这就是我要做的:
检测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与像素时钟同步。
  • 此代码没有复位,这似乎已成为FPGA代码的规范,但我本人对此感到遗憾。