获取 vpos 和 hpos 出 vsync 和 hsync

get vpos and hpos out vsync and hsync

对于一个项目,我得到了一个分辨率为 1024*600 的屏幕。对于这个项目,我需要一个 20px *20px 的红色正方形。我试图从 hsync en vsync 脉冲中获取我的垂直位置和水平位置,但这不起作用。有人有解决方案吗?

process(int_hsync, int_vsync)
begin
 if Rising_Edge(int_vsync) then
    vsync <= 0;
 elsif Rising_Edge(in_clk) then
    vsync <= vsync+1;
 end if;
 if Rising_Edge(int_hsync) then
    hsync <= 0;
 elsif Rising_Edge(in_clk) then
    hsync <= hsync+1;
 end if;
end process;

process(in_clk)
begin
    if Rising_Edge(in_clk) then
        if hsync < 20 and vsync <20 then
            int_pixel   <= X"0000ff";
        else
            int_pixel   <= X"ff0000";
        end if;
    end if;
end process;

如果没有一些额外的细节,很难说出你正在尝试做什么。

但是,我确实注意到您的过程仅对 int_hsyncint_vsync 敏感,而您正在寻找 in_clk 的 rising_edge。你应该做一个类似于此的边缘检测,而不是(假设 in_clk 比 hsync 和 vsync 快得多):

process(in_clk)
begin
  if rising_edge(in_clk) then
     int_vsync_dly <= int_vsync;
     int_hsync_dly <= int_hsync;
     if int_vsync = '1' and int_vsync_dly = '0' then -- rising edge detect
        vsync <= 0;
     else
        vsync <= vsync+1;
     end if;

     if int_hsync = '1' and int_hsync_dly = '0' then -- rising edge detect
        hsync <= 0;
     else
        hsync <= hsync+1;
     end if;
  end if;
end process;

每次观察到相应触发信号的上升沿时,vsynchsync 计数器都会递增。请确保在边缘检测之前正确注册输入,以帮助避免亚稳态情况。