哈工大电信学院FPGA设计与应用串口通信实验报告.docx
- 文档编号:10269125
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:10
- 大小:57.46KB
哈工大电信学院FPGA设计与应用串口通信实验报告.docx
《哈工大电信学院FPGA设计与应用串口通信实验报告.docx》由会员分享,可在线阅读,更多相关《哈工大电信学院FPGA设计与应用串口通信实验报告.docx(10页珍藏版)》请在冰点文库上搜索。
哈工大电信学院FPGA设计与应用串口通信实验报告
FPGA设计与应用
串口通信实验报告
班级:
1105103
姓名:
郭诚
学号:
1110510304
日期:
2014年10月30日
实验性质:
验证性实验类型:
必做
开课单位:
电信院学时:
2学时
一、实验目的
1、了解串口通信的基本原理;
2、掌握锁相环的基本原理和使用方法;
3、掌握起始位和停止位的含义及实现方法;
4、掌握VHDL状态机的基本使用方法;
5、掌握基本的接口设计和调试技巧;
二、实验准备
2.1串口通信原理(1分)
串口通信指口按位发送和接收字节。
通信使用3根线完成,分别是地线、发送、接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通信的端口,这些参数必须匹配。
波特率表示每秒传输的位数,接受发送双方必须匹配。
不发送数据时,连线上为高电平。
发送数据时,要首先发送一个起始位,为低电平,然后按照协议发送需要的数据,八位或者九位(带有校验位),然后发送一个停止位,为高电平。
接收时,要首先确定起始位,然后按照协议接受八位或者九位数据。
接受完成后继续判断起始位,开始下一个接受周期。
2.2锁相环的基本原理(1分)
锁相环的框图如上所示,主要包括:
相器、环路滤波器、压控振荡器、分频器构成。
鉴相器用来鉴别输入信号与输出信号之间的相位差,并输出误差电压Ud。
Ud中的噪声和干扰成分被低通性质的环路滤波器滤除,形成压控振荡器的控制电压Uc。
Uc作用于压控振荡器的结果是把它的输出振荡频率fo拉向环路输入信号频率fi,当二者相等时,环路被锁定,称为入锁。
维持锁定的直流控制电压由鉴相器提供,因此鉴相器的两个输入信号间留有一定的相位差。
三、代码及测试
3.1程序及分析(2分)
串口接收程序及分析
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYGC_DIVIS
PORT(CLK:
INSTD_LOGIC;--锁相环输出时钟57.69M
COUT1:
OUTSTD_LOGIC;--分频器输出采样时钟576k
COUT2:
OUTSTD_LOGIC);--分频器产产生扫描时钟100hz
ENDGC_DIV;
ARCHITECTUREBEHAVOFGC_DIVIS
BEGIN
PROCESS(CLK)
VARIABLECOUT1_NUM:
STD_LOGIC_VECTOR(5DOWNTO0):
=(OTHERS=>'0');--输出时钟1计数器
VARIABLECOUT2_NUM:
STD_LOGIC_VECTOR(20DOWNTO0):
=(OTHERS=>'0');--输出时钟2计数
VARIABLECOUT1_1:
STD_LOGIC;
VARIABLECOUT2_2:
STD_LOGIC;
BEGIN
IFRISING_EDGE(CLK)THEN
IFCOUT1_NUM>=49THEN
COUT1_1:
=NOTCOUT1_1;
COUT1_NUM:
=(OTHERS=>'0');
ELSE
COUT1_NUM:
=COUT1_NUM+1;
ENDIF;
IFCOUT2_NUM>=576000THEN
COUT2_2:
=NOTCOUT2_2;
COUT2_NUM:
=(OTHERS=>'0');
ELSE
COUT2_NUM:
=COUT2_NUM+1;
ENDIF;
COUT1<=COUT1_1;
COUT2<=COUT2_2;
ENDIF;
ENDPROCESS;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYGC_RECIS
PORT(CLK_10:
INSTD_LOGIC;--输入时钟,按10倍采样,是串口速率的10倍
CLK_DIS:
INSTD_LOGIC;--DISPLAYCLK
INNUM:
INSTD_LOGIC;--输入的值
LED_EN:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
LED:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
END;
ARCHITECTUREBEHAVOFGC_RECIS
TYPESTATEIS(SPARE,READY,REC,STOP);--定义接受4状态
SIGNALTR_INNUM:
STD_LOGIC_VECTOR(7DOWNTO0);--接收到8位数
SIGNALLED_L:
STD_LOGIC_VECTOR(6DOWNTO0);--控制两位数码管显示
SIGNALLED_H:
STD_LOGIC_VECTOR(6DOWNTO0);
BEGIN
PROCESS(CLK_10)
VARIABLETR_INNUM_NUM:
INTEGERRANGE0TO15:
=0;--对接收到得每一位数计数
VARIABLETRUE:
STD_LOGIC:
='0';
VARIABLECURRENT_STATE:
STATE:
=SPARE;--当前状态
VARIABLESAM_NUM_0:
INTEGERRANGE0TO15:
=0;--对采样次数计数
VARIABLESAM_NUM_1:
INTEGERRANGE0TO15:
=0;
BEGIN
IFCLK_10'EVENTANDCLK_10='1'THEN
IFCURRENT_STATE=SPARETHEN
IFINNUM='0'THEN
SAM_NUM_0:
=SAM_NUM_0+1;--第一次采样到零点
CURRENT_STATE:
=READY;
ELSE
CURRENT_STATE:
=SPARE;
ENDIF;
ELSIFCURRENT_STATE=READYTHEN
IFINNUM='0'THEN
SAM_NUM_0:
=SAM_NUM_0+1;
ELSE
SAM_NUM_1:
=SAM_NUM_1+1;
ENDIF;
IF(SAM_NUM_0+SAM_NUM_1)>=10THEN--判断是否真开端
IFSAM_NUM_0>=6THEN
CURRENT_STATE:
=REC;
SAM_NUM_0:
=0;
SAM_NUM_1:
=0;
ELSE
CURRENT_STATE:
=SPARE;
ENDIF;
ELSE
CURRENT_STATE:
=READY;
ENDIF;
ELSIFCURRENT_STATE=RECTHEN
IFINNUM='0'THEN
SAM_NUM_0:
=SAM_NUM_0+1;
ELSE
SAM_NUM_1:
=SAM_NUM_1+1;
ENDIF;
IF(SAM_NUM_0+SAM_NUM_1)>=10THEN--接受数据判断
IFSAM_NUM_0>=6THEN
TR_INNUM(TR_INNUM_NUM)<='0';
ELSE
TR_INNUM(TR_INNUM_NUM)<='1';
ENDIF;
SAM_NUM_0:
=0;
SAM_NUM_1:
=0;
TR_INNUM_NUM:
=TR_INNUM_NUM+1;
IFTR_INNUM_NUM>=8THEN
CURRENT_STATE:
=STOP;
TR_INNUM_NUM:
=0;
ELSE
CURRENT_STATE:
=REC;
ENDIF;
ELSE
CURRENT_STATE:
=REC;
ENDIF;
ELSIFCURRENT_STATE=STOPTHEN
IFINNUM='1'THEN
SAM_NUM_1:
=SAM_NUM_1+1;
ELSE
SAM_NUM_0:
=SAM_NUM_0+1;
ENDIF;
IF(SAM_NUM_0+SAM_NUM_1)>=10THEN
IFSAM_NUM_1>=6THEN
TRUE:
='1';
CURRENT_STATE:
=SPARE;
ENDIF;
SAM_NUM_0:
=0;
SAM_NUM_1:
=0;
ELSE
CURRENT_STATE:
=STOP;
ENDIF;
ELSE
CURRENT_STATE:
=SPARE;
ENDIF;
ENDIF;
ENDPROCESS;
LED_H<="0111111"whenTR_INNUM(7downto4)=0else
"0000110"whenTR_INNUM(7downto4)=1else
"1011011"whenTR_INNUM(7downto4)=2else
"1001111"whenTR_INNUM(7downto4)=3else
"1100110"whenTR_INNUM(7downto4)=4else
"1101101"whenTR_INNUM(7downto4)=5else
"1111101"whenTR_INNUM(7downto4)=6else
"0000111"whenTR_INNUM(7downto4)=7else
"1111111"whenTR_INNUM(7downto4)=8else
"1101111"whenTR_INNUM(7downto4)=9else
"1110111"whenTR_INNUM(7downto4)=10else
"1111100"whenTR_INNUM(7downto4)=11else
"0111001"whenTR_INNUM(7downto4)=12else
"1011110"whenTR_INNUM(7downto4)=13else
"1111001"whenTR_INNUM(7downto4)=14else
"1110001";
LED_L<="0111111"whenTR_INNUM(3downto0)=0else
"0000110"whenTR_INNUM(3downto0)=1else
"1011011"whenTR_INNUM(3downto0)=2else
"1001111"whenTR_INNUM(3downto0)=3else
"1100110"whenTR_INNUM(3downto0)=4else
"1101101"whenTR_INNUM(3downto0)=5else
"1111101"whenTR_INNUM(3downto0)=6else
"0000111"whenTR_INNUM(3downto0)=7else
"1111111"whenTR_INNUM(3downto0)=8else
"1101111"whenTR_INNUM(3downto0)=9else
"1110111"whenTR_INNUM(3downto0)=10else
"1111100"whenTR_INNUM(3downto0)=11else
"0111001"whenTR_INNUM(3downto0)=12else
"1011110"whenTR_INNUM(3downto0)=13else
"1111001"whenTR_INNUM(3downto0)=14else
"1110001";
PROCESS(CLK_DIS)
VARIABLEA:
STD_LOGIC;
BEGIN
IFRISING_EDGE(CLK_DIS)THEN
IFA='0'THEN
LED<=LED_L;
LED_EN<="0001";
A:
='1';
ELSE
LED<=LED_H;
LED_EN<="0010";
A:
='0';
ENDIF;
ENDIF;
ENDPROCESS;
ENDBEHAV;
ENDBEHAV;接收部分采用发送部分10倍频的时钟对接收数据进行采样。
每采样10次进行一次判断,若低电平多于6次则判决为0,若高电平多于6次则判决为1。
若当前为ready,则判决为低电平后下一时刻转入rec状态。
每接收一位数据计数加一,接收8位数据后转入stop状态。
Stop状态的下一时钟周期进入spare状态。
8位数据全部接收完后,送到数码管显示。
数码管采用七段码译码,高四位和低四位分别由数码管的最低位和倒数第二位显示。
3.2SignalTapII波形测试结果(1分)
(1)串口发送程序的SignalTapII波形测试
(2)串口接收程序的SignalTapII波形测试
四、论述
若串口采用1位起始位,1位停止位,1位奇偶校验位的通信方式,试画出该串口发送数据XXH的波形图。
其中XX代表学号的最后两位,例如学号最后两位为15的,就画出发送数据15H的波形图。
(1分)
答:
学号是111051010204,发送的数据位04H。
奇校验:
偶校验:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈工大 电信 学院 FPGA 设计 应用 串口 通信 实验 报告