前言
在大二学习数字逻辑设计课程(即计算机组成课程的前引课)时,期末大程题目我和同组的github成员lwaekfjlk 决定写一款基于Verilog语言的游戏。原型是我们两人都非常喜爱的一款游戏——The Binding of Isaac: Rebirth。在三天三夜的奋战后,基本完成了预期目标。由于亲自编写了其中种种,我们深知新手初期使用Verilog语言有多困难。而可悲的是,这又是之后计算机组成课程和体系结构课程所需的!因此,我们将top部分源码放在这里,供同袍们参考。若想引用还请注明出处。
代码部分
/top模块
`timescale 1ns / 1ps
module Top(
input ps2_clk, //键盘时钟
input ps2_data, //键盘数据
input clk, //整体时钟
input rstn, //复位按钮
input [15:0]SW,//代表的是FPGA板上的按钮
output hs, //VGAC的output
output vs, //VGAC的output
output [3:0] r, //VGAC的output代表的是一个(x,y)坐标处对应的RGB元素
output [3:0] g,
output [3:0] b,//demo中本身就有的输出,包括FPGA板上LED灯的输出
output SEGLED_CLK,
output SEGLED_CLR,
output SEGLED_DO,
output SEGLED_PEN,
output LED_CLK,
output LED_CLR,
output LED_DO,
output LED_PEN,
inout [4:0]BTN_X,//代表按钮的X坐标和Y坐标
inout [3:0]BTN_Y,
output buzzer,//代表蜂鸣器的输出
output reg [31:0] clkdiv,
output reg [31:0] score
);
/
reg [10:0] seed;
initial begin
seed <= 10'b1010100101;
end
always@(posedge clk)begin
seed <= seed ^ (~((seed>>1)));
end
//reg [31:0]clkdiv;//31位的一个数字,代表的是当前的时钟
always@(posedge clk) begin
clkdiv <= clkdiv + 1'b1;
end
/
assign buzzer = 1'b1;//设置蜂鸣器变量为1
/
wire [15:0] SW_OK;//代表的是防抖模块的输出按钮信号
AntiJitter #(4) a0[15:0](.clk(clkdiv[15]), .I(SW), .O(SW_OK));//调用防抖模块
wire [31:0] segTestData;
wire [3:0]sout;
Seg7Device segDevice(.clkIO(clkdiv[3]),
.clkScan(clkdiv[15:14]),
.clkBlink(clkdiv[25]),
.data(score),
.point(8'h0),
.LES(8'h0),
.sout(sout)
);
//反正这部分必须有,因为这几个wire变量是整个程序的output端口
assign SEGLED_CLK = sout[3];
assign SEGLED_DO = sout[2];
assign SEGLED_PEN = sout[1];
assign SEGLED_CLR = sout[0];
/
//VGA的总体信息可以这么理解,就是一个一个点的像素数据进行串行输入,然后每个时钟周期处理一个点的数据的显示,得到最终屏幕上的串行输出。由于时钟周期非常快所以一遍一遍地一个点一个点处理我们人眼是看不出来的
wire [11:0] vga_data;//代表想要使用VGAC模块处理所需要的数据输入信息
wire [11:0] vga_data_1;//代表背景图像IP核所输出的VGA信息
wire [19:0] col_addr;//[9:0]代表当前正在处理的那个点的列的坐标
wire [19:0] row_addr;//[8:0]代表当前正在处理的那个点的行的坐标
wire [18:0] address;//代表输出背景图片时的地址
wire [11:0] vga_data_object;//代表物体IP核调用之后产生的VGA信息
wire [18:0] address_object;//代表物体的显示地址
wire [9:0] data;//代表PS2协议键盘的数据输出
wire [9:0] on_hc_1;
wire [8:0] on_vc_1;
wire [9:0] on_hc_2;
wire [8:0] on_vc_2;
wire [9:0] on_hc_3;
wire [8:0] on_vc_3;
wire [9:0] on_hc_4;
wire [8:0] on_vc_4;
wire [9:0] on_hc_5;
wire [8:0] on_vc_5;
wire [9:0] on_hc_6;
wire [8:0] on_vc_6;
wire [9:0] on_hc_7;
wire [8:0] on_vc_7;
wire [9:0] on_hc_8;
wire [8:0] on_vc_8;
wire [9:0] on_hc_9;
wire [8:0] on_vc_9;
wire [9:0] on_hc_10;
wire [8:0] on_vc_10;
wire [9:0] on_hc_11;
wire [8:0] on_vc_11;
wire [9:0] on_hc_12;
wire [8:0] on_vc_12;
reg [6:0] blood;
reg [9:0] col_temp_1 ; //remember the col position
reg [8:0] row_temp_1 ; //remember the row position
reg [9:0] col_temp_2 ; //remember the col position
reg [8:0] row_temp_2 ; //remember the row position
reg [9:0] tmp_x;
reg [9:0] tmp_x2;
reg [9:0] tmp_x3;
reg [9:0] tmp_x4;
reg [9:0] tmp_x5;
reg [9:0] tmp_x6;
reg [9:0] tmp_x7;
reg [9:0] tmp_x8;
reg [9:0] tmp_x9;
reg