打印

转贴一个用CPLD+SRAM驱动数字TFT屏的例子,16位并行接口

[复制链接]
7349|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ocon|  楼主 | 2008-9-8 01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 

相关帖子

沙发
ocon|  楼主 | 2008-9-8 01:20 | 只看该作者

pcb

使用特权

评论回复
板凳
ocon|  楼主 | 2008-9-8 01:21 | 只看该作者

sch

使用特权

评论回复
地板
农民讲习所| | 2008-9-8 09:37 | 只看该作者

顶一顶

使用特权

评论回复
5
wangkj| | 2008-9-8 13:11 | 只看该作者

全看完了,比较怪异的一种屏

hs,vs信号再前面

使用特权

评论回复
6
mikesullen| | 2008-9-14 01:44 | 只看该作者

看到晚了一点

我的也是类似的方案,可惜我做的复杂了点,下次有机会再改板吧。

使用特权

评论回复
7
ldlglyld| | 2008-9-16 10:08 | 只看该作者

CPLD SRAM驱动数字TFT屏,有没有8位并行接口的?

使用特权

评论回复
8
lianshumou| | 2008-9-20 11:34 | 只看该作者

可以做成8位的!

使用特权

评论回复
9
fjhcpu| | 2008-10-1 19:17 | 只看该作者

刷屏速度快不快

使用特权

评论回复
10
dalong168| | 2009-4-20 11:27 | 只看该作者

太好了

顶一下,我也正在找相关的资料

使用特权

评论回复
11
tk_jzy| | 2010-4-27 15:30 | 只看该作者
1# ocon

always @(posedge clk)  
always@(posedge pspclk)
start 的周期为24个clk,而pspclk的周期是4clk,在写PSP时,4*4=16个clk,就结束了。 24 比 16 少了8个clk呀?

使用特权

评论回复
12
ocon|  楼主 | 2010-5-2 23:24 | 只看该作者
这个只是转帖,也是项目完成之后才搜到的,我的项目当时用的是12寸的屏,全是自己写的。

使用特权

评论回复
13
apple163| | 2010-7-20 16:35 | 只看该作者
简单问题复杂化,这个方案可以很简洁很高效的。

使用特权

评论回复
14
njfucjh| | 2011-3-7 23:54 | 只看该作者
搞这么麻烦干嘛,现在很多厂家都做了集成的,MCU通过UART就可以驱动了。  欢迎拍砖 QQ 244344839

使用特权

评论回复
15
liaizun| | 2011-3-12 11:18 | 只看该作者
低成本,不知道刷屏的速度够不够开,
本人想做FPGA+TFT屏的,参考参考!

使用特权

评论回复
16
hong60104| | 2011-8-29 09:10 | 只看该作者
学习下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

4920

帖子

14

粉丝