PLD与数字系统设计实验报告剖析.docx
- 文档编号:7738435
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:22
- 大小:454.13KB
PLD与数字系统设计实验报告剖析.docx
《PLD与数字系统设计实验报告剖析.docx》由会员分享,可在线阅读,更多相关《PLD与数字系统设计实验报告剖析.docx(22页珍藏版)》请在冰豆网上搜索。
PLD与数字系统设计实验报告剖析
PLD与数字系统设计实验报告
A组实验四:
数字密码锁
1实验要求
使用Xilinx公司的Spartan3S 400AN开发板上的相关模块,利用ISE开发软件完成数字密码锁的设计,要求实现如下功能:
利用实验板上的4×3小键盘,设计4位密码锁,当输入密码正确时,在液晶屏上显示“OK”,否则,显示“ERROR”,在输入过程中,显示输入的数据个数,当有错误的输入时,显示“ERROR”,当全部输入正确时,才显示OK。
2实验原理
2.14×3数字键盘
数字键盘又叫行列式键盘。
用带IO口的线组成行列结构,按键设置在行列的交点上。
例如用4×3的行列式结构可以构成12个键的键盘。
实验中所用到的数字键盘原理如图1所示。
图14×3数字键盘
例如设置此模块的列为输入端口,行为输出端口。
那么在按下某一个键时,该键所在的开关接通,由输入端口向输出端口输出一个有效电平,继而触发其他模块。
2.2LCD液晶显示模块
开发板上使用的是无字库的12864LCD显示器,12864LCD显示模块是由128*64个液晶显示点组成的一个128列*64行的阵列。
每个显示点对应一位二进制数,1表示亮,0表示灭(但实验所用开发板上该模块实际是低电平表示亮、高电平表示灭)。
存储这些点阵信息的RAM称为显示数据存储器。
以下是关于显示屏的一些参数:
图2128*64LCD控制器结构框图
图3128*64时序图
图4指令功能表
图5初始化指令流程
要显示某个图形就是将相应的点阵信息写入到相应的存储单元中。
图形的点阵信息可以由自己设计也可借助字模软件,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8bits显示数据RAM。
左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。
显示点在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<=16'd0;
ENA<=1'b1;
end
else
begin
CountA<=CountA+1'b1;
ENA<=1'b0;
end
end
always@(posedgeclkornegedgerst_s)//数字键盘扫描,每50ms扫描一行
begin
if(!
rst_s)
begin
CountB<=6'd0;
Key_Row<=4'b0111;
ENB<=1'b0;
end
else
if(CountB==6'd49&&ENA)
begin
CountB<=6'd0;
Key_Row<={Key_Row[0],Key_Row[3:
1]};
ENB<=1'b1;
end
elseif(ENA)
begin
CountB<=CountB+1'b1;
ENB<=1'b0;
end
else
ENB<=1'b0;
end
always@(posedgeclk)//判断每行是否有数据输入,是什么数据
begin
if(Key_Row==4'b0111&&ENB)
begin
if(!
Key_Column[2])
beginw_flag<=1;key_get<=1;end
elseif(!
Key_Column[1])
beginw_flag<=1;key_get<=2;end
elseif(!
Key_Column[0])
beginw_flag<=1;key_get<=3;end
else
w_flag<=0;
end
elseif(Key_Row==4'b1011&&ENB)
begin
if(!
Key_Column[2])
beginw_flag<=1;key_get<=4;end
elseif(!
Key_Column[1])
beginw_flag<=1;key_get<=5;end
elseif(!
Key_Column[0])
beginw_flag<=1;key_get<=6;end
else
w_flag<=0;
end
elseif(Key_Row==4'b1101&&ENB)
begin
if(!
Key_Column[2])
beginw_flag<=1;key_get<=7;end
elseif(!
Key_Column[1])
beginw_flag<=1;key_get<=8;end
elseif(!
Key_Column[0])
beginw_flag<=1;key_get<=9;end
else
w_flag<=0;
end
elseif(Key_Row==4'b1110&&ENB)
begin
if(!
Key_Column[2])
beginw_flag<=1;key_get<=10;end//10代表“*”
elseif(!
Key_Column[1])
beginw_flag<=1;key_get<=0;end
elseif(!
Key_Column[0])
beginw_flag<=1;key_get<=11;end//11代表“#”else
w_flag<=0;
end
end
4.2.2显示模块的设计
always@(posedgeclk_lcd)
begin
if(!
rst_s)
begin
state<=IDLE;
data<=8'hzz;
char_cnt<=8'h00;
flag<=1'b1;
cle_cnt<=9'd0;
mi_cnt<=6'd0;
end
else
begin
case(state)
0:
//初始化FunctionSet
begin
state<=state+1;
data<=8'h30;
rst_lcd<=0;
end
1:
begin
state<=state+1;
data<=8'h3f;rst_lcd<=1;
end
2:
begin
state<=state+1;
data<=8'h3f;end
3:
//初始化DisplayON/OFFControl
begin
state<=state+1;
data<=8'h0c;
end
4:
//初始化DisplayClear
begin
state<=state+1;
data<=8'h01;
end
5:
//初始化EntryModeSet
begin
state<=state+1;
data<=8'h06;
end
6:
//页初始化
begin
state<=state+1;
if((char_cnt==0)||(char_cnt==128))
data<=8'hb8;
elseif((char_cnt==64)||(char_cnt==136))
data<=8'hb9;
elseif((char_cnt==144)||(char_cnt==176))data<=8'hbc;
elseif((char_cnt==160)||(char_cnt==216))data<=8'hbd;
end
7:
//列初始化
begin
state<=state+1;
data<=8'h40;end
8:
//写数据给LCD
beginif((char_cnt>=0&&char_cnt<=127)||(char_cnt>=144&&char_cnt<=175)||(char_cnt>=176&&char_cnt<=255))
begin
cs1<=1;
cs2<=0;
if((char_cnt>=0&&char_cnt<=63)||(char_cnt>=144&&char_cnt<=159)||(char_cnt>=176&&char_cnt<=215))
begin
char_cnt<=char_cnt+1'b1;
data<=data_disp;
if((char_cnt==63)||(char_cnt==159)||(char_cnt==215))
state<=6;
else
state<=8;
end
elseif((char_cnt>=64&&char_cnt<=127)||(char_cnt>=160&&char_cnt<=175)||(char_cnt>=216&&char_cnt<=255))
begin
char_cnt<=char_cnt+1'b1;
data<=data_disp;
if(char_cnt==127)
state<=6;
elseif((char_cnt==175)||(char_cnt==255))
state<=STOP1;
else
state<=8;
end
end
elseif(char_cnt>=128&&char_cnt<=143)
begin
cs1<=0;
cs2<=1;if(char_cnt>=128&&char_cnt<=135)
begin
char_cnt<=char_cnt+1'b1;
data<=data_disp;
if(char_cnt==135)
state<=6;
else
state<=8;
end
elseif(char_cnt>=136&&char_cnt<=143)
begin
char_cnt<=char_cnt+1'b1;
data<=data_disp;
if(char_cnt==143)
state<=9;
else
state<=8;
end
end
end
9:
//判断数字键盘收到的第一个密码是否正确
begin
if(w_flag==0)
begin
state<=9;
cs1<=1;
cs2<=1;
data<=8'h3f;
end
else
begin
if((di_mi==0)&&(pw0==key_get))
state<=13;
else
begin
state<=6;
char_cnt<=176;
end
end
end
10:
//判断数字键盘收到的第二个密码是否正确begin
if(w_flag==0||key_get==pw0)
begin
state<=10;
cs1<=1;
cs2<=1;
data<=8'h3f;
end
else
begin
if((di_mi==1)&&(pw1==key_get))
state<=13;
else
begin
state<=6;
char_cnt<=176;
end
end
end
11:
//判断数字键盘收到的第三个密码是否正确begin
if(w_flag==0||key_get==pw1)
begin
state<=11;
cs1<=1;
cs2<=1;
data<=8'h3f;
end
else
begin
if((di_mi==2)&&(pw2==key_get))state<=13;else
begin
state<=6;char_cnt<=176;
end
end
end
12:
//判断数字键盘收到的第四个密码是否正确begin
if(w_flag==0||key_get==pw2)
begin
state<=12;
cs1<=1;
cs2<=1;
data<=8'h3f;
end
else
begin
if((di_mi==3)&&(pw3==key_get))state<=state+1;else
begin
state<=6;char_cnt<=176;
end
end
end
13:
//显示数字页初始化
begin
state<=state+1;
if((mi_cnt==0)||(mi_cnt==16)||(mi_cnt==32)||(mi_cnt==48))
data<=8'hb8;
elseif((mi_cnt==8)||(mi_cnt==24)||(mi_cnt==40)||(mi_cnt==56))
data<=8'hb9;
end
14:
//显示数字列初始化
begin
state<=state+1;
if((mi_cnt==0)||(mi_cnt==8))
data<=8'h50;
elseif((mi_cnt==16)||(mi_cnt==24))
data<=8'h58;
elseif((mi_cnt==32)||(mi_cnt==40))
data<=8'h60;
elseif((mi_cnt==48)||(mi_cnt==56))
data<=8'h68;
end
15:
//写数字数据给LCD
begin
cs1<=0;
cs2<=1;
if(mi_cnt>=0&&mi_cnt<=7)
begin
mi_cnt<=mi_cnt+1'b1;
data<=mi_disp;
if(mi_cnt==7)
state<=13;
else
state<=15;
end
elseif(mi_cnt>=8&&mi_cnt<=15)
begin
mi_cnt<=mi_cnt+1'b1;
data<=mi_disp;
if(mi_cnt==15)
begin
state<=10;
di_mi<=2'b01;
end
else
state<=15;
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLD 数字 系统 设计 实验 报告 剖析
![提示](https://static.bdocx.com/images/bang_tan.gif)