哈工大电信学院FPGA报告Word文档格式.docx
《哈工大电信学院FPGA报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《哈工大电信学院FPGA报告Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
然后利用FPGA进行串口数据接收;
接收后进行(7,4)汉明译码,并将译码后的结果送给七段数码管进行显示。
要求使用4个七段数码管,其中2个数码管用于显示从串口接收到的数据,另一个数码管用于显示汉明译码后的正确信息比特,最后一个数码管用于指示出错比特的位置。
三、实验准备(10分)
3.1串口通信的基本原理(5分)
串口通信指口按位发送和接收字节。
通信使用3根线完成,分别是地线、发送、接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根
线上接收数据。
其他线用于握手,但不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通信的端口,这些参数必须匹配。
波特率表示每秒传输的位数,接受发送双方必须匹配。
不发送数据时,连线上为高电平。
发送数据时,要首先发送一个起始位,为低电平,然后按照协议发送需要的数据,八位或者九位(带有校验位),然后发送一个停止位,为高电平。
接收时,要首先确定起始位,然后按照协议接受八位或者九位数据。
接受完成后继续判断起始位,开始下一个接受周期。
3.2(7,4)汉明码的编译码基本原理(5分)
一般来说,若汉明码长为n,信息位数为k,则监督位数r=n-k。
若希望用r个监督位构造出r个监督关系式来指示一位错码的n种可能位置,则要求
或
(1)
下面以(7,4)汉明码为例说明原理:
设汉明码(n,k)中k=4,为了纠正一位错码,由式
(1)可知,要求监督位数r≥3。
若取r=3,则n=k+r=7。
我们用
来表示这7个码元,用
的值表示3个监督关系式中的校正子,则
的值与错误码元位置的对应关系可以规定如表1所列。
错码位置
001
101
010
110
100
111
011
000
无错码
表1监督位与错码位置
则由表1可得监督关系式:
(2)
在发送端编码时,信息位
的值决定于输入信号,因此它们是随机的。
监督位
、
应根据信息位的取值按监督关系来确定,即监督位应使式
(2)~式(4)中
的值为0(表示编成的码组中应无错码)
(3)
当数字信号编码成汉明码形式(本文中即A)后在信道中传输,由于信道中噪声的干扰,可能由于干扰引入差错,使得接收端收到错码,因此在接收端进行汉明码纠错,以提高通信系统的抗干扰能力及可靠性。
监督位计算结果:
C6
C5
C4
C3
C2
C1
C0
U
X
00H
1
1AH
2EH
34H
46H
5CH
68H
72H
8CH
96H
A2H
B8H
CAH
D0H
E4H
FEH
表2(7,4)汉明码编码
四、代码及测试(25分)
4.1综合实验1的原理框图、代码及相关说明(8分)
原理框图:
图1发送数据
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYEX1IS
PORT(xyt_CLK:
INSTD_LOGIC;
xyt_IN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
xyt_LEDH:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
xyt_LEDL:
xyt_OUT:
OUTSTD_LOGIC);
ENDEX1;
ARCHITECTURExytOFEX1IS
TYPExyt_STATE_TYPEIS(xyt_STATE_IDLE,xyt_STATE_START,xyt_STATE_SEND,xyt_STATE_STOP);
SIGNALname_STATE:
name_STATE_TYPE:
=name_STATE_IDLE;
SIGNALname_EN:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALname_BAUD:
STD_LOGIC;
SIGNALname_BAUDCNT:
STD_LOGIC_VECTOR(8DOWNTO0);
SIGNALname_STOPCNT:
STD_LOGIC_VECTOR(15DOWNTO0);
BEGIN
U1:
PROCESS(name_CLK)
IFname_CLK'
EVENTANDname_CLK='
1'
THEN
IFname_BAUDCNT<
217THEN
name_BAUDCNT<
=name_BAUDCNT+1;
name_BAUD<
='
0'
;
ELSIFname_BAUDCNT<
434THEN
ELSE
name_BAUDCNT<
=(OTHERS=>
'
);
ENDIF;
ENDPROCESS;
U2:
name_EN(7DOWNTO4)<
=name_IN(3DOWNTO0);
name_EN(3)<
=name_IN(3)XORname_IN
(1)XORname_IN(0);
name_EN
(2)<
=name_IN(3)XORname_IN
(2)XORname_IN
(1);
name_EN
(1)<
=name_IN
(2)XORname_IN
(1)XORname_IN(0);
name_EN(0)<
U3:
PROCESS(name_BAUD)
IFname_BAUD'
EVENTANDname_BAUD='
THEN
CASEname_EN(3DOWNTO0)IS
WHEN"
0000"
=>
name_LEDL<
="
1000000"
0001"
1111001"
0010"
0100100"
0011"
0110000"
0100"
0011001"
0101"
0010010"
0110"
0000010"
0111"
1111000"
1000"
0000000"
1001"
0010000"
1010"
0001000"
1011"
0000011"
1100"
1000110"
1101"
0100001"
1110"
0000110"
WHENOTHERS=>
0001110"
ENDCASE;
CASEname_EN(7DOWNTO4)IS
name_LEDH<
ENDIF;
U4:
VARIABLEname_NUM:
INTEGERRANGE7DOWNTO0;
IFname_BAUD'
CASEname_STATEIS
WHENname_STATE_IDLE=>
name_OUT<
name_STATE<
=name_STATE_START;
WHENname_STATE_START=>
name_NUM:
=0;
=name_STATE_SEND;
WHENname_STATE_SEND=>
=name_EN(name_NUM);
IFname_NUM<
7THEN
name_NUM:
=name_NUM+1;
ELSE
name_STOPCNT<
=X"
name_STATE<
=name_STATE_STOP;
ENDIF;
WHENname_STATE_STOP=>
IFname_STOPCNT>
FFFF"
name_STOPCNT<
=name_STOPCNT+1;
WHENOTHERS=>
ENDCASE;
ENDname;
4.2综合实验2的原理框图、代码及相关说明(9分)
图2译码接收原理图
ENTITYEX2IS
PORT(name_CLK:
INSTD_LOGIC;
name_RXD:
name_RCVH:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
name_RCVL:
name_YM_R:
name_WR:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYEX2;
ARCHITECTUREnameOFEX2IS
TYPEname_RCV_TYPEIS(name_RCV_IDLE,name_RCV_STOP,name_RCV_DATA);
name_RCV_TYPE:
=name_RCV_IDLE;
STD_LOGIC_VECTOR(8DOWNTO0);
SIGNALname_BAUD8:
STD_LOGIC;
SIGNALname_BAUD8CNT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALname_FLAG:
STD_LOGIC:
SIGNALname_S:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALname_RCV:
SIGNALname_YM:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALname_DATA:
SIGNALname_RXD_NEXT:
SIGNALname_RIGHT:
IFname_BAUDCNT<
216THEN
name_BAUDCNT<
name_BAUD<
ELSIFname_BAUDCNT<
ELSE
U11:
IFname_CLK'
IFname_BAUD8CNT<
27THEN
name_BAUD8CNT<
=name_BAUD8CNT+1;
name_BAUD8<
ELSIFname_BAUD8CNT<
54THEN
name_BAUD8CNT<
PROCESS(name_BAUD8)
VARIABLEname_NUM,NUM:
INTEGER:
VARIABLEname_NUM0,name_NUM1:
VARIABLEname_RCV_TEMP:
VARIABLEname_FLAG:
IFname_BAUD8'
EVENTANDname_BAUD8='
name_RXD_NEXT<
=name_RXD;
IFname_FLAG='
THEN
IFname_RXD='
ANDname_RXD_NEXT='
name_FLAG:
ELSE
IFname_RXD='
name_NUM0:
=name_NUM0+1;
ELSEname_NUM1:
=name_NUM1+1;
name_NUM:
IFname_NUM=8THEN
IFname_NUM0>
name_NUM1THEN
name_RCV_TEMP(NUM):
ELSEname_RCV_TEMP(NUM):
NUM:
=NUM+1;
name_NUM:
name_NUM0:
name_NUM1:
ENDIF;
IFNUM=9THEN
IFname_RCV_TEMP(0)='
name_RCV<
=name_RCV_TEMP(8DOWNTO1);
ENDIF;
CASEname_RCV(7DOWNTO4)IS
WHEN"
name_RCVH<
="
1111"
WHENOTHERS=>
NULL;
ENDCASE;
CASEname_RCV(3DOWNTO0)IS
name_RCVL<