. .FPGA设计与应用综合实验报告班级::学号:日期:2016年11月3日实实验性质:验证性实验类型:必做开课单位:电信院学时:10学时一、实验目的1、了解分频器和计数器的基本实现原理;2、掌握七段数码管的使用方法;3、掌握锁相环的使用方法;4、掌握串口通信的基本原理和实现方法;5、了解线性分组码的基本原理及实现方法;6、掌握大型工程的模块设计方法。
二、实验要求该综合实验由两个独立的实验构成,分别是:综合实验1:(7,4)汉明编码、串口发送和数码管显示综合实验。
在该实验中,要求能够利用4个拨码开关产生4个信息比特送给FPGA;随后FPGA利用(7,4)汉明码对这4个信息比特进行编码;编码后的7位码字一方面通过串口送给计算机进行显示,另一方面通过七段数码管进行显示。
由于(7,4)汉明码的每个码字只有7个比特,而串口通信通常需要8个比特,所以采用低位插零的方式将7位汉明码字扩充为8个比特再进行串口传输和数码管显示。
要求使用2个七段数码管,其中一个显示扩充汉明码中的高4位(即信息位),而另一个数码管显示扩充汉明码中的低4位(即校验位)综合实验2:(7,4)汉明译码、串口接收和数码管显示综合实验。
在该实验中,要求能够利用计算机的串口发送汉明码字(可以是没有错误的汉明码字,也可以是有一个比特错误的汉明码字);然后利用FPGA进行串口数据接收;接收后进行(7,4)汉明译码,并将译码后的结果送给七段数码管进行显示。
要求使用4个七段数码管,其中2个数码管用于显示从串口接收到的数据,另一个数码管用于显示汉明译码后的正确信息比特,最后一个数码管用于指示出错比特的位置。
三、实验准备(10分)3.1 串口通信的基本原理(5分)串口通信指口按位发送和接收字节。
通信使用3根线完成,分别是地线、发送、接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通信的端口,这些参数必须匹配。
波特率表示每秒传输的位数,接受发送双方必须匹配。
不发送数据时,连线上为高电平。
发送数据时,要首先发送一个起始位,为低电平,然后按照协议发送需要的数据,八位或者九位(带有校验位),然后发送一个停止位,为高电平。
接收时,要首先确定起始位,然后按照协议接受八位或者九位数据。
接受完成后继续判断起始位,开始下一个接受周期。
3.2 (7, 4)汉明码的编译码基本原理(5分)一般来说,若汉明码长为n ,信息位数为k ,则监督位数r=n-k 。
若希望用r 个监督位构造出r 个监督关系式来指示一位错码的n 种可能位置,则要求n r ≥-12 或 112++≥-r k r (1) 下面以(7,4)汉明码为例说明原理:设汉明码(n,k )中k=4,为了纠正一位错码,由式(1)可知,要求监督位数r ≥3。
若取r=3,则n=k+r=7。
我们用0123456a a a a a a a 来表示这7个码元,用321S S S 的值表示3个监督关系式中的校正子,则321S S S 的值与错误码元位置的对应关系可以规定如表1所列。
表1 监督位与错码位置则由表1可得监督关系式:34501456123462a a a a S a a a a S a a a a S ⊕⊕⊕=⊕⊕⊕=⊕⊕⊕= (2)在发送端编码时,信息位3456a a a a 的值决定于输入信号,因此它们是随机的。
监督位2a 、1a 、0a 应根据信息位的取值按监督关系来确定,即监督位应使式(2)~式(4)中0S 、1S 、2S 的值为0(表示编成的码组中应无错码)345045613462a a a a a a a a a a a a ⊕⊕=⊕⊕=⊕⊕= (3)当数字信号编码成汉明码形式(本文中即A )后在信道中传输,由于信道中噪声的干扰,可能由于干扰引入差错,使得接收端收到错码,因此在接收端进行汉明码纠错,以提高通信系统的抗干扰能力及可靠性。
监督位计算结果:表2 (7,4)汉明码编码四、代码及测试(25分)4.1 综合实验1的原理框图、代码及相关说明(8分)原理框图:图1 发送数据LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY EX1 ISPORT ( xyt_CLK : IN STD_LOGIC;xyt_IN: IN STD_LOGIC_VECTOR( 3 DOWNTO 0 );xyt_LEDH: OUT STD_LOGIC_VECTOR( 6 DOWNTO 0 );xyt_LEDL : OUT STD_LOGIC_VECTOR( 6 DOWNTO 0 );xyt_OUT : OUT STD_LOGIC);END EX1;ARCHITECTURE xyt OF EX1 ISTYPE xyt_STATE_TYPE IS (xyt_STATE_IDLE,xyt_STATE_START,xyt_STATE_SEND,xyt_STATE_STOP);SIGNAL name_STATE:name_STATE_TYPE:=name_STATE_IDLE;SIGNAL name_EN:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL name_BAUD:STD_LOGIC;SIGNAL name_BAUDCNT: STD_LOGIC_VECTOR (8 DOWNTO 0);SIGNAL name_STOPCNT:STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINU1:PROCESS(name_CLK)BEGINIF name_CLK'EVENT AND name_CLK='1' THENIF name_BAUDCNT<217 THENname_BAUDCNT<=name_BAUDCNT+1;name_BAUD<='0';ELSIF name_BAUDCNT<434 THENname_BAUDCNT<=name_BAUDCNT+1;name_BAUD<='1';ELSEname_BAUDCNT<=(OTHERS=>'0');name_BAUD<='0';END IF;END IF;END PROCESS;U2:PROCESS(name_CLK)BEGINname_EN(7 DOWNTO 4)<=name_IN(3 DOWNTO 0);name_EN(3)<=name_IN(3) XOR name_IN(1) XOR name_IN(0);name_EN(2)<=name_IN(3) XOR name_IN(2) XOR name_IN(1);name_EN(1)<=name_IN(2) XOR name_IN(1) XOR name_IN(0);name_EN(0)<='0';END PROCESS;U3:PROCESS(name_BAUD)BEGINIF name_BAUD'EVENT AND name_BAUD='1' THEN CASE name_EN(3 DOWNTO 0) ISWHEN "0000" => name_LEDL <="1000000";WHEN "0001" => name_LEDL <="1111001";WHEN "0010" => name_LEDL <="0100100";WHEN "0011" => name_LEDL <="0110000";WHEN "0100" => name_LEDL <="0011001";WHEN "0101" => name_LEDL <="0010010";WHEN "0110" => name_LEDL <="0000010";WHEN "0111" => name_LEDL <="1111000";WHEN "1000" => name_LEDL <="0000000";WHEN "1001" => name_LEDL <="0010000";WHEN "1010" => name_LEDL <="0001000";WHEN "1011" => name_LEDL <="0000011";WHEN "1100" => name_LEDL <="1000110";WHEN "1101" => name_LEDL <="0100001";WHEN "1110" => name_LEDL <="0000110";WHEN OTHERS => name_LEDL <="0001110";END CASE;CASE name_EN(7 DOWNTO 4) ISWHEN "0000" => name_LEDH <="1000000";WHEN "0001" => name_LEDH <="1111001";WHEN "0010" => name_LEDH <="0100100";WHEN "0011" => name_LEDH <="0110000";WHEN "0100" => name_LEDH <="0011001";WHEN "0101" => name_LEDH <="0010010";WHEN "0110" => name_LEDH <="0000010";WHEN "0111" => name_LEDH <="1111000";WHEN "1000" => name_LEDH <="0000000";WHEN "1001" => name_LEDH <="0010000";WHEN "1010" => name_LEDH <="0001000";WHEN "1011" => name_LEDH <="0000011";WHEN "1100" => name_LEDH <="1000110";WHEN "1101" => name_LEDH <="0100001";WHEN "1110" => name_LEDH <="0000110";WHEN OTHERS => name_LEDH <="0001110"; END CASE;END IF;END PROCESS;U4:PROCESS(name_BAUD)VARIABLE name_NUM:INTEGER RANGE 7 DOWNTO 0;BEGINIF name_BAUD'EVENT AND name_BAUD='1' THEN CASE name_STATE ISWHEN name_STATE_IDLE=>name_OUT<='1';name_STATE<=name_STATE_START;WHEN name_STATE_START=>name_OUT<='0';name_NUM:=0;name_STATE<=name_STATE_SEND;WHEN name_STATE_SEND=>name_OUT<=name_EN(name_NUM);IF name_NUM<7 THENname_NUM:=name_NUM+1;name_STATE<=name_STATE_SEND;ELSEname_STOPCNT<=X"0000";name_STATE<=name_STATE_STOP;END IF;WHEN name_STATE_STOP=>name_OUT<='1';IF name_STOPCNT>=X"FFFF" THENname_STOPCNT<=X"0000";name_STATE<=name_STATE_IDLE;ELSEname_STOPCNT<=name_STOPCNT+1;name_STATE<=name_STATE_STOP;END IF;WHEN OTHERS=>name_STATE<=name_STATE_IDLE;END CASE;END IF;END PROCESS;END name;4.2 综合实验2的原理框图、代码及相关说明(9分)原理框图:图2 译码接收原理图ENTITY EX2 ISPORT(name_CLK:IN STD_LOGIC;name_RXD:IN STD_LOGIC;name_RCVH:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);name_RCVL:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);name_YM_R:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);name_WR:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END ENTITY EX2;ARCHITECTURE name OF EX2 ISTYPE name_RCV_TYPE IS(name_RCV_IDLE,name_RCV_STOP,name_RCV_DATA);SIGNAL name_STATE:name_RCV_TYPE:=name_RCV_IDLE;SIGNAL name_BAUD:STD_LOGIC;SIGNAL name_BAUDCNT:STD_LOGIC_VECTOR(8 DOWNTO 0);SIGNAL name_BAUD8 : STD_LOGIC;SIGNAL name_BAUD8CNT: STD_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL name_FLAG:STD_LOGIC:='0';SIGNAL name_S:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL name_RCV:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL name_YM:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL name_DATA:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL name_RXD_NEXT :STD_LOGIC;SIGNAL name_RIGHT:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINU1:PROCESS(name_CLK)BEGINIF name_CLK'EVENT AND name_CLK='1' THEN IF name_BAUDCNT<216 THENname_BAUDCNT<=name_BAUDCNT+1;name_BAUD<='0';ELSIF name_BAUDCNT<434 THENname_BAUDCNT<=name_BAUDCNT+1;name_BAUD<='1';ELSEname_BAUDCNT<=(OTHERS=>'0');name_BAUD<='0';END IF;END IF;END PROCESS;U11:PROCESS(name_CLK)BEGINIF name_CLK'EVENT AND name_CLK='1' THEN IF name_BAUD8CNT<27 THENname_BAUD8CNT<=name_BAUD8CNT+1;name_BAUD8<='0';ELSIF name_BAUD8CNT<54 THENname_BAUD8CNT<=name_BAUD8CNT+1;name_BAUD8<='1';ELSEname_BAUD8CNT<=(OTHERS=>'0');name_BAUD8<='0';END IF;END IF;END PROCESS;U2:PROCESS(name_BAUD8)VARIABLE name_NUM,NUM:INTEGER:=0;VARIABLE name_NUM0,name_NUM1:INTEGER:=0;VARIABLE name_RCV_TEMP:STD_LOGIC_VECTOR(8 DOWNTO 0); VARIABLE name_FLAG:STD_LOGIC:='0';BEGINIF name_BAUD8'EVENT AND name_BAUD8='1' THEN name_RXD_NEXT<=name_RXD;IF name_FLAG='0'THENIF name_RXD='0' AND name_RXD_NEXT='1' THENEND IF;ELSEIF name_RXD='0' THENname_NUM0:=name_NUM0+1;ELSE name_NUM1:=name_NUM1+1;END IF;name_NUM:=name_NUM+1;IF name_NUM=8 THENIF name_NUM0>name_NUM1 THENname_RCV_TEMP(NUM):='0';ELSE name_RCV_TEMP(NUM):='1';END IF;NUM:=NUM+1;name_NUM:=0;name_NUM0:=0;name_NUM1:=0;END IF;IF NUM=9 THENIF name_RCV_TEMP(0)='0' THENname_RCV<=name_RCV_TEMP(8 DOWNTO 1);END IF;NUM:=0;END IF;END IF;END IF;END PROCESS;U3:PROCESS(name_BAUD)BEGINIF name_BAUD'EVENT AND name_BAUD='1' THENCASE name_RCV(7 DOWNTO 4) ISWHEN "0000" => name_RCVH <= "1000000";WHEN "0001" => name_RCVH <= "1111001";WHEN "0010" => name_RCVH <= "0100100";WHEN "0011" => name_RCVH <= "0110000";WHEN "0100" => name_RCVH <= "0011001";WHEN "0101" => name_RCVH <= "0010010";WHEN "0110" => name_RCVH <= "0000010";WHEN "0111" => name_RCVH <= "1111000";WHEN "1000" => name_RCVH <= "0000000";WHEN "1001" => name_RCVH <= "0010000";WHEN "1010" => name_RCVH <= "0001000";WHEN "1100" => name_RCVH <= "1000110";WHEN "1101" => name_RCVH <= "0100001";WHEN "1110" => name_RCVH <= "0000110";WHEN "1111" => name_RCVH <= "0001110";WHEN OTHERS => NULL;END CASE;CASE name_RCV(3 DOWNTO 0) ISWHEN "0000" => name_RCVL <= "1000000";WHEN "0001" => name_RCVL <= "1111001";WHEN "0010" => name_RCVL <= "0100100";WHEN "0011" => name_RCVL <= "0110000";WHEN "0100" => name_RCVL <= "0011001";WHEN "0101" => name_RCVL <= "0010010";WHEN "0110" => name_RCVL <= "0000010";WHEN "0111" => name_RCVL <= "1111000";WHEN "1000" => name_RCVL <= "0000000";WHEN "1001" => name_RCVL <= "0010000";WHEN "1010" => name_RCVL <= "0001000";WHEN "1011" => name_RCVL <= "0000011";WHEN "1100" => name_RCVL <= "1000110";WHEN "1101" => name_RCVL <= "0100001";WHEN "1111" => name_RCVL <= "0001110";WHEN OTHERS => NULL;END CASE;CASE name_YM ISWHEN "0000" => name_YM_R <= "1000000";WHEN "0001" => name_YM_R <= "1111001";WHEN "0010" => name_YM_R <= "0100100";WHEN "0011" => name_YM_R <= "0110000";WHEN "0100" => name_YM_R <= "0011001";WHEN "0101" => name_YM_R <= "0010010";WHEN "0110" => name_YM_R <= "0000010";WHEN "0111" => name_YM_R <= "1111000";WHEN "1000" => name_YM_R <= "0000000";WHEN "1001" => name_YM_R <= "0010000";WHEN "1010" => name_YM_R <= "0001000";WHEN "1011" => name_YM_R <= "0000011";WHEN "1100" => name_YM_R <= "1000110";WHEN "1101" => name_YM_R <= "0100001";WHEN "1110" => name_YM_R <= "0000110";WHEN "1111" => name_YM_R <= "0001110";WHEN OTHERS => name_YM_R <= "0001110";END CASE;CASE name_S ISWHEN "000" => name_WR <= "1000110";WHEN "001" => name_WR <= "1111001";WHEN "010" => name_WR <= "0100100"; --2WHEN "011" => name_WR <= "0000010"; --6WHEN "100" => name_WR <= "0110000"; --3WHEN "101" => name_WR <= "0011001"; --4WHEN "110" => name_WR <= "1111000"; --7WHEN "111" => name_WR <= "0010010"; --5WHEN OTHERS => NULL;END CASE;END IF;END PROCESS;U4:PROCESS(name_CLK)BEGINIF name_CLK'EVENT AND name_CLK='1' THENname_DATA<=name_RCV(7 DOWNTO 0);name_S(2)<=name_RCV(7) XOR name_RCV(5) XOR name_RCV(4) XOR name_RCV(3);name_S(1)<=name_RCV(7) XOR name_RCV(6) XOR name_RCV(5) XORname_RCV(2);name_S(0)<=name_RCV(6) XOR name_RCV(5) XOR name_RCV(4) XOR name_RCV(1);CASE name_S ISWHEN "110"=>name_DATA(7)<=NOT name_DATA(7);WHEN "011"=>name_DATA(6)<=NOT name_DATA(6);WHEN "111"=>name_DATA(5)<=NOT name_DATA(5);WHEN "101"=>name_DATA(4)<=NOT name_DATA(4);WHEN "100"=>name_DATA(3)<=NOT name_DATA(3);WHEN "010"=>name_DATA(2)<=NOT name_DATA(2);WHEN "001"=>name_DATA(1)<=NOT name_DATA(1);WHEN OTHERS=>name_RIGHT <= name_DATA(7 DOWNTO 4);END CASE;name_YM<=name_RIGHT;END IF;END PROCESS;END ARCHITECTURE name;4.3 两个综合实验的SignalTap II测试结果(8分)(要求:测试数据必须和自己学号有关。