|
发表于 2013-11-7 15:59:57
|
显示全部楼层
框架搞好啦,不过有个问题 不知道为什么,每次变换颜色时候会缺2个点。
查的我头都疼了。
以下为verilog 代码:
//
//
//EPM240+61LV25616+TMS320VC5509 驱动TFT夏普LQ057,5.7 320*240
//
//
module Epm240_Sram_CtrTft( Clk , //40MHZ晶振
Dsp_Data, Dsp_Address,Emif_Awe, Emif_Ce2, Emif_Ce3, // 显示数据写入接口
Sram_Data, Sram_Address, Sram_Ce, Sram_Oe, Sram_We, //Sram 接口 UB/LB 已接低
Tft_RGB, Tft_Ck, Tft_Hs, Tft_Vs, Tft_En, TFT_Rl); //LQ057接口 32PIN 只用RGB只用了3*6共18位,HS,VS模式
input Clk, Emif_Ce2, Emif_Ce3, Emif_Awe;
input [3:0] Dsp_Address; //
output Sram_Ce, Sram_Oe, Sram_We, Tft_Ck, Tft_Vs, Tft_Hs, Tft_En,TFT_Rl;
output [17:0] Sram_Address, Tft_RGB;
input [8:0] Dsp_Data;
inout [15:0] Sram_Data;
//接口
reg Tft_Ck=0; //Tft 时钟
reg Tft_En=0; //Tft ENAB模式,本例无效
reg Tft_Hs=0; //列时序
reg Tft_Vs=0;
reg TFT_Rl=1; //行时序
reg [17:0]Tft_RGB;
reg Sram_Oe;
reg Sram_We=0;
reg Sram_Ce=0;
wire [17:0] Sram_Address;
//标志
reg Mark_TftReady=0; //TFT 上电完成标志
reg Display_Valid=0;
//计数器
reg [18:0] Counter_Delay=0; // 延时计数器
reg [2:0] Counter_FreqDiv=0; //分频计数器
reg [8:0] Counter_TftVs; //TFT行计数器
reg [8:0] Counter_TftHs; //TFT列计数器
//临时寄存器
reg [17:0] Temp_SramAddrW=0;
reg [17:0] Temp_SramAddrR=0;
reg [15:0] Temp_SramData=0;
///////////////////////////////WAIT//FOR//READY/////////////////////////////////
//
assign Sram_Address=Sram_We? Temp_SramAddrR:Temp_SramAddrW;//Temp_SramOe为高写入为写数地址
assign Sram_Data =Sram_Oe? Temp_SramData:18'hzzzzzz; //Temp_SramOe为高为写入状态
//延时10ms等待tft上电完成
always @ (posedge Clk)
begin
if(Mark_TftReady==0)
begin
Counter_Delay<=Counter_Delay+1;
if(Counter_Delay>=400000)
begin
Mark_TftReady<=1;
end
end
end
//////////////////////////////////////////TFT***BEGIN////////////////////////////////
//40Mhz晶振6分频 6.67Mhz 作为TFT时钟
always @ (posedge Clk)
begin
if(Mark_TftReady==1)
begin
if((Counter_FreqDiv==2)||(Counter_FreqDiv==5))
begin
Tft_Ck=~Tft_Ck;
if(Counter_FreqDiv==5)
Counter_FreqDiv<=0;
end
Counter_FreqDiv<=Counter_FreqDiv+1;
end
end
//行有效时钟380个,选取320个送显示点
always @ (posedge Tft_Ck)
begin
if (Counter_TftHs<40)
Tft_Hs=0;
else
Tft_Hs=1;
if (Counter_TftHs>=420)
Counter_TftHs<=0;
else
Counter_TftHs<=Counter_TftHs+1;
end
//列有效时钟276个,选取中间的240个送显示
always@(negedge Tft_Hs)
begin
if(Counter_TftVs<7)
Tft_Vs=0;
else
Tft_Vs=1;
if(Counter_TftVs>=283)
Counter_TftVs<=0;
else
Counter_TftVs=Counter_TftVs+1;
end
//////////////////////////////////////////TFT***END////////////////////////////////
////////////////////////////////////SRAM***BEGIN////////////////////////////////////
//Counter_FreqDiv
//Tft_Ck为0~3时钟周期 写入SRAM
always @ (posedge Clk)
begin
if(Mark_TftReady==1)
begin
case(Counter_FreqDiv)
3'b000:
begin
Sram_Oe=1;
Sram_We=0;
if((Counter_TftHs==85)&&(Counter_TftVs==18)) //模拟DSP写入显示数据到SRAM 中。
Temp_SramAddrW=0; //显示数据存于SRMA地址 0~320*240
Temp_SramAddrW=Temp_SramAddrW+1;
end
3'b001:
begin
if(Temp_SramAddrW<76800)
begin
if(Temp_SramAddrW<642)
Temp_SramData=9'b000000111; //red
else
if(Temp_SramAddrW<1282)
Temp_SramData=9'b111000000; //blue
else
if(Temp_SramAddrW<51202)
Temp_SramData=9'b000111000; //green
else
if(Temp_SramAddrW<76800) //320*240=76800
Temp_SramData=9'b111000000;
else
Temp_SramData=9'b000000000;
end
end
3'b010:
begin
Sram_Oe=1;
Sram_We=0;
end
3'b011:
begin
end
3'b100:
begin
Sram_Oe=0;
Sram_We=1;
if((Counter_TftHs==85)&&(Counter_TftVs==19)) //读SRAM
begin
Temp_SramAddrR<=0;
Display_Valid<=1; //由于显示行列有效数据间有空周期 设定了显示有效位。
end
if(((Counter_TftHs>85)&&(Counter_TftHs<=405))&&((Counter_TftVs>=19)&&(Counter_TftVs<259)))
begin
Temp_SramAddrR<=Temp_SramAddrR+1;
Display_Valid<=1;
end
else
Display_Valid<=0;
end
3'b101:
begin
if(Display_Valid)
begin
Tft_RGB[2:0]=3'b000; //512色即可
Tft_RGB[5:3]=Sram_Data[2:0];
Tft_RGB[8:6]=3'b000;
Tft_RGB[11:9]=Sram_Data[5:3];
Tft_RGB[14:12]=3'b000;
Tft_RGB[17:15]=Sram_Data[8:6];
end
else
Tft_RGB<=18'bzzzzzzzzzzzzzzzzzzz;
end
default
Tft_RGB<=18'bzzzzzzzzzzzzzzzzzzz;
endcase
end
end
////////////////////////////////////SRAM***END//////////////////////////////////////
/////////////////////////////////DSPDATA***BEGIN////////////////////////////////////
//依据Dsp_Address数据判别送来数据类型
//0 列地址 2行地址 4前景色 5背景色 6写显示数据寄存器 7状态控制寄存器
//Sram_Address 【17:8】行地址【7:0】列地址
always @ (negedge Emif_Awe )
begin
if( Emif_Ce2==0)
case (Dsp_Address)
4'b0000:
begin
//Temp_SramAddrW[7:0]=Dsp_Data[7:0];
end
4'b0001:
begin
end
4'b0010:
begin
//Temp_SramAddrW=Dsp_Data*320+Temp_SramAddrW[7:0];
end
4'b0011:
begin
//Temp_SramData=Dsp_Data;
end
4'b0100:
begin
end
4'b0101:
begin
end
4'b0110:
begin
end
4'b0111:
begin
end
4'b1000:
begin
end
endcase
end
/////////////////////////////////DSPDATA***END//////////////////////////////////////
endmodule
过几天再继续完善。 |
|