| 
 
| 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  | 
 |