使用FPGA的蛇游戏(ALTERA)

时间:2013-12-30 12:06:08

标签: verilog fpga

我计划使用Altera DE2-115进行蛇形游戏并将其显示在LED Matrix上  与视频相似的内容http://www.youtube.com/watch?v=niQmNYPiPw0 但我仍然不知道如何开始,有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

您可以选择2条实施路线:

  1. 使用软处理器(NIOS II)
  2. 以硬件描述语言([System] Verilog或VHDL)编写游戏逻辑
  3. 前者可能是实现完成游戏的最快途径,假设您已经拥有一些软件背景,但是如果您打算学习使用FPGA,则选项2可能更有益。如果您使用NIOS或其他软处理器内核,您仍然需要创建FPGA映像和外部外设接口。

    要开始使用,您需要查看电路板附带的一些示例设计。您还需要完全了解LED矩阵显示器的基础物理接口,以确定如何驱动它。然后,您希望开始将您的设计划分为合理的块 - 一个用于驱动显示的块,一个用于处理用户输入的块,一个状态的存储,游戏逻辑本身等。尝试并将它们分解为足以确定哪些接口之间的通信这些街区看起来像。

    在实现方面,对于选项1,您可能会使用名为Qsys的Altera SoC开发环境。再次使用现有的示例设计作为起点可能是快速启动并运行的最简单方法。使用选项2,您需要选择硬件描述语言([System] Verilog或VHDL或MyHDL)并在您喜欢的编辑器中编写代码。

    当您开始编写RTL代码时,您需要一种机制来模拟它。我建议为你编写的每个块编写块级模拟(理想情况是在编写RTL之前根据接口的定义编写测试)。假设您的预算有限,那么您没有太多选择:Altera将免费版本的Modelsim与Quartus工具捆绑在一起,如果使用verilog或Icarus,可以使用GHDL模拟器的开源选项VHDL。

    当每个块在很大程度上工作时,通过综合工具运行它来检查FPGA资源利用率和时序收敛(设计可以计时的最大频率)。您可能不太关心像蛇一样实施游戏的频率,但是了解您所编写的内容如何转化为FPGA实现以及对时序的影响仍然是一种很好的做法。

    您需要创建一个Quartus项目来生成FPGA位文件 - 再次使用现有的示例设计是可行的方法。这将提供引脚位置和时钟输入频率等。您可能需要编写时序约束来定义LED矩阵显示的时序,具体取决于接口。

    然后您要做的就是找出它在仿真中工作的原因,而不是在FPGA上工作;)

答案 1 :(得分:1)

假设你有一个像这样的LED矩阵: LED matrix schematic

回答不是你的问题,但你的评论“如果你至少可以告诉我如何制作闪烁的LED,我将不胜感激:)”,我们可以这样做:

module blink (input wire clk,  /* assuming a 50MHz clock in your trainer */
              output wire anode,  /* to be connected to RC7 */
              output wire cathode);  /* to be connected to RB7 */

  reg [24:0] freqdiv = 25'h0000000;
  always @(posedge clk)
    freqdiv <= freqdiv + 1;
  assign cathode = 1'b0;
  assign anode = freqdiv[24];
endmodule

这将使左上方的LED以大约每秒1,4次闪烁的速度闪烁。

另一个例子将在矩阵中显示一个运行点,从左到右,从上到下:

module runningdot (input wire clk,  /* assuming a 50MHz clock in your trainer */
       output wire [7:0] anodes,  /* to be connected to RC0-7 */
       output wire [7:0] cathodes);  /* to be connected to RB0-7 */

  reg [23:0] freqdiv = 24'h0000000;
  always @(posedge clk)
    freqdiv <= freqdiv + 1;
  wire clkled = freqdiv[23];

  reg [7:0] r_anodes = 8'b10000000;
  reg [7:0] r_cathodes = 8'b01111111;
  assign anodes = r_anodes;
  assign cathodes = r_cathodes;

  always @(posedge clkled) begin
    r_anodes <= {r_anodes[0], r_anodes[7:1]};  /* shifts LED left to right */
    if (r_anodes == 8'b00000001)  /* when the last LED in a row is selected... */
      r_cathodes <= {r_cathodes[0], r_cathodes[7:1]}; /* ...go to the next row */
  end
endmodule

如果使用逻辑而非嵌入式处理器,您的蛇游戏比这些示例复杂得多,但它将使用相同的逻辑原理来驱动矩阵。