如何在 FPGA 的 Verilog 中找到两个脉冲之间的中点?
How to find middle point between 2 pulses in Verilog in an FPGA?
我试图找到视频流中 hsync 脉冲之间的中点。 hsync 脉冲之间有许多 "pixel clocks"。如何准确地在两个 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
脉冲的宽度正好是一个时钟周期或更短时,它才会起作用。
第一:您应该在时钟部分使用非阻塞分配。 <=
在你的情况下,你告诉我你有一个 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代码中的常态,但我个人对此表示遗憾。
我试图找到视频流中 hsync 脉冲之间的中点。 hsync 脉冲之间有许多 "pixel clocks"。如何准确地在两个 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
脉冲的宽度正好是一个时钟周期或更短时,它才会起作用。
第一:您应该在时钟部分使用非阻塞分配。 <=
在你的情况下,你告诉我你有一个 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代码中的常态,但我个人对此表示遗憾。