由于FPGA板上的VGA端口,我试图在屏幕上显示动画图像。
所以,我有一个名为sonic_digit的实体,它可以发送图像:
sonic_digit0 : sonic_digit port map(
val => val2,
posX=> posXX,
posY =>conv_std_logic_vector(300,10),
rgbOut => rgb,
beamX=>beamX,
beamY=>beamY,
beamValid=>beamValid);
val用于更改图像(要显示的精灵)。
首先,我想循环显示3个第一个精灵,并在到达x的第550个像素时停止它,并显示第4个精灵。所以我必须为val: 如果posXX到达550,则00,01,10,00,01,10,00 ........然后是11。
因此,我厌倦了使用同时管理两个图像之间时间的过程:
process (clk50) begin
if rising_edge(clk50) then
count <= count+1;
if count = conv_std_logic_vector(0,23) then
posXX <= posXX+1;
val2 <= val2+1;
if val2 = "11" then
val2 <= "00";
end if;
end if;
end if;
end process;
我的图像正确地在x中移动,但它不断增加到11,就像val2 =“ 11”的行不起作用一样... 我有00,01,10,11,00,01,10,11,...
有人知道吗? 谢谢您的帮助
答案 0 :(得分:2)
val2比较是同步的,仅在时钟的上升沿发生。因此,val2的值必须增加到“ 11”才能触发比较,因此生成的序列是“ 00”,“ 01”,“ 10”,“ 11”,“ 00” ...
如果您想省略“ 11”一词,则您的条件必须为:
if val2 = "10" then
val2 <= "00";
end if;
虽然不是严格要求,但我不喜欢流程块中的重叠分配,因此我将代码重构为:
if val2 = "10" then
val2 <= "00";
else
val2 <= val2 + 1;
end if;