module PSP(clk,HS,VS,DISP,LED,pspclk,pspdata,CE,OE,WE,BH,BL,ADDER,WR,wrdata,RamData,RST,RS); input clk,WR,RST,RS; input [15:0] wrdata; inout [15:0] RamData; output HS,VS,DISP,LED,pspclk,CE,OE,WE,BH,BL,ADDER,pspdata; /////////////////////////////////////////////////////////////////////////////////////////////////////////// reg [9:0]J1; //HS计数器: reg [8:0]J2; //VS计数器: reg HS=1; //PSP屏行扫描 reg VS=1; //PSP屏帧扫描 reg PSPEN=0; //psp开始工作标志位 reg DISP=0; //PSP开显示,1开,0关 reg [4:0] i; //分频时的计数器 reg pspclk; //psp屏时钟 reg [2:0] pspdataChoose; //向PSP发数据时确定是第一位数据还是第二位数据 reg [23:0] pspdata; //reg pspdataen=1; //////////////////////////////////////////////////////////////////////////////////////////////////////////// reg LED=1; //检测系统时钟工作正常的LED reg [1:0] led; reg [21:0] sysen; //系统上电延时标志位 ///////////////////////////////////////////////////////////////////////////////////////////////////////// reg addstart; reg RamEN=0; reg [15:0] outdata; //临时数据区为inout中的OUT 输出数据 reg [4:0] start; //开始控制读写RAM和PSP数据发送计数器
reg [15:0] RamA0; reg [15:0] RamB0; reg [15:0] RamC0;
reg [15:0] RamA1; reg [15:0] RamB1; reg [15:0] RamC1;
wire [17:0] ADDER; //RAM地址输出寄存器 reg CE=0; reg OE,WE,BH,BL; //RAM控制位 reg [15:0] wridata; //外部输入的数据临时存放寄存器 reg [17:0] WADDER; //写入数据时的RAM地址 reg [17:0] RADDER; //读RAM数据时的地址 reg oe;reg WRoe; reg RamStart=0; reg WADDEREN; assign RamData=oe? outdata:16'hzzzz; assign ADDER=WRoe? WADDER:RADDER; ///////////////////////////////////////////////////////////////////////////////////////////////////////////
always @(posedge clk) //系统上电延时函数 begin sysen<=sysen+1; if(sysen>4000000)//4000000) //大概是74MS begin PSPEN=1; end end
////////////////////////////////////////////////////////////////////////////////////////////////////////////
always @(posedge clk) //时钟分频函数,输出PSP时钟 begin if(PSPEN) // begin if(i==2) begin i<=0; pspclk<=~pspclk; end else i<=i+1; end end
////////////////////////////////////////////////////////////////////////////////////////////////////////////
always @(posedge clk) //开始控制读写RAM和PSP数据发送函数 begin if(RamEN) begin BH=0;BL=0; case(start) 0: begin OE=1;WE=0;CE=0; oe=1;WRoe=1; start=1; end 1: begin outdata=wridata; start=2; end 2: begin oe=0;WRoe=0; OE=0;CE=0;WE=1; start=3; end 3: begin RADDER<=RADDER+1; //adda0 start=4; end 4: begin RamA0<=RamData; //dataa0 start=5; end 5: begin //addb0 RADDER<=RADDER+1; start=6; end 6: begin //datab0 RamB0<=RamData; start=7; end 7: begin RADDER<=RADDER+1; start=8; end 8: begin RamC0<=RamData; //datac0 start=9; end 9: begin RADDER<=RADDER+1; start=10; end 10: begin //dataa1 RamA1<=RamData; start=11; end 11: //addb1 begin RADDER<=RADDER+1; start=12; end 12: begin RamB1<=RamData; //databb1 start=13; end 13: begin RADDER<=RADDER+1; start=14; end 14: begin RamC1<=RamData; //datac1 start=15; end 15: begin CE=1; if(addstart==1) begin RADDER=0; end start=16; end 16: begin OE=1;WE=0;CE=0; oe=1;WRoe=1; start=17; end
17: begin outdata=wridata; start=18; end 18: begin start=19; end 19: begin outdata=wridata; start=20; end 20: begin oe=0; CE=1; start=21; end 21: begin start=22; end 22: begin start=23; end 23: begin start=0; end endcase end end
//////////////////////////////////////////////////////////////////////////////////////////////////////////// /* always @(posedge clk ) begin if(RST==0) begin WADDEREN=0; end else WADDEREN=1; end */ ////////////////////////////////////////////////////////////////////////////////////////////////////////////
always @(negedge WR ) //WR下降沿时读入外部数据 begin case(RS) //RS=0;cmd 1: //RS=1;DATA begin if(WADDER==196560) //195840 begin WADDER=1; end else WADDER=WADDER+1;
if(WADDER<=196560) begin wridata<=wrdata; end end 0: begin WADDER<=wrdata; end endcase end
/////////////////////////////////////////////////////////////////////////////////////////////////////////// always@(posedge pspclk) //将colordata的数据发送给PSP begin if(J1==525) begin J1=1; end else J1=J1+1; if(J1<=41) begin HS=0; end else if(J1<=43) begin HS=1; RamEN=1; pspdata='hzzzzzz; end else if(J1<=523) begin if(J1==522) begin RamEN=0; end case(pspdataChoose) 0: begin pspdata[23:8]<=RamA0[15:0]; pspdata[7:0] <=RamB0[15:8]; pspdataChoose=1; end 1: begin pspdata[23:16]<=RamB0[7:0]; pspdata[15:0] <=RamC0[15:0]; pspdataChoose=2; end 2: begin pspdata[23:8]<=RamA1[15:0]; pspdata[7:0] <=RamB1[15:8]; pspdataChoose=3; end 3: begin pspdata[23:16]<=RamB1[7:0]; pspdata[15:0] <=RamC1[15:0]; pspdataChoose=0; end endcase end else if(J1<=525) begin pspdata='hzzzzzz; end end /////////////////////////////////////////////////////////////////////////////////////////////////////////// always@(posedge HS) //PSP屏帧扫描函数 begin if(J2==286) begin J2=1; end else J2=J2+1;
if(J2<=10) begin DISP=1; VS=0; end else if(J2<=12) begin addstart=1; VS=1; end else if(J2<=286) begin addstart=0; end /*else if(J2<=286) begin end*/ end
////////////////////////////////////////////////////////////////////////////////////////////////////////////
always @(posedge VS) //LED闪烁函数,为了检测系统时钟是否工作正常 begin led<=led+1; if(led==3) begin LED=~LED; led<=0; end end
endmodule |