分配具有初始值的reg

时间:2016-12-16 08:19:02

标签: verilog fpga system-verilog vivado

我在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的先前位置,但是它会给出错误

  

变量redBlcok由连续和程序分配编写

我正在使用Vivado进行实施

这是我所说的10秒视频

http://sendvid.com/ei5bfqc3

1 个答案:

答案 0 :(得分:3)

您正在使用连续分配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已到达显示边缘的情况。