我在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秒视频
答案 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
已到达显示边缘的情况。