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