差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
乒乓球游戏 [2020/07/09 09:17] zili |
乒乓球游戏 [2020/07/09 09:19] (当前版本) zili |
||
---|---|---|---|
行 55: | 行 55: | ||
\\ | \\ | ||
####我们的第一个视频生成器 | ####我们的第一个视频生成器 | ||
- | 如今,VGA监视器是多同步的,因此可以适应非标准频率-不再需要精确地生成60Hz和31.5KHz(但是,如果您使用的是旧的(非多同步)VGA监视器,则需要生成精确的频率)。 | + | 如今,VGA监视器是多同步的,因此可以适应非标准频率-不再需要精确地生成60Hz和31.5KHz(但是,如果您使用的是旧的(非多同步)VGA监视器,则需要生成精确的频率)。\\ |
- | \\ | + | |
- | 让我们从X和Y计数器开始。 | + | 让我们从X和Y计数器开始。\\ |
- | \\ | + | |
<code verilog> | <code verilog> | ||
reg [9:0] CounterX; | reg [9:0] CounterX; | ||
行 77: | 行 77: | ||
\\ | \\ | ||
- | CounterX计数768个值(从0到767),CounterY计数512个值(0到511)。 | + | CounterX计数768个值(从0到767),CounterY计数512个值(0到511)。\\ |
- | \\ | + | |
- | 现在,使用CounterX生成HS,使用CounterY生成VS。使用25MHz时钟,HS的频率为32.5KHz,VS的频率为63.5Hz。脉冲需要激活足够长的时间,以使监视器能够检测到它们。让我们为HS使用16个时钟脉冲(0.64µs),为VS使用完整的水平线长脉冲(768个时钟或30µs)。这比VGA规范所要求的要短,但仍然可以正常工作。 | + | 现在,使用CounterX生成HS,使用CounterY生成VS。使用25MHz时钟,HS的频率为32.5KHz,VS的频率为63.5Hz。脉冲需要激活足够长的时间,以使监视器能够检测到它们。让我们为HS使用16个时钟脉冲(0.64µs),为VS使用完整的水平线长脉冲(768个时钟或30µs)。这比VGA规范所要求的要短,但仍然可以正常工作。\\ |
- | \\ | + | |
- | 我们从D触发器生成HS和VS脉冲(以获得无毛刺输出)。 | + | 我们从D触发器生成HS和VS脉冲(以获得无毛刺输出)。\\ |
- | \\ | + | |
<code verilog> | <code verilog> | ||
行 101: | 行 100: | ||
</code> | </code> | ||
\\ | \\ | ||
- | 最后,我们可以驱动R,G和B信号。首先,我们可以使用X和Y计数器的一些位来获得漂亮的正方形颜色图案... | + | 最后,我们可以驱动R,G和B信号。首先,我们可以使用X和Y计数器的一些位来获得漂亮的正方形颜色图案...\\ |
- | \\ | + | |
<code verilog> | <code verilog> | ||
行 116: | 行 114: | ||
####画有用的图片 | ####画有用的图片 | ||
最好将同步生成器重写为HDL模块,以便在外部生成R,G和B。同样,如果X和Y计数器从绘图区域开始计数,它们将更加有用。 | 最好将同步生成器重写为HDL模块,以便在外部生成R,G和B。同样,如果X和Y计数器从绘图区域开始计数,它们将更加有用。 | ||
- | 可以在[[https://www.fpga4fun.com/files/hvsync_generator.zip|这里]]找到新文件。 | + | 可以在[[https://www.fpga4fun.com/files/hvsync_generator.zip|这里]]找到新文件。\\ |
- | \\ | + | |
- | 现在,我们可以使用它在屏幕周围绘制边框。 | + | 现在,我们可以使用它在屏幕周围绘制边框。\\ |
- | \\ | + | |
<code verilog> | <code verilog> | ||
行 152: | 行 149: | ||
####画桨 | ####画桨 | ||
- | 让我们使用鼠标在屏幕上左右移动操纵杆。 | + | 让我们使用鼠标在屏幕上左右移动操纵杆。\\ |
- | \\ | + | |
- | 该[[https://www.fpga4fun.com/QuadratureDecoder.html|解码器正交]]页面显示的秘密。代码如下: | + | 该[[https://www.fpga4fun.com/QuadratureDecoder.html|解码器正交]]页面显示的秘密。代码如下:\\ |
- | \\ | + | |
<code verilog> | <code verilog> | ||
行 179: | 行 175: | ||
</code> | </code> | ||
- | 现在知道“ PaddlePosition”的值,我们可以显示桨了。 | + | 现在知道“ PaddlePosition”的值,我们可以显示桨了。\\ |
- | \\ | + | |
<code verilog> | <code verilog> | ||
行 193: | 行 188: | ||
####画球 | ####画球 | ||
- | 球需要在屏幕上移动,并在碰到物体(边界或球拍)时反弹。 | + | 球需要在屏幕上移动,并在碰到物体(边界或球拍)时反弹。\\ |
- | \\ | + | |
- | 首先,我们展示球。它是16x16像素的正方形。当CounterX和CounterY到达其坐标时,我们将激活球的绘制。 | + | 首先,我们展示球。它是16x16像素的正方形。当CounterX和CounterY到达其坐标时,我们将激活球的绘制。\\ |
- | \\ | + | |
<code verilog> | <code verilog> | ||
行 232: | 行 226: | ||
</code> | </code> | ||
- | (我通过从未重置碰撞触发器来简化了上面的代码,下面提供了完整的代码)。 | + | (我通过从未重置碰撞触发器来简化了上面的代码,下面提供了完整的代码)。\\ |
- | \\ | + | |
- | 现在,我们更新球的位置,但每个视频帧仅更新一次。 | + | 现在,我们更新球的位置,但每个视频帧仅更新一次。\\ |
- | \\ | + | |
<code verilog> | <code verilog> |