PLD与数字系统设计实验报告剖析.docx

上传人:b****5 文档编号:7738435 上传时间:2023-01-26 格式:DOCX 页数:22 大小:454.13KB
下载 相关 举报
PLD与数字系统设计实验报告剖析.docx_第1页
第1页 / 共22页
PLD与数字系统设计实验报告剖析.docx_第2页
第2页 / 共22页
PLD与数字系统设计实验报告剖析.docx_第3页
第3页 / 共22页
PLD与数字系统设计实验报告剖析.docx_第4页
第4页 / 共22页
PLD与数字系统设计实验报告剖析.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

PLD与数字系统设计实验报告剖析.docx

《PLD与数字系统设计实验报告剖析.docx》由会员分享,可在线阅读,更多相关《PLD与数字系统设计实验报告剖析.docx(22页珍藏版)》请在冰豆网上搜索。

PLD与数字系统设计实验报告剖析.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1