得到vpos和hpos out vsync和hsync

时间:2016-03-16 16:10:37

标签: vhdl fpga vga

对于一个项目,我得到了一个分辨率为1024 * 600的屏幕。对于这个项目,我需要一个20px * 20px和红色的squarre。我试图从hsync en vsync脉冲中获取我的verticale pos en horizo​​ntale pos但这不起作用。有人有解决方案吗?

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;

1 个答案:

答案 0 :(得分:1)

如果没有一些额外的细节,很难说出你想要做什么。

但是,我确实注意到您的流程仅对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个计数器。在边缘检测之前确保输入已正确注册,以帮助避免元稳定情况。