我正在研究数据路径和控件(FSM),以在Verilog的VGA显示器上创建一个弹跳框,类似于旧的DVD屏幕保护程序。我在保留状态之间的x和y坐标时遇到问题,因为它们存储在寄存器中。
我的S_DRAW状态在定格时钟上将绘制信号设置为高电平。下一个状态是S_WAIT状态,表明它可以正常工作。因为每个姿势时钟只能绘制一个像素,所以我以S_DRAW状态循环,直到全部绘制了16个像素。
在以前的状态下,我设置x_start <= x和y_start <= y,这样在绘制框之后,我可以将它们恢复为原始值,然后擦除框,然后重复递增以创建“移动”效果
next_state = (do_draw) ? S_WAIT : S_DRAW
[...]
always @(*)
begin
if (draw)
begin
if ((x == x_start + 3) && (y == y_start + 3))
begin
do_draw <= 1'b1;
x <= x_start;
y <= y_start;
end
else if (x == x_start + 3)
begin
x <= x_start[7:0];
y <= y + 1'd1;
end
else
x <= x + 1'd1;
end
end
但是,在调试中,我发现x和y没有正确还原。例如,要绘制第一个框,x和y从(0,0)(左上角)开始,并绘制一个顶点为(0,0),(0,3),(3,0)的4x4框。 ,(3,3)正确。但是x和y不能从(3,3)恢复到(0,0),因此不能正确擦除。我知道我可以简单地清除屏幕,但是我希望稍微更精致一些。我可以通过调试确认,将第一次迭代的x_start和y_start设置为0。
任何帮助或见识将不胜感激。谢谢。