Назначить reg, который имеет начальное значение

Я реализую игру тетрис, используя basys 3 на светодиодной матрице 8x8.

reg [7:0]redBlock;
reg [7:0]backupRed= 8'b00011000;
reg [7:0]temp;

assign redBlock=(toRight& oe) ? backupRed>> 1 : backupRed;

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

Чего я действительно хочу, так это

reg [7:0]redBlock = 8'b00011000;;
reg [7:0]backupRed;
reg [7:0]temp;

assign redBlock=(toRight& oe) ? redBlock>> 1 : redBlock;

который должен обновить предыдущее местоположение redBlock, но выдает ошибку

Переменная redBlcok записывается как непрерывными, так и процедурными присваиваниями.

Я использую Vivado для реализации

Вот 10-секундное видео того, что я имел в виду

http://sendvid.com/ei5bfqc3


person Emre    schedule 16.12.2016    source источник
comment
См. ответы здесь и здесь.   -  person Matthew Taylor    schedule 16.12.2016


Ответы (1)


Вы используете непрерывное присвоение assign для описания данных, которые вы хотите сохранить.

Непрерывные присваивания используются для описания комбинаторной логики, но здесь вам нужна последовательная логика, регистр (триггер).

Что-то в этом роде:

reg [7:0]redBlock = 8'b00011000;

always @(posedge ck or posedge rst) begin
  if(rst)
    redBlock <= 8'b00011000;
  else
    redBlock <= (toRight& oe) ? redBlock>> 1 : redBlock;
end

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

Не уверен, что это за сигнал toRight, если предположить, что toRight - это необработанная кнопка ввода:

Во-первых, вам нужно синхронизируйте ввод вашей кнопки.

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

Если ваши часы спешат по отношению к длительности toRight, вам может понадобиться добавить счетчик, который может гарантировать, что одно нажатие кнопки не увеличивает redBlock слишком сильно за одно нажатие.

Кроме того, вам может понадобиться обработать случай, когда redBlock достигла края вашего дисплея.

person Hida    schedule 16.12.2016