PLD与数字系统设计实验报告Word文档下载推荐.docx
《PLD与数字系统设计实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《PLD与数字系统设计实验报告Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。
512*8bitsRAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。
每个存储单元存储8个液晶点的显示信息。
为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。
每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。
(需要注意:
二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。
即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。
因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。
例如点亮128*64的屏中(50,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;
行地址50除以8取整得6,取余得2,该点在RAM中页地址为6,在字节中的序号为2;
所以将二进制数据11111101写入Xpage=6,Yaddress=29的存储单元中即点亮(50,30)上的液晶点。
3实验仪器
1.XUP(FPGA:
spartan3S400AN)实验开发板
2.安装ISE软件的电脑
4实验主要操作步骤
4.1实验设计思想
实验采用分层次设计的方法,用硬件描述语言分别实现数字键盘数据的发送接收功能及液晶显示的功能模块,具体方法如下:
1.通过ISE开发工具,新建3个模块,分别为数字键盘模块,LCD12864液晶显示模块和LCD字库模块。
2.数字键盘模块:
以一定频率按行扫描数字键盘,检测该行有无输入,若有则判断输入是什么,并传送相应信息给LCD模块;
若无则继续扫描下一行。
如此反复。
3.液晶显示模块:
根据LCD显示模块的原理,将其控制分为指令控制部分和显示控制部分。
其中使用状态机和分频器完成指令控制,每一个分频时钟周期到来时,执行状态机中的一个状态,即初始化命令或读写数据命令。
4.LCD字库模块:
因为实验板上的12864LCD是无字库的,故利用字模软件将要用到的字模数据保存在模块中。
4.2各模块设计实现
在理解数字键盘和LCD液晶显示的使用方法后,使用Verilog语言描述出各部分要实现的功能,完成实验的要求。
4.2.1数字键盘模块的设计
下面是该模块功能实现的部分Verilog源程序:
always@(posedgeclkornegedgerst_s)//产生周期为1ms的控制信号,占空时间为20ns
begin
if(!
rst_s)
begin
CountA<
=16'
d0;
ENA<
=1'
b0;
end
else
if(CountA==T1MS)
begin
CountA<
ENA<
b1;
end
else
=CountA+1'
end
always@(posedgeclkornegedgerst_s)//数字键盘扫描,每50ms扫描一行
CountB<
=6'
Key_Row<
=4'
b0111;
ENB<
if(CountB==6'
d49&
&
ENA)
CountB<
Key_Row<
={Key_Row[0],Key_Row[3:
1]};
ENB<
elseif(ENA)
=CountB+1'
end
always@(posedgeclk)//判断每行是否有数据输入,是什么数据
if(Key_Row==4'
b0111&
ENB)
if(!
Key_Column[2])
beginw_flag<
=1;
key_get<
=1;
end
elseif(!
Key_Column[1])
=2;
end
Key_Column[0])
=3;
end
else
w_flag<
=0;
elseif(Key_Row==4'
b1011&
=4;
=5;
end
=6;
b1101&
=7;
=8;
=9;
b1110&
=10;
end//10代表“*”
=0;
=11;
end//11代表“#”else
4.2.2显示模块的设计
always@(posedgeclk_lcd)
if(!
rst_s)
state<
=IDLE;
data<
=8'
hzz;
char_cnt<
h00;
flag<
=1'
cle_cnt<
=9'
mi_cnt<
=6'
case(state)
0:
//初始化FunctionSet
begin
state<
=state+1;
data<
h30;
rst_lcd<
end
1:
h3f;
rst_lcd<
2:
end
3:
//初始化DisplayON/OFFControl
h0c;
4:
//初始化DisplayClear
h01;
5:
//初始化EntryModeSet
h06;
6:
//页初始化
if((char_cnt==0)||(char_cnt==128))
data<
hb8;
elseif((char_cnt==64)||(char_cnt==136))
hb9;
elseif((char_cnt==144)||(char_cnt==176))data<
hbc;
elseif((char_cnt==160)||(char_cnt==216))data<
hbd;
7:
//列初始化
h40;
8:
//写数据给LCD
beginif((char_cnt>
=0&
char_cnt<
=127)||(char_cnt>
=144&
=175)||(char_cnt>
=176&
=255))
begin
cs1<
cs2<
if((char_cnt>
=63)||(char_cnt>
=159)||(char_cnt>
=215))
begin
char_cnt<
=char_cnt+1'
data<
=data_disp;
if((char_cnt==63)||(char_cnt==159)||(char_cnt==215))
state<
=6;
else
=8;
end
elseif((char_cnt>
=64&
=160&
=216&
if(char_cnt==127)
elseif((char_cnt==175)||(char_cnt==255))
=STOP1;
end
elseif(char_cnt>
=128&
=143)
if(char_cnt>
=135)
if(char_cnt==135)
end
elseif(char_cnt>
=136&
if(char_cnt==143)
=9;
end
9:
//判断数字键盘收到的第一个密码是否正确
if(w_flag==0)
state<
data<
else
if((di_mi==0)&
(pw0==key_get))
state<
=13;
else
state<
=176;
end
10:
//判断数字键盘收到的第二个密码是否正确begin
if(w_flag==0||key_get==pw0)
=10;
if((di_mi==1)&
(pw1==key_get))
11:
//判断数字键盘收到的第三个密码是否正确begin
if(w_flag==0||key_get==pw1)
=11;
else
if((di_mi==2)&
(pw2==key_get))state<
else
char_cnt<
12:
//判断数字键盘收到的第四个密码是否正确begin
if(w_flag==0||key_get==pw2)
=12;
if((di_mi==3)&
(pw3==key_get))state<
13:
//显示数字页初始化
if((mi_cnt==0)||(mi_cnt==16)||(mi_cnt==32)||(mi_cnt==48))
elseif((mi_cnt==8)||(mi_cnt==24)||(mi_cnt==40)||(mi_cnt==56))
14:
//显示数字列初始化
if((mi_cnt==0)||(mi_cnt==8))
h50;
elseif((mi_cnt==16)||(mi_cnt==24))
h58;
elseif((mi_cnt==32)||(mi_cnt==40))
h60;
elseif((mi_cnt==48)||(mi_cnt==56))
h68;
15:
//写数字数据给LCD
cs1<
cs2<
if(mi_cnt>
mi_cnt<
=7)
mi_cnt<
=mi_cnt+1'
=mi_disp;
if(mi_cnt==7)
=15;
elseif(mi_cnt>
=8&
=15)
if(mi_cnt==15)
di_mi<
=2'
b01;