首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VHDL -从VGA的帧缓冲区读取

VHDL -从VGA的帧缓冲区读取
EN

Stack Overflow用户
提问于 2016-03-03 10:16:42
回答 1查看 1.1K关注 0票数 0

我有一个FPGA学校的项目,我有一些问题。我们使用的是Digilent的Nexys2板(Xilinx XC3S500E FPGA)。

我们构建了一些控制器,包括带有帧缓冲区的VGA (640x480)。至少我们称它为帧缓冲区--它实际上是一个分布式的30x40内存,存储要显示的像素(1位--“一平方”,所以我们实际上有30×40分辨率,没有颜色)。

然后,我们使用了8位的Picoblaze微控制器核心,现在我们必须建立一个蛇游戏(你知道的,从旧的Nokias)。现在我的问题是Picoblaze只有64字节的抓痕板RAM,所以如果我把它放在里面的话,蛇就不会长了。

所以我想我可以从VGA的RAM里读到蛇的位置,但是我不知道怎么读,因为VGA是从它读取的,还有寻址或读取整行数据的问题(picoblaze有一个8位的in_port)。下面是一个过程:

代码语言:javascript
复制
process(clk_i, vert_data_on, hor_data_on, read_data)
begin
    if vert_data_on = '1' and hor_data_on = '1' then
        if read_data(conv_integer(column_calc)) = '1' then
            red_o <= "000";
            green_o <= "000";
            blue_o <= "00";
        else
            red_o <= "111";
            green_o <= "111";
            blue_o <= "11";
        end if;
    else            
        red_o <= "000";
        green_o <= "000";
        blue_o <= "00";
    end if;
end process;

RAM组件及其实例:

代码语言:javascript
复制
component RAM30x40 is
    Port(
        clk_i           : in  STD_LOGIC;
        we_i            : in  STD_LOGIC;
        addrInX_i       : in  STD_LOGIC_VECTOR(5 downto 0);
        addrInY_i       : in  STD_LOGIC_VECTOR(4 downto 0);
        addrOutY_i      : in  STD_LOGIC_VECTOR(4 downto 0);
        data_i          : in  STD_LOGIC;
        data_o          : out STD_LOGIC_VECTOR(0 to 39)
    );
end component;

inst_RAM: RAM30x40
Port map(
    clk_i           => clk_i,
    we_i            => write_enable,
    addrInX_i       => write_addr_x,
    addrInY_i       => write_addr_y,
    addrOutX_i      => read_addr_x,
    addrOutY_i      => row_calc,
    data_i          => write_data,
    data_o          => read_data
);

如何在个人电脑中解决这个问题?从显卡的记忆中读取是常见的吗?我在这里有什么选择?我可以使用带两个时钟的块RAM,其中一个用于VGA的读取,另一个用于微微发光,但我不知道,也无法找到如何正确地产生另一个时钟信号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-04 16:27:38

我只需要定义第二个读取端口,该端口仅在回放过程中处于活动状态,如下所示:

代码语言:javascript
复制
process(clk_i, vert_data_on, hor_data_on, read_data)
begin
    if vert_data_on = '1' and hor_data_on = '1' then
        if read_data(conv_integer(column_calc)) = '1' then
            red_o <= "000";
            green_o <= "000";
            blue_o <= "00";
        else
            red_o <= "111";
            green_o <= "111";
            blue_o <= "11";
        end if;
        data2_valid <= '0';
    else            
        red_o <= "000";
        green_o <= "000";
        blue_o <= "00";

        read_data2 <= conv_integer(read_request2);
        data2_valid <= '1';
    end if;
end process;

然后,data2_valid将为来自read_request2地址的有效数据定义触发器。但是,您可能应该在clk_i上触发这个进程,而不是反激信号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35769233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档