本设计是利用FPGA控制LCD屏进行显示数字及图片的项目。其中FPGA只使用一个时钟,并不利用生成时钟,稳定性较好。 }LE/{]A
module LCD12864( TRQva8d?
input CLK, //系统时钟输入 WM"I
r1
input RST_N, //系统复位输入 b.t]p
output reg LCD_RS, //LCD的寄存器选择输出信号 H-S28%.
output LCD_RW, //LCD的读、写操作选择输出信号 t;?
q#!uc
output LCD_E, //LCD使能信号 PVvG
output reg [7:0]LCD_D, //LCD的数据总线(不进行读操作,故为输出) *=ALns?y
output PSB, x2nNkd0h
output RST_LCD z?K+LTf8
); KQ 2]VN"?_
gFW1Nm_DJ
reg CLK_LCD; //LCD时钟信号 Ig=4Z*au!g
reg [23:0]cnt; "%sW/ph
E>7[ti_p5
assign PSB = 1; MbJV)*Q
assign RST_LCD = 1; $A-b-`X
// CLK频率为50MHz, 产生LCD时钟信号, 10Hz 3<'n>'
always @(posedge CLK or negedge RST_N) .E@yB`AR
begin iaR'):TD
if (!RST_N) fdPg{3x*k
begin }F\0Bl&
cnt <= 24'b0;
vk$]$6l2
CLK_LCD <= 0; W;o\}irep
end xvW+;3;
else if(cnt == 2499999) 8S)k]$ wf%
begin '|6j1i0x
cnt <= 0; jaDZPX-yS
CLK_LCD <= ~CLK_LCD; hd '!f
end ni3^J5X W
else WJhI6lu
cnt <= cnt +1'b1; 4sG^bZ,
end gB&'MA!
O1-Ne.$
reg [8:0] state; //State Machine code 4|*_mC
parameter IDLE = 9'b00000000; //初始状态,下一个状态为CLEAR 92S<TAdPP
parameter SETFUNCTION = 9'b00000001; //功能设置:8位数据接口 dhV=;'
parameter SETFUNCTION2 = 9'b00000010; fUE jl
parameter SWITCHMODE = 9'b00000100; //显示开关控制:开显示,光标和闪烁关闭 _o<8R@1
parameter CLEAR = 9'b00001000; //清屏 }7UE
parameter SETMODE = 9'b00010000; //输入方式设置:数据读写操作后,地址自动加一/画面不动 ?z?IEj}
parameter SETDDRAM = 9'b00100000; //设置DDRAM的地址:第一行起始为0x80/第二行为0x90 sl`\g1<{`
parameter WRITERAM = 9'b01000000; //数据写入DDRAM相应的地址 zg "<N
parameter STOP = 9'b10000000; //LCD操作完毕,释放其控制 &a7KdGP8V
sg2T)^*V
reg flag; //标志位,LCD操作完毕为0 ;K`qSX;;c(
reg [4:0]char_cnt; |2^cPnv?G&
reg [7:0]data_disp; =)'AXtvE
(L
q^C=
assign LCD_RW = 1'b0; //没有读操作,R/W信号始终为低电平 tEZ@v(D
assign LCD_E = (flag == 1)?CLK_LCD:1'b0; //E信号出现高电平以及下降沿的时刻与LCD时钟相同 #knpZ'
?7(`2=J
always @(posedge CLK_LCD or negedge RST_N) //只有在写数据操作时,RS信号才为高电平,其余为低电平 pO x0f;'G+
begin )6HcPso6
if(!RST_N) E{1O<qO<