【问题标题】:How to find middle point between 2 pulses in Verilog in an FPGA?如何在 FPGA 的 Verilog 中找到 2 个脉冲之间的中间点?
【发布时间】:2019-04-14 15:48:35
【问题描述】:

我正在尝试在视频流中找到 hsync 脉冲之间的中点。在 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 脉冲的宽度恰好为一个时钟周期或更短时才会起作用。

【问题讨论】:

    标签: verilog fpga hdmi


    【解决方案1】:

    首先:您应该在时钟部分使用非阻塞分配。 &lt;=

    在您的情况下,您告诉我您的 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 代码中的规范,但我个人对此表示遗憾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2020-04-20
      • 2019-05-26
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多