FPGA设计与应用串口通信实验报告班级:1105103姓名:苏林效学号:1110510321日期:2014年10月29日实验性质:验证性实验类型:必做开课单位:电信院学时:2学时一、实验目的1、了解串口通信的基本原理;2、掌握锁相环的基本原理和使用方法;3、掌握起始位和停止位的含义及实现方法;4、掌握VHDL状态机的基本使用方法;5、掌握基本的接口设计和调试技巧;二、实验准备2.1 串口通信原理(1分)串口通信是以字节为单位,按位传输数据和接收数据的。
先看一下发送数据:串行线缆的两端事先约定好串行传输的参数(传输速度、传输格式等),之后进行传输,①当没有数据传输的时候,发送端向数据线上发送“1”;②当要传输数据时,发送端先发送一个“0”来表示要传输数据了,这样当接收端检测到“0”便可以知道有数据到来了;③开始传输后,数据以约定的速度和格式传输;④每次传输完成一个字节之后,都在其后发送一个停止位“1”。
这样,发送数据就结束了。
再来看接收数据,初始状态是等待状态,接收的一直是“1”,当检测到0时进入检验状态,在检验状态下如果再检测到0(一般采用过采样)则进入接收数据状态,当接收完8位比特数后判断是否有停止位,如果有则此字节接收结束,重新进入等待状态准备接受下一字节。
2.2 锁相环的基本原理(1分)锁相环是以锁定输入载波信号的相位为目标的一种载波环实现形式。
它由三部分组成:鉴相器(PD)、环路滤波器(LPF)和压控振荡器(VCO)。
如上图。
锁相环的工作原理:压控振荡器的输出经过采集并分频,后与基准信号同时输入鉴相器。
鉴相器通过比较上述两个信号的相位差,输出结果通过环路滤波器,滤除噪声和高频分量,然后输出一个直流脉冲电压,用它来控制VCO ,使它的频率改变,使()lim 0c p t θ=。
经过较短时间后,VCO 的输出稳定于某一值。
环路一旦进入锁定状态后,压控振荡器的输出信号与环路的输入信号(参考信号)相位时刻保持一致。
三、代码及测试3.1程序及分析(2分)顶层原理图如上所示,主要包括三个模块,锁相环(输出57.69MHz )、分频(输出接受时的10倍采样速率和数码管显示速率)、接受(按57.6kbps 接受从串口发来的数据)。
分频模块代码: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DIV ISPORT(CLK : IN STD_LOGIC; --锁相环输出时钟57.69MCOUT1 : OUT STD_LOGIC;--分频器输出采样时钟576kCOUT2 : OUT STD_LOGIC);--分频器产产生扫描时钟100hzEND DIV;ARCHITECTURE BEHAV OF DIV ISBEGINPROCESS(CLK)V ARIABLE COUT1_NUM : STD_LOGIC_VECTOR(5 DOWNTO 0):=(OTHERS => '0'); --输出时钟1 计数器V ARIABLE COUT2_NUM : STD_LOGIC_VECTOR(18 DOWNTO 0):=(OTHERS => '0'); --输出时钟2 计数?V ARIABLE COUT1_1 : STD_LOGIC;V ARIABLE COUT2_2 : STD_LOGIC;BEGINIF RISING_EDGE(CLK) THENIF COUT1_NUM >= 49 THENCOUT1_1 := NOT COUT1_1;COUT1_NUM := (OTHERS => '0');ELSECOUT1_NUM := COUT1_NUM + 1;END IF;IF COUT2_NUM >= 288450 THENCOUT2_2 := NOT COUT2_2;COUT2_NUM := (OTHERS => '0');ELSECOUT2_NUM := COUT2_NUM + 1;END IF;COUT1 <= COUT1_1;COUT2 <= COUT2_2;END IF;END PROCESS;END BEHAV;接受模块代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COM_REC ISPORT(CLK_10 : IN STD_LOGIC;--输入时钟,按10倍采样,是rs232串口速率的10倍CLK_DIS : IN STD_LOGIC;-- DISPLAY CLKINNUM : IN STD_LOGIC;--输入的值LED_EN : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);LED : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END;ARCHITECTURE BEHAV OF COM_REC ISTYPE STATE IS (SPARE, READY, REC, STOP);--定义接受4状态SIGNAL TR_INNUM : STD_LOGIC_VECTOR(7 DOWNTO 0); --接收到8位数SIGNAL LED_L : STD_LOGIC_VECTOR(6 DOWNTO 0);--控制两位数码管显示SIGNAL LED_H : STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINPROCESS(CLK_10)V ARIABLE TR_INNUM_NUM : INTEGER RANGE 0 TO 15 := 0; --对接受到得每一位数计数V ARIABLE TRUE : STD_LOGIC := '0';V ARIABLE CURRENT_STATE : STATE := SPARE;--当前状态V ARIABLE SAM_NUM_0 : INTEGER RANGE 0 TO 15 := 0;--对采样次数计数V ARIABLE SAM_NUM_1 : INTEGER RANGE 0 TO 15 := 0;BEGINIF CLK_10'EVENT AND CLK_10 = '1' THENIF CURRENT_STATE = SPARE THENIF INNUM = '0' THENSAM_NUM_0 := SAM_NUM_0 + 1;--第一次采样到零点,即改变状态CURRENT_STATE := READY;ELSECURRENT_STATE := SPARE;END IF;ELSIF CURRENT_STA TE = READY THENIF INNUM = '0' THENSAM_NUM_0 := SAM_NUM_0 + 1;ELSESAM_NUM_1 := SAM_NUM_1 + 1;END IF;IF (SAM_NUM_0 + SAM_NUM_1) >= 10 THEN--判断是否真开端IF SAM_NUM_0 >= 6 THENCURRENT_STATE := REC;SAM_NUM_0 := 0;SAM_NUM_1 := 0;ELSECURRENT_STATE := SPARE;END IF;ELSECURRENT_STATE := READY;END IF;ELSIF CURRENT_STA TE = REC THENIF INNUM = '0' THENSAM_NUM_0 := SAM_NUM_0 + 1;ELSESAM_NUM_1 := SAM_NUM_1 + 1;END IF;IF (SAM_NUM_0 + SAM_NUM_1) >= 10 THEN --接受数据判断IF SAM_NUM_0 >= 6 THENTR_INNUM(TR_INNUM_NUM) <= '0';ELSETR_INNUM(TR_INNUM_NUM) <= '1';END IF;SAM_NUM_0 := 0;SAM_NUM_1 := 0;TR_INNUM_NUM := TR_INNUM_NUM + 1;IF TR_INNUM_NUM >= 8 THENCURRENT_STATE := STOP;TR_INNUM_NUM := 0;ELSECURRENT_STATE := REC;END IF;ELSECURRENT_STATE := REC;END IF;ELSIF CURRENT_STA TE = STOP THENIF INNUM = '1' THENSAM_NUM_1 := SAM_NUM_1 + 1;ELSESAM_NUM_0 := SAM_NUM_0 + 1;END IF;IF (SAM_NUM_0 + SAM_NUM_1) >= 10 THEN IF SAM_NUM_1 >= 6 THENTRUE := '1';CURRENT_STATE := SPARE;END IF;SAM_NUM_0 := 0;SAM_NUM_1 := 0;ELSECURRENT_STATE := STOP;END IF;ELSECURRENT_STATE := SPARE;END IF;END PROCESS;LED_H <="0111111" when TR_INNUM(7 downto 4) = 0 else "0000110" when TR_INNUM(7 downto 4) = 1 else"1011011" when TR_INNUM(7 downto 4) = 2 else"1001111" when TR_INNUM(7 downto 4) = 3 else"1100110" when TR_INNUM(7 downto 4) = 4 else"1101101" when TR_INNUM(7 downto 4) = 5 else"1111101" when TR_INNUM(7 downto 4) = 6 else"0000111" when TR_INNUM(7 downto 4) = 7 else"1111111" when TR_INNUM(7 downto 4) = 8 else"1101111" when TR_INNUM(7 downto 4) = 9 else"1110111" when TR_INNUM(7 downto 4) = 10 else"1111100" when TR_INNUM(7 downto 4) = 11 else"0111001" when TR_INNUM(7 downto 4) = 12 else"1011110" when TR_INNUM(7 downto 4) = 13 else"1111001" when TR_INNUM(7 downto 4) = 14 else"1110001";LED_L <="0111111" when TR_INNUM(3 downto 0) = 0 else "0000110" when TR_INNUM(3 downto 0) = 1 else"1011011" when TR_INNUM(3 downto 0) = 2 else"1001111" when TR_INNUM(3 downto 0) = 3 else"1100110" when TR_INNUM(3 downto 0) = 4 else"1101101" when TR_INNUM(3 downto 0) = 5 else"1111101" when TR_INNUM(3 downto 0) = 6 else"0000111" when TR_INNUM(3 downto 0) = 7 else"1111111" when TR_INNUM(3 downto 0) = 8 else"1101111" when TR_INNUM(3 downto 0) = 9 else"1110111" when TR_INNUM(3 downto 0) = 10 else"1111100" when TR_INNUM(3 downto 0) = 11 else"0111001" when TR_INNUM(3 downto 0) = 12 else"1011110" when TR_INNUM(3 downto 0) = 13 else"1111001" when TR_INNUM(3 downto 0) = 14 else"1110001";PROCESS(CLK_DIS)V ARIABLE A : STD_LOGIC;BEGINIF RISING_EDGE(CLK_DIS) THENIF A = '0' THENLED <= LED_L;LED_EN <= "0001";A := '1';ELSELED <= LED_H;LED_EN <= "0010";A := '0';END IF;END IF;END PROCESS;END BEHAV;3.2 SignalTap II波形测试结果(1分)此实验要求发送16进制的21H,实际发送的是十进制的33,而数码管却显示21,高四位(0010)、低四位(0001)。