?? eg7014 v1.0.v
字號:
/*
程序說明:
用于fpga對EG7014液晶屏的刷新顯示.版本1.0.完成于2008.4.14
*/
/*
使用說明:
實現方式是在SDRAM中開辟一段顯示緩存。
程序每隔一定周期(分頻clklcd=clkcount[3]時為1024個周期)讀取一次顯示數據用以刷新LCD。
parameter BASE_ADDRESS = 32'h0080_0000 ;用以規定顯存起始地址。顯存數為偏移量從0到3999的32位數據。
*/
module EG7014
(
input wire reset,
input wire clk,
input wire waitrequest,
output reg[31:0] address,
output reg read,
input wire[31:0] readdata,
//////////////////////
output reg xscl,
output reg lp,
output reg yd,
output wire doff1,
output wire doff2,
output reg[7:0] xd
);
//-----------------------------------------------------------------------
parameter BASE_ADDRESS = 32'h0080_0000 ;
//-----------------------------------------------------------------------
wire clklcd;
reg[4:0] clkcount;
always@(posedge clk) begin
clkcount<=clkcount+1;
end
assign clklcd=clkcount[3];
/////////////////////////////////////
assign doff1= reset ? 0 : 1;//為1時顯示
assign doff2= reset ? 0 : 1;
/////////////////////////////////////
reg[3:0] div;
reg[6:0] x;
reg[7:0] y;
reg[13:0] count;
always@(posedge clklcd or posedge reset) begin
if(reset) begin
div<=0;
x<=0;
y<=0;
end
else begin
div<=div+1;
if(div==15) begin
if(x==80) begin
x<=0;
if(y==199)begin
y<=0;
end
else begin
y<=y+1;
end
end
else begin
x<=x+1;
end
end
end
end
///////////////////////
always@(posedge clklcd or posedge reset) begin
if(reset) begin
lp<=0;
xscl<=0;
yd<=0;
count<=0;
end
else begin
if(div==3) begin
if(x==80) begin
lp<=1;
end
else begin
xscl<=1;
xd<=lcddata[x[2:0]];
count<=count+1;
end
end
else if(div==11) begin
xscl<=0;
lp<=0;
end
/////////////
if((x==80) && (y==0)) begin
if(div==0) begin
yd<=1;
count<=0;
end
else if(div==15) begin
yd<=0;
end
end
end
end
//-----------------------------------------------------------------------
reg[7:0] lcddata[7:0];
reg[5:0] readstate;
always@(posedge clk or posedge reset) begin
if(reset) begin
readstate<=0;
read<=0;
end
else begin
case (readstate)
0 : begin
if(x[2:0]==1) begin
readstate<=1;
address<={BASE_ADDRESS[31:12],count[13:2]+1,2'b00};
read<=1;
end
end
1 : begin
if(waitrequest==0) begin
{lcddata[4],lcddata[5],lcddata[6],lcddata[7]}<=readdata;
readstate<=2;
read<=0;
end
end
2 : begin
if(x[2:0]==5) begin
readstate<=3;
if(count[13:2]>=3999) address<={BASE_ADDRESS[31:12],12'h000};
else address<={BASE_ADDRESS[31:12],count[13:2]+1,2'b00};
read<=1;
end
end
3 : begin
if(waitrequest==0) begin
{lcddata[0],lcddata[1],lcddata[2],lcddata[3]}<=readdata;
readstate<=0;
read<=0;
end
end
endcase
end
end
//-----------------------------------------------------------------------
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -