Все значения изменяются в массиве с использованием vhdl

Я пытаюсь разбить кирпич в VHDL. Все прошло хорошо, но у меня странная проблема. В фрагменте моего кода, который вы видите ниже, я меняю значение на «0» в индексе (y, x) в моем массиве, когда мяч достигает краев кирпича. Проблема в том, что все значения в моем массиве меняются на 0, даже когда мяч не движется (при запуске программы мяч не движется).

process(Ball_x1,Ball_x2,Ball_y1,Ball_y2) begin
    x1 <= 280 + (x * 55); --edges of my brick
    x2 <= 280 + ((x + 1) * 55);
    y1 <= 108 + (y * 13);
    y2 <= 108 + ((y + 1) * 13);
    waardeArray := level1(y,x);
    if (vcnt >= y1) and (vcnt <= y2) then 
        if (Ball_x1 >= x1) and (Ball_x1 <= x2) then -- edges of my ball
            if waardeArray = '1' then
                level1(y,x) := '0';
            end if;
        end if;
    end if;
end process;

Объявление моего массива

type levels is array ( 0 to 3, 0 to 5 ) of bit;
shared variable level1 : levels := (
                                     ('1','0','0','0','0','1'),
                                     ('0','1','0','0','1','0'),
                                     ('0','0','1','1','0','0'),
                                     ('0','0','1','1','0','0')

                                     );

Следующая переменная используется для хранения значения массива на месте (y,x)

shared variable waardeArray: bit;

Я также намерен использовать Ball_x2 и т. Д., Но я только что попробовал с 1 краем своего мяча, чтобы протестировать код.

Обновить

process(Ball_x1,Ball_x2,Ball_y1,Ball_y2) begin
    x1 <= 280 + (x * 55); -- edges of my brick
    x2 <= 280 + ((x + 1) * 55);
    y1 <= 108 + (y * 13);
    y2 <= 108 + ((y + 1) * 13);
    if (vcnt >= y1) and (vcnt <= y2) then --vcnt is from another component where I send my data to my screen
        if (Ball_x1 >= x1) and (Ball_x1 <= x2) then -- left edge of my ball
            if level1(y)(x) = '1' then
                level1(y)(x) <= '1';  --I do this to test if the elements with value 1 stay 1 and the 0 stay 0 ata initialization, but every element in my array change to 1.
            else
                level1(y)(x) <= level1(y)(x);
            end if;
        end if;
    end if;
end process;

Декларации

signal x: integer range 0 to 6 := 0;    --Six is used for something else.
signal y: integer range 0 to 3 := 0;    

signal x1: integer range 279 to 616;
signal x2: integer range 279 to 616;
signal y1: integer range 107 to 228;
signal y2: integer range 107 to 228;

signal color: std_logic_vector (7 downto 0) := "00000111";

type levels is array ( 0 to 3) of std_logic_vector (5 downto 0);
signal level1 : levels :=  ("101101",
                                     "010010",
                                     "001100",
                                     "001100");

это мое намерение

введите здесь описание изображения


person GCallie    schedule 15.12.2013    source источник
comment
Какой массив изменяется; это waardeArray или level1 ? Трудно углубиться в это, по крайней мере, без объявлений, поэтому вы можете рассмотреть возможность публикации всего соответствующего кода. Кроме того, в процессе используется только первый аргумент в списке чувствительности процесса, поэтому последние три, начиная с Ball_x2, можно удалить. Вы можете найти полезную информацию в ответах stackoverflow.com/a/20492018/2352082 и stackoverflow.com/a/20526229/2352082.   -  person Morten Zilmer    schedule 15.12.2013
comment
С общей переменной она может быть обновлена ​​в другом процессе, поэтому, возможно, вам придется искать в другом месте, где внесены изменения.   -  person Morten Zilmer    schedule 15.12.2013
comment
В других процессах я использую только значение своего массива, ничего не меняю. Только в этом процессе.   -  person GCallie    schedule 15.12.2013


Ответы (1)


Не используйте общие переменные. Если вам нужно передать значение между процессами, используйте сигнал. Вы не можете быть уверены в порядке, в котором происходят обновления по сравнению с чтением с использованием общих переменных. Ну, вы можете, но вы должны использовать защищенные типы.

Кроме того, в вашем процессе вы просматриваете значения x, y и vcnt. Но эти сигналы (надеюсь, это сигналы, а не общие переменные :) не входят в список чувствительности процесса, поэтому, когда они изменятся, ваш процесс не будет запущен.

person Martin Thompson    schedule 15.12.2013
comment
Я изменил все свои общие переменные на сигналы, но даже тогда все мои элементы в моем массиве меняются на 1. Процесс должен начинаться только тогда, когда мяч движется, а не когда я меняю индекс своего массива. Я также изменил свой массив на одномерный массив с элементами STD_LOGIC_VECTOR и изменил значения STD_LOGIC_VECTOR, но даже тогда у меня та же проблема. - person GCallie; 16.12.2013
comment
Можете ли вы отредактировать свой вопрос, чтобы включить код в том виде, в котором он есть сейчас. И ваш тестовый стенд, и некоторые моделирующие сигналы, показывающие, когда элементы изменяются на «1» по сравнению с другими интересующими сигналами? - person Martin Thompson; 16.12.2013
comment
Никаких тестовых стендов я пока не делал. Я не очень хорошо разбираюсь в VHDL, однако, я должен сделать это в ближайшее время. - person GCallie; 16.12.2013
comment
Как вы видите, что ваши сигналы меняются на все 1 без тестового стенда? - person Martin Thompson; 16.12.2013
comment
Если элемент равен единице, на моем экране должен отображаться кирпич, иначе, если элемент равен нулю, должно быть пустое место (без кирпича). - person GCallie; 16.12.2013
comment
Ааа, вы все это делаете в ПЛИС? Я настоятельно рекомендую запустить какой-то тестовый стенд, хотя это немного сложно заранее, это намного быстрее, чем старый цикл написания кода, синтеза, размещения и маршрутизации, тестового цикла! И отличный набор навыков :) - person Martin Thompson; 16.12.2013
comment
Хорошо, я попробую найти проблему с помощью тестовых стендов. Спасибо! - person GCallie; 16.12.2013