看到很多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,上升沿就可以把数据写到液晶里去了。
但是这液晶有个毛病,就是初始化函数太长,没有初始化就不能操作液晶。怎么才能实现初始化.
这是我的自我想法,不知道能否实现。希望大家给点意见或建议。
有人做过这样的控制器,或是有更好的方法吗?这种液晶要想提高写入速度,应该怎么弄呢? 初始化很复杂的话你可以使用Nios来初始化,也就是在使用AVALON之前,通过IO直接初始化,然后将IO的控制权交给低层的模块。
利用硬件来直接把数据打给液晶控制器。
简单说来,Nios需要做的就是初始化液晶,然后指示低层的模块开始工作。
低层的工作就是完成数据的搬运。
但是这里面涉及到你图像数据怎么正确的送到缓存,解决写和读的时序,你就成功了。
他们做的CPLD+SRAM的重点也是这个写和读的时序控制。
不知道对你 有没有帮助。。。
呵呵 呵呵,似乎这样是对的。我也是这么想的,但是没有经验就不太敢去做。
底层数据正确送到缓冲的话应该可以模仿那个VGA控制器。
现在写了一个avalon外设(是模仿IO的)输出RS CS RESET WR RD DATA到液晶的引脚,也就是
用这个控制器来操作液晶和直接用PIO来操作液晶没什么两样。
但是这个还没做对呢!呵呵
这还只是整个想法的一小部分!
问题就是 没有人这样做过液晶控制器吗?没有源代码吗? 做过人家也不会给你的
坛子里有很多CPLD做的代码你倒是可以看看。 带ILI9325还要CPLD+RAM干嘛? 回复【4楼】ahfong2006
-----------------------------------------------------------------------
是的
可以不用了 我写了这个控制器。但是液晶没反应,不知道是什么问题。
我写过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 今天重新写了控制器,成功了。
由100M时钟16分频得到WR_CLK。
每秒钟能刷81帧,呵呵!不知道液晶受不受得了啊! 回复【7楼】yangshuhe33
-----------------------------------------------------------------------
你的源码哪里出问题?提示一下关键处? 本来以为没人关注了,就没来写,呵呵 !
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位了,那样好操作些。 mark
页:
[1]