ЕСЛИ оператор не работает в VHDL-процессе - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь отобразить анимированное изображение на экране, благодаря порту VGA на плате FPGA.

Итак, у меня есть объект с именем 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 первых спрайта и остановить его, когда он достигнет 550-го пикселя в xи шоу 4-й спрайт.Так что я должен иметь для val: 00, 01, 10, 00, 01, 10, 00 ........ и затем 11, когда 550 достигнет posXX.

Итак, я усталиспользуйте мой процесс, который также управляет временем между двумя изображениями:

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 голосов
/ 25 октября 2018

Сравнение 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;
...