搜索
bottom↓
回复: 10

看到很多CPLD+RAM的液晶控制器。

[复制链接]

出0入0汤圆

发表于 2010-10-20 17:42:37 | 显示全部楼层 |阅读模式
看到很多CPLD+RAM的液晶控制器。但是我没有CPLD和RAM,只有个开发板。
而且感觉他们的液晶都和我的不同。我的液晶是ILI9325。我是用IO操作他的,清屏函数如下:
for(i=0;i<320;i++)
     {
      for (j=0;j<240;j++)
        {
             LCD->DAT=dat;
             LCD->WR=0;
             LCD->WR=1;
        }
      }
但是这样操作的速度太慢了老,1秒钟也就能刷1~2幅图片,用来显示动画的话就更难看了。
如果做控制器的话,我想做那种挂在AVALON总线上的。想用DMA来从内存传输数据到LCD->DAT,clk经分频得到WR_clk(这就输出到液晶的WR引脚)
在WR_clk的下降沿读取数据到LCD->DAT,上升沿就可以把数据写到液晶里去了。

但是这液晶有个毛病,就是初始化函数太长,没有初始化就不能操作液晶。怎么才能实现初始化.

这是我的自我想法,不知道能否实现。希望大家给点意见或建议。

有人做过这样的控制器,或是有更好的方法吗?这种液晶要想提高写入速度,应该怎么弄呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-10-20 21:17:32 | 显示全部楼层
初始化很复杂的话你可以使用Nios来初始化,也就是在使用AVALON之前,通过IO直接初始化,然后将IO的控制权交给低层的模块。
利用硬件来直接把数据打给液晶控制器。
简单说来,Nios需要做的就是初始化液晶,然后指示低层的模块开始工作。
低层的工作就是完成数据的搬运。
但是这里面涉及到你图像数据怎么正确的送到缓存,解决写和读的时序,你就成功了。
他们做的CPLD+SRAM的重点也是这个写和读的时序控制。
不知道对你 有没有帮助。。。
呵呵

出0入0汤圆

 楼主| 发表于 2010-10-20 22:46:21 | 显示全部楼层
呵呵,似乎这样是对的。我也是这么想的,但是没有经验就不太敢去做。

底层数据正确送到缓冲的话应该可以模仿那个VGA控制器。

现在写了一个avalon外设(是模仿IO的)输出RS CS RESET WR RD DATA到液晶的引脚,也就是
用这个控制器来操作液晶和直接用PIO来操作液晶没什么两样。
但是这个还没做对呢!呵呵
这还只是整个想法的一小部分!

问题就是 没有人这样做过液晶控制器吗?没有源代码吗?

出0入0汤圆

发表于 2010-10-21 08:28:27 | 显示全部楼层
做过人家也不会给你的
坛子里有很多CPLD做的代码你倒是可以看看。

出0入42汤圆

发表于 2010-10-21 09:15:36 | 显示全部楼层
带ILI9325还要CPLD+RAM干嘛?

出0入0汤圆

发表于 2010-10-21 21:54:37 | 显示全部楼层
回复【4楼】ahfong2006
-----------------------------------------------------------------------

是的
可以不用了

出0入0汤圆

 楼主| 发表于 2010-10-22 09:26:11 | 显示全部楼层
我写了这个控制器。但是液晶没反应,不知道是什么问题。
我写过2遍了,用VHDL写了一个不行,现在用VERILOG写的这个也不行。
大家帮我看看是不是有什么原则上的问题?

module avalon_tft
(        clk,
        reset_n,
        chipselect,
        address,
        write,
        byteenable,
        writedata,
        data,cs,rd,rs,wr,reset
);
//inputs
input clk;
input [1:0]byteenable;
input reset_n;
input chipselect;
input [2:0]address;
input write;
input [15:0] writedata;
//outputs
output [15:0]data;
output cs;
output rd;
output rs;
output wr;
output reset;
reg [15:0] data_reg;
reg cs_reg;
reg rd_reg;
reg rs_reg;
reg wr_reg;
reg reset_reg;

//signal
wire data_selected, cs_selected, rd_selected,rs_selected,wr_selected,reset_selected;
wire write_to_data, write_to_cs, write_to_rd,write_to_rs,write_to_wr,write_to_reset;
wire valid_write;

//address decode
assign data_selected = !address[2] & !address[1] & !address[0];  //address 000
assign cs_selected   = !address[2] & !address[1] &  address[0];  //address 001
assign rd_selected   = !address[2] &  address[1] & !address[0];  //address 010
assign rs_selected   = !address[2] & address[1] & address[0];  //address 011
assign wr_selected   = address[2] & !address[1] & !address[0];  //address 100
assign reset_selected  =  address[2] & !address[1] & address[0];  //address 101

assign valid_write = chipselect & write;               

assign write_to_data = valid_write & data_selected;
assign write_to_cs   = valid_write & cs_selected;
assign write_to_rd   = valid_write & rd_selected;
assign write_to_rs   = valid_write & rs_selected;
assign write_to_wr   = valid_write & wr_selected;
assign write_to_reset   = valid_write & reset_selected;

//Write to data Register
always@(posedge clk or negedge reset_n)
begin
        if(~reset_n)begin
                data_reg[15:0] <= 16'b0000_0000_0000_0000;
        end
        else begin       
                if(write_to_data) begin
                                case(byteenable)
                                        2'b01: data_reg[7:0] <= writedata[7:0];
                                        2'b10: data_reg[15:8] <= writedata[15:8];
                                        default:data_reg[15:0] <= data_reg[15:0];
                                endcase          
                end
                else begin
                        data_reg[15:0] <= data_reg[15:0];  
                end
        end
end
//Write to cs Register
always@(posedge clk or negedge reset_n)
begin
        if(~reset_n)begin
                cs_reg <= 1'b1;
        end
        else begin       
                if(write_to_cs) begin
                        case(byteenable)
                                        2'b01: cs_reg <= writedata[0];        
                                        default:cs_reg <= cs_reg;
                        endcase          
                end
                else begin
                        cs_reg <= cs_reg;  
                end
        end
end
//Write to rd Register
always@(posedge clk or negedge reset_n)
begin
        if(~reset_n)begin
                rd_reg <= 1'b0;
        end
        else begin       
                if(write_to_rd) begin
                        case(byteenable)
                                        2'b01:rd_reg <= writedata[0];
                                        default:rd_reg <= rd_reg;
                        endcase          
                end
                else begin
                        rd_reg <= rd_reg;  
                end
        end
end
//Write to rs Register
always@(posedge clk or negedge reset_n)
begin
        if(~reset_n)begin
                rs_reg <= 1'b0;
        end
        else begin       
                if(write_to_rs) begin
                        case(byteenable)
                                        2'b01:rs_reg <= writedata[0];        
                                        default:rs_reg<= rs_reg;
                        endcase                          
                end
                else begin
                        rs_reg<= rs_reg;  
                end
        end
end
//Write to wr Register
always@(posedge clk or negedge reset_n)
begin
        if(~reset_n)begin
                wr_reg <= 1'b0;
        end
        else begin       
                if(write_to_wr) begin
                        case(byteenable)
                                        2'b01:wr_reg <= writedata[0];
                                        default:wr_reg <= wr_reg;
                        endcase
                                  
                end
                else begin
                        wr_reg <= wr_reg;  
                end
        end
end
//Write to reset Register
always@(posedge clk or negedge reset_n)
begin
        if(~reset_n)begin
                reset_reg <= 1'b0;
        end
        else begin       
                if(write_to_reset) begin
                        case(byteenable)
                                        2'b01:reset_reg <= writedata[0];
                                        default:reset_reg <= reset_reg;
                        endcase  
                end
                else begin
                        reset_reg <= reset_reg;  
                end
        end
end

assign data[15:0]=data_reg[15:0];
assign cs=cs_reg;
assign rs=rs_reg;
assign rd=rd_reg;
assign wr=wr_reg;
assign reset=reset_reg;

endmodule

出0入0汤圆

 楼主| 发表于 2010-10-23 11:14:01 | 显示全部楼层
今天重新写了控制器,成功了。
由100M时钟16分频得到WR_CLK。
每秒钟能刷81帧,呵呵!不知道液晶受不受得了啊!

出0入0汤圆

发表于 2010-10-25 11:20:39 | 显示全部楼层
回复【7楼】yangshuhe33
-----------------------------------------------------------------------

你的源码哪里出问题?提示一下关键处?

出0入0汤圆

 楼主| 发表于 2010-10-26 22:07:35 | 显示全部楼层
本来以为没人关注了,就没来写,呵呵 !

assign data_selected = !address[2] & !address[1] & !address[0];  //address 000
assign cs_selected   = !address[2] & !address[1] &  address[0];  //address 001
assign rd_selected   = !address[2] &  address[1] & !address[0];  //address 010
assign rs_selected   = !address[2] & address[1] & address[0];  //address 011
assign wr_selected   = address[2] & !address[1] & !address[0];  //address 100
assign reset_selected  =  address[2] & !address[1] & address[0];  //address 101

本来以为相对LCD的基地址,偏移0就是DATA的地址,偏移1就是CS的地址,偏移2是RD地址....偏移5就是RESET的地址。
但是因为我的writedata是16位的,实际上偏移0确实是DATA的地址,但是偏移1却不是CS的地址而是与DATA同等的高16位地址。
偏移2才是CS的地址,偏移4是RD,偏移10是RESET.

后来干脆把writedata改成32位了,那样好操作些。

出0入0汤圆

发表于 2010-10-27 16:30:39 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 17:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表