Demo codes for FPGA board 解說投影片

Download Report

Transcript Demo codes for FPGA board 解說投影片

lcd_demo code説明
module lcd_test(enable,rw,cs1,cs2,di,db,clk);
output enable,rw,cs1,cs2,di;
output [7:0]db;
input clk;
reg rw,cs1,cs2,di;
reg [7:0]db;
reg [2:0]state=0;
reg [5:0]clry;
//reg [6:0]shcount;
reg [2:0]clrx;
reg [7:0]img[0:7][0:255]; //用來存放”F”,”P”,”G”,”A”四個字的編碼
reg flag,cs;
//Clks
//原始clk經除頻後產生一新的enable clk,提供給lcd module使用
parameter PosScan=11; //0 for pre-sim, 12 for real run
reg [PosScan+3:0] Clks;
always @(posedge clk) Clks=Clks+1;
assign enable=Clks[PosScan];
//state
parameter FcnSet=0;
parameter Xaddr=1;
parameter Yaddr=2;
parameter WriteData=3;
parameter Scan=4;
always @(posedge enable) //must use posedge edge
begin
//先將”F”,”P”,”G”,”A”四個字的編碼放入2維陣列img中
img[0][0]=8‘b11111111;//F
img[0][1]=8'b00010001;
img[0][2]=8'b00010001;
img[0][3]=8'b00010001;
img[0][4]=8'b00010001;
img[0][5]=8'b00010001;
img[0][6]=8'b00000001;
img[0][7]=8'b00000000;
img[0][8]=8'b11111111;//P
img[0][9]=8'b00010001;
img[0][10]=8'b00010001;
img[0][11]=8'b00010001;
img[0][12]=8'b00010001;
img[0][13]=8'b00010001;
img[0][14]=8'b00001110;
img[0][15]=8'b00000000;
img[0][16]=8'b00111110;//G
img[0][17]=8'b01000001;
img[0][18]=8'b10000001;
img[0][19]=8'b10110001;
img[0][20]=8'b10010001;
img[0][21]=8'b10010001;
img[0][22]=8'b01010001;
img[0][23]=8'b00110110;
img[0][25]=8'b11111000;//A
img[0][26]=8'b00010100;
img[0][27]=8'b00010010;
img[0][28]=8'b00010001;
img[0][29]=8'b00010001;
img[0][30]=8'b00010010;
img[0][31]=8'b00010100;
img[0][32]=8'b11111000;
case(state) //寫一FSM去控制 lcd module
FcnSet:begin
//啟動lcd顯示器
cs<=0;
di<=0;
rw<=0;
cs1<=1;
cs2<=1;
db<=8'b00_111111;
state<=Xaddr;
end
Xaddr:begin
//設定X軸位址
di<=0;
db<={5'b10111,clrx};//x address
state<=Yaddr;
end
Yaddr:begin
//設定Y軸位址
db<={2'b01,clry}; //y address
state<=WriteData;
end
WriteData:begin
//將資料寫入所要顯示的位置
di<=1;
db<=8'd0;
state<=Xaddr;
if(clrx==7 && clry==63 && flag==0) //寫完一邊
begin
//LCD(64*8byte)後
state<=Scan;
//換寫另一邊的LCD
end
if(flag)
begin
if(clrx==7 && clry==63)
begin
cs<=~cs;
state<=Scan;
end
if(cs1)
//cs1=1將資料寫到左邊LCD(64*8byte)
db<=img[clrx][clry];
else
//cs2=1將資料寫到右邊LCD(64*8byte)
db<=img[clrx][clry+64];
di<=1;
end
clry<=clry+1;
if(clry==63)
begin
clrx<=clrx+1;
end
end
//寫到第63行時換寫下一列
Scan:begin
//切換掃描左邊LCD or 右邊LCD
case(cs)
0:begin cs1<=1; cs2<=0; end
1:begin cs1<=0; cs2<=1; end
endcase
di<=0;
flag<=1;
state<=Xaddr;
end
endcase
end
endmodule
LCD module spec.
LCD module spec.
THE END