分配具有初始值的 reg

Assign reg which has initial value

我正在 8x8 led 矩阵上使用 basys 3 实现俄罗斯方块游戏。

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

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

这段代码正在运行,当我向右按下按钮时,led 矩阵上的红块向右移动,但它当然会回到初始位置,因为条件 0 等于 backupRed

我真正想要的是

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

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

应该更新 redBlock 的先前位置但它给出错误

Variable redBlcok is written by both continuous and procedural assigments

我正在使用 Vivado 进行实现

这是我的意思的 10 秒视频

http://sendvid.com/ei5bfqc3

您正在使用连续赋值 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是原始按钮输入:

首先,您需要synchronize您的按钮输入。

如果您的时钟相对于 toRight 的持续时间较慢,您可能需要捕获短脉冲并生成一个时钟周期长脉冲。

如果您的时钟相对于 toRight 的持续时间来说比较快,您可能需要添加一个计数器,以确保单次按下按钮不会增加太多 redBlock每按一次。

此外,您可能需要处理 redBlock 已到达显示器边缘的情况。