yangshuhe33 发表于 2010-10-20 17:42:37

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

看到很多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,上升沿就可以把数据写到液晶里去了。

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

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

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

sytu_xww 发表于 2010-10-20 21:17:32

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

yangshuhe33 发表于 2010-10-20 22:46:21

呵呵,似乎这样是对的。我也是这么想的,但是没有经验就不太敢去做。

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

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

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

sytu_xww 发表于 2010-10-21 08:28:27

做过人家也不会给你的
坛子里有很多CPLD做的代码你倒是可以看看。

ahfong2006 发表于 2010-10-21 09:15:36

带ILI9325还要CPLD+RAM干嘛?

sytu_xww 发表于 2010-10-21 21:54:37

回复【4楼】ahfong2006
-----------------------------------------------------------------------

是的
可以不用了

yangshuhe33 发表于 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 byteenable;
input reset_n;
input chipselect;
input address;
input write;
input writedata;
//outputs
output data;
output cs;
output rd;
output rs;
output wr;
output reset;
reg 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 & !address & !address;//address 000
assign cs_selected   = !address & !address &address;//address 001
assign rd_selected   = !address &address & !address;//address 010
assign rs_selected   = !address & address & address;//address 011
assign wr_selected   = address & !address & !address;//address 100
assign reset_selected=address & !address & address;//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 <= 16'b0000_0000_0000_0000;
        end
        else begin       
                if(write_to_data) begin
                                case(byteenable)
                                        2'b01: data_reg <= writedata;
                                        2'b10: data_reg <= writedata;
                                        default:data_reg <= data_reg;
                                endcase        
                end
                else begin
                        data_reg <= data_reg;
                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;        
                                        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;
                                        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;        
                                        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;
                                        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;
                                        default:reset_reg <= reset_reg;
                        endcase
                end
                else begin
                        reset_reg <= reset_reg;
                end
        end
end

assign data=data_reg;
assign cs=cs_reg;
assign rs=rs_reg;
assign rd=rd_reg;
assign wr=wr_reg;
assign reset=reset_reg;

endmodule

yangshuhe33 发表于 2010-10-23 11:14:01

今天重新写了控制器,成功了。
由100M时钟16分频得到WR_CLK。
每秒钟能刷81帧,呵呵!不知道液晶受不受得了啊!

l1715s 发表于 2010-10-25 11:20:39

回复【7楼】yangshuhe33
-----------------------------------------------------------------------

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

yangshuhe33 发表于 2010-10-26 22:07:35

本来以为没人关注了,就没来写,呵呵 !

assign data_selected = !address & !address & !address;//address 000
assign cs_selected   = !address & !address &address;//address 001
assign rd_selected   = !address &address & !address;//address 010
assign rs_selected   = !address & address & address;//address 011
assign wr_selected   = address & !address & !address;//address 100
assign reset_selected=address & !address & address;//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位了,那样好操作些。

guozhiyuan 发表于 2010-10-27 16:30:39

mark
页: [1]
查看完整版本: 看到很多CPLD+RAM的液晶控制器。