原创 FPGA驱动群创数字屏液晶AT070TN92显示verilog代码-demo

2010-11-18 16:23 8094 11 14 分类: FPGA/CPLD

时钟用的是33.333Mhz, 50M锁相环倍频分频得到,

大概每隔1秒显示横条,竖条,方块,青色,蓝色,绿色,红色等;

代码经过本人几天调试终于完成,这个驱动板的电路原理图在ouravr上发过,大家有兴趣可以找找,我懒得上传了。



`timescale 1ns / 1ps

//-----------------------------------------------------------------------------
module AT070TN92(CLK,DCLK,
                      HS,VS,
                      MODE,
                      DE,
                      LR,UD,
                      KEY,
                      LCDR,LCDG,LCDB,
                      DITHB,BLPWM,RESET);
         input  CLK;
         input  KEY;
         output DCLK;
         output HS;
         output VS;
         output MODE;
         output DE;
         output LR;
         output UD;
         output RESET;
         output DITHB;
         output BLPWM;
         output [7:0] LCDR;
         output [7:0] LCDG;
         output [7:0] LCDB;
         
         // Horizontal Signals:
         parameter
           thpw = 11'd8,                 //HS Pulse Width,1-40 DCLK
             thb  = 11'd46,                //HS Blanking 46 DCLK = HS Pulse Width + HS Back Porch
             thd  = 11'd800,                  //Horizontal Display Area,800 DCLK
            thfp = 11'd210,               //HS Front Porch,16-210-354 DCLK
             th   = (thb+thd+thfp),     //One Horizontal Line = HS Blanking (thb) +  Horizontal Display Area (thd) + HS Front Porch (thfp)
         // Vertical Signals:
           tvpw = 11'd3,                 //Vs Pulse Width 1-20 TH
            tvb  = 11'd23,                //Vs Blanking 23 TH = Vs Pulse Width + VS Back Porch
            tvd  = 11'd480,                //Vertical Dsiplay Area 480 TH
            tvfp = 11'd22,                //Vs Front Porch 7-22-147 TH
            tv   = (tvb+tvd+tvfp);     //Vs Blanking (tvb) + Vertical Dsiplay Area (tvd) + Vs Front Porch (tvfp
           
         wire HS;
         wire VS;
         //reg [7:0] LCDR;
         //reg [7:0] LCDG;
         //reg [7:0] LCDB;
         wire [7:0] LCDR;
         wire [7:0] LCDG;
         wire [7:0] LCDB;
         reg [9:0] BL_CNT = 0;
         reg HS_R = 1;
         reg VS_R = 1;
         reg [10:0] hcount = th-1;
         reg [10:0] vcount = tv-1;
         reg videoh = 0;
         reg videov = 0;
         wire videon = 0;
         reg [9:0] column = 10'b0;
         reg [8:0] row = 9'b0;
         reg [23:0] v_data;
         reg [23:0] h_data;
         reg [2:0] dismode =3'b0;
         reg [31:0] data;
         reg [24:0] switchsync;
         assign DITHB = 0;   
         assign RESET = 1;
         assign DCLK = CLK;
         assign BLPWM = (BL_CNT >=200)? 1'b1 : 1'b0;
         assign HS = HS_R;
         assign VS = VS_R;
         assign DE = 0;
         assign MODE = 0;
         assign UD = 0;
         assign LR = 1;
         assign videon = videoh && videov ;
         assign LCDR = data[31:16] ;
         assign LCDG = data[15:8]  ;
         assign LCDB = data[7:0]   ;
         
//TFT LCD LED PW
always @(posedge CLK)
    begin
        if(BL_CNT < 700)
                BL_CNT <= BL_CNT + 1'b1;
        else
                BL_CNT <= 1'b0;
    end
//TFT hcount, vcount siganl
always @(posedge CLK)
    begin
        if(hcount==(th-1'b1))
            begin
            hcount <= 1'b0;
            if(vcount==(tv-1'b1))
                vcount <= 1'b0;
            else
                vcount <= vcount+ 1'b1;
            end
        else
            hcount <= hcount+1'b1;
    end
//videoh signal
always @(hcount)
begin
    if( (hcount>=46) && (hcount<=846) )
        videoh <= 1'b1;
    else
        videoh <= 1'b0;
end
//videov signal
always @(vcount)
begin
    if( (vcount>=23) && (vcount<=503) )
        videov <= 1'b1;
    else
        videov <= 1'b0;
end

always @(posedge CLK)
begin
    if(videon==1'b1)
        begin
            column <= column+10'b1;
            row <= row+9'b1;
        end
    else
        begin
            column <= 10'b0;
            row <= 9'b0;
        end
end
   

// hsync , vsync
always @(posedge CLK)
begin
        HS_R <= ( hcount >= thpw);
        VS_R <= ( vcount >= tvpw);
end

always @(posedge CLK)
begin
    if( hcount <=146)
        begin
            h_data <={8'd0,8'd0,8'd0} ;
        end
    else if ( hcount <=246 )
            begin
            h_data <={8'd0,8'd0,8'd255} ;
           end
    else if (hcount <=346)
            begin
            h_data <={8'd0,8'd255,8'd0} ;
           end
   else if ( hcount <=446 )
            begin
            h_data <={8'd0,8'd255,8'd255} ;
           end
    else if ( hcount <=546)
            begin
            h_data <={8'd255,8'd0,8'd0} ;
           end
    else if (hcount <=646 )
            begin
            h_data <={8'd255,8'd0,8'd255} ;
           end
    else if (hcount <=746)
            begin
            h_data <={8'd255,8'd255,8'd0} ;
           end 
    else
        begin
            h_data <={8'd255,8'd255,8'd255} ;
      end
end
always @(posedge CLK)
begin
    if(vcount<=83)
        begin
        v_data <={8'd0,8'd0,8'd0} ;
        end
    else if(vcount<=143)
        begin
        v_data <={8'd0,8'd0,8'd255} ;
        end
    else if(vcount<=203)
        begin
        v_data <={8'd0,8'd255,8'd0} ;
        end
    else if(vcount<=263)
        begin
        v_data <={8'd0,8'd255,8'd255} ;
        end
    else if(vcount<=323)
        begin
        v_data <={8'd255,8'd0,8'd0} ;
        end
    else if(vcount<=383)
        begin
        v_data <={8'd255,8'd0,8'd255} ;
        end
    else if(vcount<=443)
        begin
        v_data <={8'd255,8'd255,8'd0} ;
        end
    else
        begin
        v_data <={8'd255,8'd255,8'd255} ;
        end
end
// key vaule inc
//always @(posedge KEY)
//begin
//    dismode <= dismode+1'b1;
//end
//
always @(posedge CLK)
begin
    switchsync <= switchsync + 1'b1;
end
//
always @(posedge switchsync[24])
begin
    dismode <= dismode+3'b1;
end
   
always @(posedge CLK)
begin
    case(dismode)
        3'd0: data <= h_data;
        3'd1: data <= v_data;
        3'd2: data <= (v_data ^ h_data);
        3'd3: data <= (v_data ~^ h_data);
        3'd4: data <= {8'd0,8'd255,8'd255};
        3'd5: data <= {8'd0,8'd0,8'd255};
        3'd6: data <= {8'd0,8'd255,8'd0};
        3'd7: data <= {8'd255,8'd0,8'd0};
        3'd7: data <= {8'd255,8'd255,8'd0};
    endcase
end
endmodule


文章评论3条评论)

登录后参与讨论

用户1830132 2015-3-12 13:55

在吗 博主 我现在想用Altera的 de1-soc 来驱动群创的TN92液晶屏 能给我指点下么

用户1324799 2013-8-6 16:42

可以的,我板子多下载过。

用户1651448 2013-8-5 13:39

博主,正在找92的初始化代码,你这个验证过没?求助,万分感谢!!

用户525326 2009-11-19 11:29

在EMC方面STM32要比LPC强势很多。

用户1353831 2009-11-5 10:41

这个话题永远谈不完,商场如战场,没有竞争就没有进步,高手们继续探讨吧,洗耳恭听

用户187751 2009-4-8 19:46

一山更比一山高,我只知道我还山脚下!!!

用户506238 2009-2-11 10:42

要顶 必须顶 不得不顶 用尽全力顶 再加上千斤顶 总之把它顶到顶 接着使出葵花宝顶 就算顶到史前也要顶 老子看了会用道德经顶 孔子亲自拜你为师天天顶 秦始皇站在阿房宫上使劲顶 汉高祖挥师杀向东罗马为你顶 吕布抛弃了貂禅而选择了帮你顶 张三丰见了后用太极拳九式全力顶 左冷禅召开武林盟主大会商讨如何顶 西门吹雪从此学会了最强一招剑神一顶 龙剑飞的如来神掌最后一式改为万佛朝顶 陆小凤从此再也不管闲事了而专门来为你顶 四大名捕四面出击看天下还有没有人敢不在顶

用户151646 2008-10-13 20:45

呵呵,有意思,技术交流就应该这样子!!!!!!!

用户170041 2008-9-13 20:31

lpc213*系列flash的读写速度是最快的--不敢苟同,目前地球人生产的nor型flash在小于24Mhz时的读写速度都是一样的,大于24Mhz时关键是缓冲如何处理,stm23也是有缓冲的, 同样的代码,stm32比lpc213*要慢上0.6倍的时间,我想这话您应该这么说就对了:同样的代码,stm32用的时间是lpc213*的0.6倍。arm公司的职员再不济也比您的6年使用arm的经验要强不止百倍。,不可能呢么多人鼓捣了这么长时间整出来的cortex-m3在操作系统代码的运行上还不如v4版本的arm7,即使他的flash缓存设计的好又怎么样啊,arm7的中断性能和cortex-m3相比差的不是0.6倍的关系,而是几个数量级,至于其他指令,随便举个整数乘除的例子,cortex-m3一个指令搞定,arm7就需要一大堆了,这样的例子对于这两个架构的arm的对比真是举不胜举,太多了。lpc的flash读写的特色是两个缓冲区轮番上阵,虽然》24Mhz是有等待周期,但基本上用不着等待,基本上是贼不走空,接近了在ram中执行的速度;而stm32的flash读写也有缓冲,但没有lpc设计的出色,72mhz是要设置2个时钟的等待,但也不是每次都等,就是恰好缓冲区中没有的时候,需要等待,综合说来在高时钟频率时,lpc和stm32到底谁更快,还真不好说,要看具体的应用。但是有一点是肯定的,就是stm32实时性无论在什么场合都要比lpc强多了。 另外还想说一点,时间不完全等于能力,路边的石头过了100年以后,他还是石头。

用户170041 2008-9-13 20:30

lpc213*系列flash的读写速度是最快的--不敢苟同,目前地球人生产的nor型flash在小于24Mhz时的读写速度都是一样的,大于24Mhz时关键是缓冲如何处理,stm23也是有缓冲的, 同样的代码,stm32比lpc213*要慢上0.6倍的时间,我想这话您应该这么说就对了:同样的代码,stm32用的时间是lpc213*的0.6倍。arm公司的职员再不济也比您的6年使用arm的经验要强不止百倍。,不可能呢么多人鼓捣了这么长时间整出来的cortex-m3在操作系统代码的运行上还不如v4版本的arm7,即使他的flash缓存设计的好又怎么样啊,arm7的中断性能和cortex-m3相比差的不是0.6倍的关系,而是几个数量级,至于其他指令,随便举个整数乘除的例子,cortex-m3一个指令搞定,arm7就需要一大堆了,这样的例子对于这两个架构的arm的对比真是举不胜举,太多了。lpc的flash读写的特色是两个缓冲区轮番上阵,虽然》24Mhz是有等待周期,但基本上用不着等待,基本上是贼不走空,接近了在ram中执行的速度;而stm32的flash读写也有缓冲,但没有lpc设计的出色,72mhz是要设置2个时钟的等待,但也不是每次都等,就是恰好缓冲区中没有的时候,需要等待,综合说来在高时钟频率时,lpc和stm32到底谁更快,还真不好说,要看具体的应用。但是有一点是肯定的,就是stm32实时性无论在什么场合都要比lpc强多了。 另外还想说一点,时间不完全等于能力,路边的石头过了100年以后,他还是石头。
相关推荐阅读
用户1324799 2013-04-28 11:11
FPGA跨时钟域同步,亚稳态等
我不是半导体/ASIC/FPGA 领域的,对跨时钟域,MTBF等了解的很少。 有时候看到个问题,就会想这个问题,解决这个问题。 或许大家可以先看看 新思科技的 《跨时钟域信号同步的IP解决...
用户1324799 2013-04-28 08:31
TFT板子+Verilog代码+显示图片(纯逻辑) 好奇妙!!!
 液晶显示图片:     好奇妙的图片,这个图片是怎么来的,奥秘就在下面:   m...
用户1324799 2012-03-19 19:01
电机传感器光电编码器入门
电机传感器光电编码器入门...
用户1324799 2012-03-13 19:28
SVPWM/SVM/空间矢量PWM/空间矢量脉冲宽度调制
电压空间矢量法(SVPWM,称磁通正弦PWM)是从电动机的角度出发,着眼于使电机获得幅值恒定的圆形磁场,即正弦磁通。它以三相对称正弦波电压供电时交流电动机的理想圆形磁通轨迹为基准,用逆变器不同的开...
用户1324799 2011-10-05 12:17
SVPWM相关学习1
I.伏秒平衡:  伏秒平衡,就是这个意思:参考矢量为Vref,三个空间矢量V1、V2、V3来合成这个矢量;在一个SVPWM周期之内,三个矢量V1、V2、V3的合成效果要和Vref相同,即Vref*Ts...
用户1324799 2011-09-08 16:51
中颖4位单片机指令学习笔记
刚接触中颖的4位单片机,一直在看中颖的资料,很郁闷有些资料有问题,也浪费了大量的时间。在论坛上提问也解决了几个问题。关于SBC指令的,问题已经解决http://bbs.sinowealth.com/v...
我要评论
3
11
关闭 站长推荐上一条 /2 下一条