差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
乒乓球游戏 [2020/07/09 09:09]
zili
乒乓球游戏 [2020/07/09 09:19] (当前版本)
zili
行 1: 行 1:
 ###​乒乓球比赛 ###​乒乓球比赛
 [[https://​www.fpga4fun.com/​PongGame.html|Pong Game]] [[https://​www.fpga4fun.com/​PongGame.html|Pong Game]]
 +\\
 +\\
 FPGA可以轻松成为视频生成器。 FPGA可以轻松成为视频生成器。
 {{ ::​ponggame.jpg |}} {{ ::​ponggame.jpg |}}
行 26: 行 28:
   * VGA连接器(HS和VS)的引脚13和14是数字信号,因此可以直接从两个FPGA引脚驱动(或通过低阻值电阻,例如10Ω或20Ω)驱动。   * VGA连接器(HS和VS)的引脚13和14是数字信号,因此可以直接从两个FPGA引脚驱动(或通过低阻值电阻,例如10Ω或20Ω)驱动。
   * 引脚1、2和3(R,G和B)是75 are模拟信号,标称值为0.7V。对于3.3V FPGA输出,请使用三个270Ω串联电阻。电阻与监视器输入中的75Ω电阻形成分压器,因此 ​   * 引脚1、2和3(R,G和B)是75 are模拟信号,标称值为0.7V。对于3.3V FPGA输出,请使用三个270Ω串联电阻。电阻与监视器输入中的75Ω电阻形成分压器,因此 ​
- * 3.3V变为3.3 * 75 /(270 + 75)= 0.72V,非常接近0.7V。以0和1的不同组合来驱动这3个引脚时,最多可以得到8种颜色。+  ​* 3.3V变为3.3 * 75 /(270 + 75)= 0.72V,非常接近0.7V。以0和1的不同组合来驱动这3个引脚时,最多可以得到8种颜色。
 接地引脚是引脚5、6、7、8和10。 接地引脚是引脚5、6、7、8和10。
 {{ ::​vgaconnector.2.gif |}} {{ ::​vgaconnector.2.gif |}}
行 37: 行 39:
 \\ \\
  
 +\\
 ####​频率发生器 ####​频率发生器
 监视器始终从上到下逐行显示图片。每条线从左到右绘制。\\ 监视器始终从上到下逐行显示图片。每条线从左到右绘制。\\
行 46: 行 49:
 对于标准640x480 VGA视频信号,脉冲频率应为: 对于标准640x480 VGA视频信号,脉冲频率应为:
 ^ 垂直频率(VS) ​      ^ 水平频率(HS) ​        ​^ ​ ^ 垂直频率(VS) ​      ^ 水平频率(HS) ​        ​^ ​
-| 60 Hz(= 60脉冲每秒) ​      |31.5 kHz(= 31500脉冲/​秒) ​       |  +| 60 Hz(= 60脉冲每秒) ​      |31.5 kHz(= 31500脉冲/​秒) ​       | 
-  +
-\\ +
 要创建标准视频信号,需要处理更多细节,例如脉冲的持续时间以及HS和VS之间的关系。在[[http://​martin.hinner.info/​vga/​|此页面]]上获得一个想法。 要创建标准视频信号,需要处理更多细节,例如脉冲的持续时间以及HS和VS之间的关系。在[[http://​martin.hinner.info/​vga/​|此页面]]上获得一个想法。
 \\ \\
行 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: 行 148:
 \\ \\
  
-\\+####​画桨 
 +让我们使用鼠标在屏幕上左右移动操纵杆。\\
  
-####​画桨 +该[[https://​www.fpga4fun.com/​QuadratureDecoder.html|解码器正交]]页面显示的秘密。代码如下:\\
-让我们使用鼠标在屏幕上左右移动操纵杆。 +
-\\ +
-该[[https://​www.fpga4fun.com/​QuadratureDecoder.html|解码器正交]]页面显示的秘密。代码如下: +
-\\+
  
 <code verilog> <code verilog>
行 182: 行 175:
 </​code>​ </​code>​
  
-现在知道“ PaddlePosition”的值,我们可以显示桨了。 +现在知道“ PaddlePosition”的值,我们可以显示桨了。\\
-\\+
  
 <code verilog> <code verilog>
行 193: 行 185:
 wire B = border | paddle; wire B = border | paddle;
 </​code>​ </​code>​
 +\\
  
 ####画球 ####画球
-球需要在屏幕上移动,并在碰到物体(边界或球拍)时反弹。 +球需要在屏幕上移动,并在碰到物体(边界或球拍)时反弹。\\ 
-\\ + 
-首先,我们展示球。它是16x16像素的正方形。当CounterX和CounterY到达其坐标时,我们将激活球的绘制。 +首先,我们展示球。它是16x16像素的正方形。当CounterX和CounterY到达其坐标时,我们将激活球的绘制。\\
-\\+
  
 <code verilog> <code verilog>
行 216: 行 207:
 </​code>​ </​code>​
  
-现在进行碰撞。那是这个项目的困难部分。 +现在进行碰撞。那是这个项目的困难部分。\\ 
-\\ + 
-我们可以检查球相对于屏幕上每个对象的坐标,并确定是否存在碰撞。但是随着对象数量的增加,这将很快成为一场噩梦。 +我们可以检查球相对于屏幕上每个对象的坐标,并确定是否存在碰撞。但是随着对象数量的增加,这将很快成为一场噩梦。\\ 
-\\ + 
-取而代之的是,我们定义4个“热点”像素,在球每侧的中间一个像素。如果物体(边界或球拍)在球绘制其“热点”之一的同时重绘自身,则我们知道球的那一侧存在碰撞。 +取而代之的是,我们定义4个“热点”像素,在球每侧的中间一个像素。如果物体(边界或球拍)在球绘制其“热点”之一的同时重绘自身,则我们知道球的那一侧存在碰撞。\\ 
-\\+
  
 <code verilog> <code verilog>
行 235: 行 226:
 </​code>​ </​code>​
  
-(我通过从未重置碰撞触发器来简化了上面的代码,下面提供了完整的代码)。 +(我通过从未重置碰撞触发器来简化了上面的代码,下面提供了完整的代码)。\\ 
-\\ + 
-现在,我们更新球的位置,但每个视频帧仅更新一次。 +现在,我们更新球的位置,但每个视频帧仅更新一次。\\ 
-\\+
  
 <code verilog> <code verilog>
行 287: 行 278:
  
 ##​轮到您尝试了! ##​轮到您尝试了!
 +\\
  
 +\\
 ####链接 ####链接
   * [[http://​excamera.com/​articles/​15/​ntsc.html|使用FPGA和两个电阻器生成NTSC复合视频]]   * [[http://​excamera.com/​articles/​15/​ntsc.html|使用FPGA和两个电阻器生成NTSC复合视频]]