Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CUsersMISHADocumentsМИЭТПрограммируемые логические интегральные схем.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.84 Mб
Скачать

Приложение 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