我有一个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)。下面是一个过程:
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组件及其实例:
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的读取,另一个用于微微发光,但我不知道,也无法找到如何正确地产生另一个时钟信号。
发布于 2016-03-04 16:27:38
我只需要定义第二个读取端口,该端口仅在回放过程中处于活动状态,如下所示:
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上触发这个进程,而不是反激信号。
https://stackoverflow.com/questions/35769233
复制相似问题