IF语句在vhdl进程中不起作用

时间:2018-10-24 22:51:37

标签: vhdl

由于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,...

有人知道吗? 谢谢您的帮助

1 个答案:

答案 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;