Приложение 5
module Labirint (input CLOCK_50, input [1:0] CLOCK_24, input [3:0] KEY, input [9:0] SW, inout PS2_CLK, inout PS2_DAT,
input AUD_DACLRCK, input AUD_BCLK, output AUD_DACDAT, output AUD_XCK, output I2C_SCLK, inout I2C_SDAT, output [3:0] VGA_R,
output [3:0] VGA_G, output [3:0] VGA_B, output VGA_HS, output VGA_VS, output [9:0] LEDR, output [7:0] LEDG);
reg [634:0] lab [0:479];
reg [634:0] fin [0:479];
reg wallup=1'b0;
reg walldown=1'b0;
reg wallleft=1'b0;
reg wallright=1'b0;
reg [1:0] KP=2'b00;
reg [3:0] in=4'b0000;
reg [3:0] wallR=4'b0000;
reg [3:0] wallG=4'b0000;
reg [3:0] wallB=4'b0000;
reg [3:0] objR=4'b0000;
reg [3:0] objG=4'b0000;
reg [3:0] objB=4'b0000;
reg rdone=1'b0;
reg start=1'b0;
reg [9:0] state_hor=634;
reg [8:0] LR=6'b000000;
reg [9:0] curpos1=632;
reg [8:0] curpos2=220;
reg [3:0] w=4'b0000;
reg obj=1'b0;
reg [3:0] dir;
reg next=1'b0;
wire [7:0] KEYCODE;
wire ready;
wire [3:0] dig;
wire err;
wire KPm;
wire done;
wire givepix;
wire f;
wire [9:0] state_ver;
wire [634:0] wlab;
wire [3:0] R;
wire [3:0] G;
wire [3:0] B;
parameter length=22;
parameter width=16;
initial begin
$readmemb("LabirintMap.txt",lab);
$readmemb("Finish.txt",fin);
end
assign wlab=(state_ver<480)?(rdone?fin[state_ver]:lab[state_ver]):635'b0;
assign R[3]=rdone?(wallR[3]?wlab[state_hor]:1'b0):(obj?objR[3]:(wallR[3]?wlab[state_hor]:1'b0));
assign R[2]=rdone?(wallR[2]?wlab[state_hor]:1'b0):(obj?objR[2]:(wallR[2]?wlab[state_hor]:1'b0));
assign R[1]=rdone?(wallR[1]?wlab[state_hor]:1'b0):(obj?objR[1]:(wallR[1]?wlab[state_hor]:1'b0));
assign R[0]=rdone?(wallR[0]?wlab[state_hor]:1'b0):(obj?objR[0]:(wallR[0]?wlab[state_hor]:1'b0));
assign G[3]=rdone?(wallG[3]?wlab[state_hor]:1'b0):(obj?objG[3]:(wallG[3]?wlab[state_hor]:1'b0));
assign G[2]=rdone?(wallG[2]?wlab[state_hor]:1'b0):(obj?objG[2]:(wallG[2]?wlab[state_hor]:1'b0));
assign G[1]=rdone?(wallG[1]?wlab[state_hor]:1'b0):(obj?objG[1]:(wallG[1]?wlab[state_hor]:1'b0));
assign G[0]=rdone?(wallG[0]?wlab[state_hor]:1'b0):(obj?objG[0]:(wallG[0]?wlab[state_hor]:1'b0));
assign B[3]=rdone?(wallB[3]?wlab[state_hor]:1'b0):(obj?objB[3]:(wallB[3]?wlab[state_hor]:1'b0));
assign B[2]=rdone?(wallB[2]?wlab[state_hor]:1'b0):(obj?objB[2]:(wallB[2]?wlab[state_hor]:1'b0));
assign B[1]=rdone?(wallB[1]?wlab[state_hor]:1'b0):(obj?objB[1]:(wallB[1]?wlab[state_hor]:1'b0));
assign B[0]=rdone?(wallB[0]?wlab[state_hor]:1'b0):(obj?objB[0]:(wallB[0]?wlab[state_hor]:1'b0));
assign LEDR={rdone,LR};
assign AUD_XCK=CLOCK_24[0];
always @(negedge CLOCK_50)
if (!next)
case (KEYCODE)
8'h75: //up
dir[0]<=1'b1;
8'h72: //down
dir[1]<=1'b1;
8'h6B: //left
dir[2]<=1'b1;
8'h74: //right
dir[3]<=1'b1;
8'hF0:
next<=1'b1;
endcase
else
if (KEYCODE!=8'hF0)
begin
case (KEYCODE)
8'h75: //up
dir[0]<=1'b0;
8'h72: //down
dir[1]<=1'b0;
8'h6B: //left
dir[2]<=1'b0;
8'h74: //right
dir[3]<=1'b0;
endcase
next<=1'b0;
end
always @(posedge CLOCK_50)
begin
if (!KEY[0]&rdone)
begin
wallup<=1'b0;
walldown<=1'b0;
wallleft<=1'b0;
wallright<=1'b0;
curpos1<=632;
curpos2<=220;
obj<=1'b0;
state_hor<=634;
LR<=6'b000000;
start<=1'b0;
KP<=2'b00;
in<=4'b0000;
rdone<=1'b0;
wallR<=4'b0000;
wallG<=4'b0000;
wallB<=4'b0000;
end
KP[0]<=KPm;
KP[1]<=KP[0];
case (in)
4'b0000:
begin
LR[0]<=1'b1;
if (!KP[0]&KP[1]&!err)
begin
wallR<=dig;
in<=in+1;
end
end
4'b0001:
begin
LR[1]<=1'b1;
if (!KP[0]&KP[1]&KEYCODE==8'h29&&wallR!=4'b0000) //SPACE
in<=4'b0011;
if (!KP[0]&KP[1]&!err)
begin
wallG<=dig;
in<=in+1;
end
end
4'b0010:
begin
LR[2]<=1'b1;
if (!KP[0]&KP[1]&KEYCODE==8'h29&&(wallR!=4'b0000|wallG!=4'b0000)) //SPACE
in<=4'b0011;
if (!KP[0]&KP[1]&!err)
begin
wallB<=dig;
in<=in+1;
end
end
4'b0011:
if (wallR==4'b0000&wallG==4'b0000&wallB==4'b0000)
begin
in<=4'b000;
LR[2:1]<=2'b00;
end
else
begin
LR[3]<=1'b1;
in<=in+1;
end
4'b0100:
begin
LR[4]<=1'b1;
if (!KP[0]&KP[1]&!err)
begin
objR<=dig;
in<=in+1;
end
end
4'b0101:
begin
LR[5]<=1'b1;
if (!KP[0]&KP[1]&KEYCODE==8'h29&&objR!=4'b0000) //SPACE
in<=4'b0111;
if (!KP[0]&KP[1]&!err)
begin
objG<=dig;
in<=in+1;
end
end
4'b0110:
begin
LR[6]<=1'b1;
if (!KP[0]&KP[1]&KEYCODE==8'h29&&(objR!=4'b0000|objG!=4'b0000)) //SPACE
in<=4'b0111;
if (!KP[0]&KP[1]&!err)
begin
objB<=dig;
in<=in+1;
end
end
4'b0111:
if (objR==4'b0000&objG==4'b0000&objB==4'b0000|objR==wallR&&objG==wallG&objB==wallB)
begin
in<=4'b0100;
LR[6:5]<=2'b00;
end
else
begin
LR[7]<=1'b1;
in<=in+1;
end
4'b1000:
begin
LR[8]<=1'b1;
if (!KP[0]&KP[1]&KEYCODE==8'h5A) //ENTER
begin
start<=1'b1;
in<=in+1;
end
end
4'b1001:
begin
start<=1'b0;
wallup<=1'b0;
walldown<=1'b0;
wallleft<=1'b0;
wallright<=1'b0;
in<=in+1;
end
4'b1010:
if (!done)
begin
if (givepix==1'b1&f==1'b0&state_hor>0)
begin
if (state_hor==(curpos1+1)&&state_ver>=curpos2&&state_ver<=(curpos2+width-1))
obj<=1'b1;
if (state_hor==(curpos1-length+1)&&state_ver>=curpos2&&state_ver<=(curpos2+width-1))
obj<=1'b0;
if (state_ver==(curpos2-2)&state_hor<=curpos1&state_hor>=(curpos1-length+1))
wallup<=wallup|wlab[state_hor];
if (state_ver==(curpos2+width+1)&state_hor<=curpos1&state_hor>=(curpos1-length+1))
walldown<=walldown|wlab[state_hor];
if (curpos1>=632)
wallleft<=1'b1;
else
if (state_ver>=curpos2&state_ver<=(curpos2+width-1))
wallleft<=wallleft|wlab[curpos1+2];
if (curpos1<=(length+1))
wallright<=1'b1;
else
if (state_ver>=curpos2&state_ver<=(curpos2+width-1))
wallright<=wallright|wlab[curpos1-length-1];
state_hor<=state_hor-1;
end
if (givepix==1'b0)
state_hor<=634;
end
else
in<=in+1;
4'b1011:
begin
if (curpos1<=(length+1)&curpos2>=219&curpos2<=221)
rdone<=1'b1;
else
case (dir)
4'b0001: //up
if (!wallup)
curpos2<=curpos2-1;
4'b0010: //down
if (!walldown)
curpos2<=curpos2+1;
4'b0100: //left
if (!wallleft)
curpos1<=curpos1+1;
4'b1000: //right
if (!wallright)
curpos1<=curpos1-1;
endcase
start<=1'b1;
in<=4'b1001;
end
endcase
end
keytodigit ktd (.key(KEYCODE),
.digit(dig),
.err(err));
KP K (.key(KEYCODE),
.ready(ready),
.KP(KPm));
ps2protocol ps2 (.clk50(CLOCK_50),
.dir(KEY[1]),
.reset(KEY[0]),
.CODE(SW[7:0]),
.PS2_CLK(PS2_CLK),
.PS2_DAT(PS2_DAT),
.KEYCODE(KEYCODE),
.KP(ready));
VGA vga (.clk(CLOCK_50),
.start(start),
.R(R),
.G(G),
.B(B),
.VGA_R(VGA_R),
.VGA_G(VGA_G),
.VGA_B(VGA_B),
.VGA_HS(VGA_HS),
.VGA_VS(VGA_VS),
.done(done),
.givepix(givepix),
.state_ver(state_ver),
.f(f));
audiocodec audio (.start(SW[8]),
.clk(CLOCK_50),
.AUD_DACLRCK(AUD_DACLRCK),
.AUD_BCLK(AUD_BCLK),
.AUD_DACDAT(AUD_DACDAT),
.I2C_SCLK(I2C_SCLK),
.I2C_SDAT(I2C_SDAT),
.led(LEDG[3:0]));
endmodule
