Я пытаюсь разбить кирпич в 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");
это мое намерение
waardeArray
илиlevel1
? Трудно углубиться в это, по крайней мере, без объявлений, поэтому вы можете рассмотреть возможность публикации всего соответствующего кода. Кроме того, в процессе используется только первый аргумент в списке чувствительности процесса, поэтому последние три, начиная сBall_x2
, можно удалить. Вы можете найти полезную информацию в ответах stackoverflow.com/a/20492018/2352082 и stackoverflow.com/a/20526229/2352082. - person Morten Zilmer   schedule 15.12.2013