PLD串口通信实验报告DOC.docx
- 文档编号:4688551
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:22
- 大小:1.57MB
PLD串口通信实验报告DOC.docx
《PLD串口通信实验报告DOC.docx》由会员分享,可在线阅读,更多相关《PLD串口通信实验报告DOC.docx(22页珍藏版)》请在冰豆网上搜索。
PLD串口通信实验报告DOC
PLD与数字系统设计实验报告
--A组选做实验(串口通信)
1实验要求
串行通信实验,设置波特率为9600或19200。
计算机通过RS232接口向实验板发送数据,要求实验开发板能够正确接收到这些数据,并且将接收到的数据显示到实验开发板的LCD液晶屏上;当按下实验板的按键时,将接收到的数据正确地发给计算机,并将实验板上的按键值也发给计算机,计算机能够显示实验板发出的数据。
2实验原理
2.1串口接口(RS232)
串行接口是连接FPGA和PC机的一种简单方式。
使用9针的"DB-9"插头,允许全双工的双向通讯(也就是说计算机可以在接收数据的同时发送数据),最大可支持的传输速率为10KBytes/s。
如下图1所示:
图1DB-9插头
它一共有9个引脚,但是最重要的3个引脚分别是:
引脚2:
RxD(接收数据),引脚3:
TxD(发送数据),引脚5:
GND(地),,其他线由于握手,可以不使用,本次实验仅使用3跟电缆实现发送和接收数据。
2.2串口通信协议
由于串口通信是异步的,数据以每次一位的方式传输;每条线用来传输一个方向的数据。
由于计算机通常至少需要若干位数据,因此数据在发送之前先“串行化”。
通常是以8位数据为1组,先发送最低有效位,最后发送最高有效位。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验位。
对于两个进行通信的端口,这些参数必须匹配:
波特率:
这是一个衡量通信速度的参数。
RS-232使用异步通讯协议,也就是说数据的传输没有时钟信号,接收端必须有某种方式,使之与接收数据同步。
波特率表示每秒钟传送的bit的个数。
当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。
这意味着串口通信在数据线上的采样率为4800Hz。
数据位:
这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。
比如,标准的ASCII码是0~127(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
停止位:
用于表示发送串行数据的最后一位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
奇偶校验位:
在串口通信中一种简单的检错方式。
有四种检错方式:
偶、奇、高和低。
当然没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
如果是奇校验,校验位位1,这样就有3个逻辑高位。
串口通信的数据传输时序如图:
图2串口通信时序图
例如0x55是传输的方式如下:
图3异步串行通信格式
0x55的二进制表示为:
01010101。
但是由于先发送的是最低有效位,所以发送序列是这样的:
1-0-1-0-1-0-1-0。
2.3液晶显示模块
实验使用无字库的12864LCD显示,对12864的操作都是围绕着几根引脚展开的。
包括写命令、写数据、读数据、读状态就是通过这些引脚的高低电平搭配来实现的。
以下是关于显示屏的一些参数:
图4内部结构图
图5写时序图
图6基本操作时序
3实验仪器
XUP(FPGA:
spartan3S400AN)实验开发板
安装ISE软件的电脑及串口线一根
串口调试助手小软件
4实验主要操作步骤
4.1实验设计思想
实验采用分层次设计的方法,用硬件描述语言分别实现串口发送接收的功能及液晶显示的功能模块,最后用对顶层原理图进行综合的方法实现整个设计。
具体方法如下:
1.通过ISE开发工具,新建2个模块,分别为串口通信模块,lcd12864液晶显示模块,另外再加一个顶层原理图输入文件。
2.串口通信模块主要分为四个进程部分:
波特率 产生部分(发射和接收)、串行数据接收部分、串行数据发送部分。
3.波特率产生部分:
主要是通过计数来实现波特率产生,并对数据进行采样。
为了保证接收串行数据的准确性,一般使用比波特率高数倍的时钟作为接收数据的采样时钟。
此处采用9600*8hz的信号,并且在计数到每个脉宽的第七个时隙对数据进行采样。
4.串行数据接收部分:
当检测到接收信的低电平时,对数据进行采集。
5.串行数据发送部分:
当接收到发送信号的低电平时,对数据进行发送。
6.液晶显示模块:
上位机发送到的数据由液晶屏显示。
4.2各模块设计实现
在理解串口通信协议、LCD液晶显示的使用方法后,使用Verilog语言描述出各部分要实现的功能,完成实验的要求。
4.2.1串口通信模块的设计
下面是该模块功能实现的部分Verilog源程序:
always@(posedgeclk)//波特率产生部分
begin
if(!
nrst)
div_reg<=0;
elsebegin
if(div_reg==div_par-1)
div_reg<=0;//分频计数器div_reg
else
div_reg<=div_reg+1;
end
end
always@(posedgeclk)//分频得到8倍波特率的时钟clkbaud8x
begin
if(!
nrst)
clkbaud8x<=0;
elseif(div_reg==div_par-1)
clkbaud8x<=~clkbaud8x;
end
//接受PC机串行数据
always@(posedgeclkbaud8xornegedgenrst)
begin
if(!
nrst)begin
rxd_reg1<=0;
rxd_reg2<=0;
rxd_buf<=0;
state_rec<=0;
recstart<=0;
recstart_tmp<=0;
end
elsebegin
rxd_reg1<=rxd;
rxd_reg2<=rxd_reg1;
if(state_rec==0)begin
if(recstart_tmp==1)begin
recstart<=1;
recstart_tmp<=0;
state_rec<=state_rec+1;
end
elseif(!
rxd_reg1&&rxd_reg2)//检测到起始位的下降沿,进入接受数据状态
recstart_tmp<=1;
end
elseif(state_rec>=1&&state_rec<=8)begin
if(clkbaud_rec)begin
rxd_buf[7]<=rxd_reg2;
rxd_buf[6:
0]<=rxd_buf[7:
1];
state_rec<=state_rec+1;
end
end
elseif(state_rec==9)begin
if(clkbaud_rec)begin
state_rec<=0;
recstart<=0;
end
end
end
end
//数据发送部分
always@(posedgeclkbaud8xornegedgenrst)
begin
if(!
nrst)begin
txd_reg<=1;
trasstart<=0;
txd_buf<=0;
state_tras<=0;
key_entry2<=0;
end
elsebegin
if(!
key_entry2)begin
if(key_entry1)begin
key_entry2<=1;
txd_buf<=rxd_buf;//发送接受到的数据
end
end
elsebegin
case(state_tras)
4'b0000:
begin//发送起始位,检测起始位的低电平
if(!
trasstart)
trasstart<=1;
else//if(send_state<7)begin
if(clkbaud_tras)begin
txd_reg<=0;
state_tras<=state_tras+1;
end
//end
elsebegin
key_entry2<=0;
state_tras<=0;
end
end
4'b0001:
begin//发送第1位
if(clkbaud_tras)begin
txd_reg<=txd_buf[0];
txd_buf[6:
0]<=txd_buf[7:
1];
state_tras<=state_tras+1;
end
end
4'b0010:
begin//发送第2位
if(clkbaud_tras)begin
txd_reg<=txd_buf[0];
txd_buf[6:
0]<=txd_buf[7:
1];
state_tras<=state_tras+1;
end
end
4'b0011:
begin//发送第3位
if(clkbaud_tras)begin
txd_reg<=txd_buf[0];
txd_buf[6:
0]<=txd_buf[7:
1];
state_tras<=state_tras+1;
end
end
4'b0100:
begin//发送第4位
if(clkbaud_tras)begin
txd_reg<=txd_buf[0];
txd_buf[6:
0]<=txd_buf[7:
1];
state_tras<=state_tras+1;
end
end
4'b0101:
begin//发送第5位
if(clkbaud_tras)begin
txd_reg<=txd_buf[0];
txd_buf[6:
0]<=txd_buf[7:
1];
state_tras<=state_tras+1;
end
end
4'b0110:
begin//发送第6位
if(clkbaud_tras)begin
txd_reg<=txd_buf[0];
txd_buf[6:
0]<=txd_buf[7:
1];
state_tras<=state_tras+1;
end
end
4'b0111:
begin//发送第7位
if(clkbaud_tras)begin
txd_reg<=txd_buf[0];
txd_buf[6:
0]<=txd_buf[7:
1];
state_tras<=state_tras+1;
end
end
4'b1000:
begin//发送第8位
if(clkbaud_tras)begin
txd_reg<=txd_buf[0];
txd_buf[6:
0]<=txd_buf[7:
1];
state_tras<=state_tras+1;
end
end
4'b1001:
begin//发送停止位
if(clkbaud_tras)begin
txd_reg<=1;
txd_buf<=8'h55;
state_tras<=state_tras+1;
end
end
default:
begin
if(clkbaud_tras)begin
state_tras<=state_tras+1;
trasstart<=1;
end
end
endcase
end
end
end
//将接受的数据用lcd显示出来,本实验只写了部分字符的编码
always@(rxd_buf)
begin
case(rxd_buf)
8'h30:
wordnum<=0;//转化成12864显示的字符0
8'h31:
wordnum<=1;
8'h32:
wordnum<=2;
8'h33:
wordnum<=3;
8'h34:
wordnum<=4;
8'h35:
wordnum<=5;
default:
wordnum<=6;//其他按键转换成显示字符*
endcase
end
endmodule
经过语法检查和综合等步骤后,在当前资源管理窗口中的Designutilities项目中,生成电路模块符号,如下图所示:
图7串口通信模块电路图
4.2.2显示模块的设计
12864液晶屏的控制主要分为指令控制和显示控制两个部分,使用状态机和计数器的结合方法实现指令的控制。
部分源程序如下:
reg[31:
0]count;
integeri;
reg[7:
0]X,Y,X0;
always@(posedgeclk)
begin
if(!
nrst)
begin
/*放置字库处*/写入字符‘0’
word[0]<=8'h00;word[1]<=8'hE0;word[2]<=8'h10;word[3]<=8'h08;
word[4]<=8'h08;word[5]<=8'h10;word[6]<=8'hE0;word[7]<=8'h00;
word[8]<=8'h00;word[9]<=8'h0F;word[10]<=8'h10;word[11]<=8'h20;
word[12]<=8'h20;word[13]<=8'h10;word[14]<=8'h0F;word[15]<=8'h00;
//有限状态机
state<=S_initial;
CS1_CS2<=2'b11;
X<=8'hb8;
Y<=8'h40;
X0<=8'hb8;
i<=0;
count<=0;
end
else
begin
case(state)
S_initial:
begin
DataIn<=8'h3f;//FunctionSet
ID<=0;
startflag<=1;
count<=count+1;
if(count>=100)//2us确保能写进去
begin
state<=S_initial_1;
count<=0;
end
else
state<=S_initial;
end
S_initial_1:
//等待写完
begin
startflag<=0;
state<=S_initial_1;
if(finishflag)
begin
count<=count+1;
if(count>=2000)//等待39us
begin
state<=S_initial_2;
count<=0;
end
end
end
S_initial_2:
begin
DataIn<=8'h0f;//DisplayON/OFFControl
ID<=0;
startflag<=1;
count<=count+1;
if(count>=100)//2us确保能写进去
begin
state<=S_initial_3;
count<=0;
end
else
state<=S_initial_2;
end
S_initial_3:
//等待写完
begin
startflag<=0;
state<=S_initial_3;
if(finishflag)
begin
count<=count+1;
if(count>=2000)//?
?
待39us
begin
state<=S_initial_4;
count<=0;
end
end
end
S_initial_4:
begin
DataIn<=8'h01;//DisplayClear
ID<=0;
startflag<=1;
count<=count+1;
if(count>=100)//2us确保能写进去
begin
state<=S_initial_5;
count<=0;
end
else
state<=S_initial_4;
end
S_initial_5:
//waitfor1.5ms
begin
startflag<=0;
count<=count+1;
state<=S_initial_5;
if(count>=100000)//2ms
begin
count<=0;
state<=S_initial_6;
end
end
S_initial_6:
begin
DataIn<=8'h06;//EntryModeSet
ID<=0;
startflag<=1;
count<=count+1;
if(count>=100)
begin
state<=S_initial_7;
count<=0;
end
else
state<=S_initial_6;
end
S_initial_7:
//InitialFinish
begin
startflag<=0;
state<=S_initial_7;
if(finishflag)
begin
CS1_CS2<=2'b10;//对第一块操作
count<=count+1;
if(count>=2000)
begin
state<=S_operate;
count<=0;
end//等待39us
end
end
//////////////////////////////////////////////////////////////
S_operate:
//设计Y
begin
DataIn<=Y;//8'h40;
ID<=0;
startflag<=1;
state<=S_operate;
count<=count+1;
if(count>=100)//2us确保能写进去
begin
startflag<=0;
end
if(count>=3000)//60us//等待的39us加上执行的8us提供足够的时间余量
begin
count<=0;
state<=S_operate_1;
end
end
S_operate_1:
//设计X
begin
DataIn<=X;//8'hb8;
ID<=0;
startflag<=1;
state<=S_operate_1;
count<=count+1;
if(count>=100)//2us确保能写进去
begin
startflag<=0;
end
if(count>=3000)//60us//等待的39us加上执行的8us提供足够的时间余量
begin
count<=0;
state
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLD 串口 通信 实验 报告 DOC