当前位置:文档之家› UART串口通信实验报告

UART串口通信实验报告

实验四 UART 串口通信学院:研究生院学号:1400030034 姓名:张秋明一、 实验目的及要求设计一个UART 串口通信协议,实现“串 <-->并”转换功能的电路,也就是 “通用异步收发器”。

二、 实验原理UART 是一种通用串行数据总线,用于异步通信。

该总线双向通信,可以实 现全双工传输和接收。

在嵌入式设计中,UART 用来主机与辅助设备通信,如汽 车音响与外接AP 之间的通信,与PC 机通信包括与监控调试器和其它器件,如 EEPROM 通信。

UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一 位接一位地传输。

其中各位的意义如下:起始位:先发出一个逻辑” 0的信号,表示传输字符的开始。

资料位:紧接着起始位之后。

资料位的个数可以是 4、5、6、7、8等,构成 一个字符。

通常采用ASCII 码。

从最低位开始传送,靠时钟定位。

奇偶校验位:资料位加上这一位后,使得“ 1的位数应为偶数(偶校验)或奇数 (奇校验),以此来校验资料传送的正确性。

停止位:它是一个字符数据的结束标志。

可以是 1位、1.5位、2位的高电 平。

由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能 在通信中两台设备间出现了小小的不同步。

因此停止位不仅仅是表示传输的结束, 并且提供计算机校正时钟同步的机会。

适用于停止位的位数越多,不同时钟同步 的容忍程度越大,但是数据传输率同时也越慢。

空闲位:处于逻辑“ 1状态,表示当前线路上没有资料传送。

波特率:是衡量资料传送速率的指标。

表示每秒钟传送的符号数(symbol )。

一个符号代表的信息量(比特数)与符号的阶数有关。

例如资料传送速率为 120 字符/秒,传输使用256阶符号,每个符号代表8bit ,则波特率就是120baud,比 特率是120*8=960bit/s 。

这两者的概念很容易搞错。

三、 实现程序library ieee;use ieee.std 」o gic_1164.all;end uart; architecture behav of uart isen tity uart isport(clk : in std_logic; rst_n: in std 」o gic--系统时钟 --复位信号rs232_rx: in std 」o gic rs232_tx: out std 」o gic--RS232接收数据信号; --RS232发送数据信号;);use ieee.std_logic_ un sig ned.all;comp onent uart_rx port(clk : in std_logic; rst_n: instd_logic; rs232_rx: in std_logic; clk_bps: in std_logic;高电平为接收数据的采样点bps_start:out std 」o gic; 波特率时钟启动置位rx_data: out std 」ogic_vector(7 downto 0);--接收数据寄存器,保存直至下一个数据来到bps_start:out std 」o gic; 据后,波特率时钟启动置位 一 一rx_data: in std 」o gic_vector(7 dow nto 0); --接收数据寄存器,保存直至下一个数据来到rx_in t: in std 」ogic --接收数据中断信号,接收数据期间时钟为高电平,一传送给串口发送模块,使得串口正在进 行接收数据的时候,发送模块不工作,避免了一个完整的数据( 1位起始位、8 位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传 输出去);end comp onent;sig nal bps_start_1:std_logic; sig nal bps_start_2:std_logic; sig nal clk_bps_1:std_logic; sig nal clk_bps_2:std_logic;sig nal rx_data:std 」o gic_vector(7 dow nto 0); sig nal rx_in t:std_logic; begi nRX_TOP: uart_rx port map (clk=>clk,rst_n=>rst_ n, rs232_rx=>rs232_rx,clk_bps=>clk_bps_1, bps_start=>bps_start_1,--系统时钟 --复位信号--RS232接收数据信号--此时clk_bps 的--接收到数据后, rx_int: out std 」ogic 中断信号,接收数据期间时钟为高电平,传送给串口发送 end comp onent;comp onent speed_select port(clk : in std_logic; rst_n: in std_logic; clk_bps: out std_logic; 的高电平为接收或者发送数据位的中间采样点 一 bps_start:in std_logic后,波特率时钟启动信号置位);end comp onent;comp onent uart_tx port(clk : in std_logic;rst_n: in std_logic; rs232_tx: out std_logic; clk_bps: in std_logic;的高电平为接收数据的采样点一 一 --接收数据);--系统时钟--复位信号 --此时 clk_bps --接收数据--系统时钟 --复位信号--RS232接收数据信号--此时 clk_bps--接收到数rx_data=>rx_data, rx_in t=>rx_i nt厂一SPEED_TOP_RX: speed_select port map (clk=>clk, rst_ n=>rst_ n,clk_bps=>clk_bps_1,bps_start=>bps_start_1 );TX_TOP:uart_tx port map (clk=>clk, --系统时钟rst_n=>rst_n, --复位信号rs232_tx=>rs232_tx, --RS232 发送数据信号clk_bps=>clk_bps_2, --此时clk_bps 的高电平为发送数据的采样点一一一一bps_start=>bps_start_2, --接收到数据后,波特率时钟启动置位一一—rx_data=>rx_data, --接收数据寄存器,保存直至下一个数据来到rx_in t=>rx_i nt --接收数据中断信号,接收数据期间时钟为高电平,:专送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);SPEED_TOP_TX: speed_select port map(clk=>clk,rst_n=>rst_ n,clk_bps=>clk_bps_2,bps_start=>bps_start_2);end behav;3个子模块--------------------- 异步接收模块------------------------------ library ieee;use ieee.std」o gic_1164.all; use ieee.std_logic_ un sig ned.all; en tity uart_rx is port(clk : in std_logic; rst_n: in std_logic; rs232_rx: instd_logic; clk_bps: in std_logic;为接收数据的采样点一bps_start:out std」o gic; 时钟启动置位rx_data: out std_logic_vector(7 downto 0);--接收数据寄存器,保存直至下一个数据来到rx_int: out std_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1 位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);end uart_rx;architecture behav of uart_rx issig nalsig nalsig nalsig nalsig nalsig nalsig nalsig nal 存器,保存直至下rs232_rx0: std_logic;rs232_rx1: std_logic;rs232_rx2: std」o gic;rs232_rx3: std_logic;n eg_rs232_rx:std」o gic;bps_start_r:std_logic;nu m:i nteger;rx_data_r:std」ogic_vector(7 downto 0);--串口接收数据奇」个数据到来beg inprocess(clk,rst_ n)beg inif (rst_n='0')the nrs232_rx0<='0';rs232_rx1<='0';rs232_rx2<='0';rs232_rx3<='0';elseif (ris in g_edge(clk)) the nrs232_rx0<=rs232_rx;--系统时钟--复位信号--RS232接收数据信号--此时clk_bps的高电平--接收到数据后,波特率rs232_rx1<=rs232_rx0; rs232_rx2<=rs232_rx1; rs232_rx3<=rs232_rx2; end if; end if;neg_rs232_rx <=rs232_rx3 and rs232_rx2 and not(rs232_rx1)andnot(rs232_rx0);end process;process(clk,rst_ n) beg inif (rst_n='0')the nbps_start_r<='0'; rx_in t<='0'; elseif (ris in g_edge(clk)) the n if(n eg_rs232_rx='1') the n --接收到串口数据线 rs232_rx的下降沿标志信号一—一bps_start_r<='1'; --启动串口准备数据接收 rx 」n t<='1';--接收数据中断信号使能else if((num= 15) and (clk_bps='1')) then --接收完有用数据信 bps_start_r<='0';--数据接收完毕,释放波特率启动rx 」n t<='0'; --接收数据中断信号关闭end if;end if; end if; end if;bps_start<=bps_start_r; end process;process(clk,rst_ n) beg inif (rst_n='0')the n rx_data_r<="00000000"; rx_data<="00000000"; num<=0; elseif (ris in g_edge(clk)) the n if(clk_bps='1')the n num<=nu m+1; case num is丿 111、when 1=>rx_data_r(0)v=rs232_rx;--锁存第 Obit when 2=>rx_data_r(1)<=rs232_rx;--锁存第 Obit when 3=>rx_data_r(2)v=rs232_rx;--锁存第 Obit when 4=>rx_data_r(3)v=rs232_rx;--锁存第 Obit when 5=>rx_data_r ⑷v=rs232_rx;--锁存第 Obit when 6=>rx_data_r(5)v=rs232_rx;--锁存第 Obit when 7=>rx_data_r(6)v=rs232_rx;--锁存第 Obit when 8=>rx_data_r(7)v=rs232_rx;--锁存第 Obit whe n 1O=>rx_data<=rx_data_r;whe n 11= >num <=15; when others=>null; end case; if(num=15) the n num<=0; end if; end if; end if;end if;end process; end behav;--------------------- 波特率控制模块 ----------------------------- library ieee;use ieee.std_logic_1164.all; use ieee.std 」o gic_arith.all;use ieee.std_logic_ un sig ned.all; en tity speed_select isport(clk : in std_logic; rst_n: in std_logic; clk_bps: outstd_logic; 接收或者发送数据位的中间采样点钟启动信号置位或者开始发送数据时,波特率时钟启动信号置位 ); end speed_select;architecture behav of speed_select issignal cnt:std 」ogic_vector(12 downto 0); sig nal clk_bps_r:std_logic; con sta nt BPS_PARA:i nteger:=5207; con sta nt BPS_PARA_2:i nteger:=2603; beg inprocess(clk,rst_ n) beg inif (rst_n='O')the n--系统时钟--复位信号 --此时clk_bps 的高电平为 bps_start:in std_logic --接收数据后,波特率时cnt<="0000000000000";elseif (ris in g_edge(clk)) the nif((cnt=BPS_PARA)or(bps_start='0')) thencn t<="0000000000000";--波特率计数器清零elsecnt<=c nt+'1'; --波特率时钟计数启动end if;end if;end if;end process;process(clk,rst_ n)beg inif (rst_n='0')the nclk_bps_r<='0';elseif (ris in g_edge(clk)) the nif(cnt=BPS_PARA_2) the n clk_bps_r<='1'; --clk_bps_r高电平为接收数据位的中间采样点,同时也作为发送数据的数据改变点一一elseclk_bps_r<='0';--波特率计数器清零end if;end if;end if;clk_bps<=clk_bps_r;end process;end behav;--------------------- 异步发送模块-------------------------------library ieee;use ieee.std」o gic_1164.all;use ieee.std_logic_ un sig ned.all;rx_int: in std 」o gic 收数据期间时钟为高电平,传送给串口发送模块, 时候,发送模块不工作,避免了一个完整的数据(位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去 );end uart_tx;architecture behav of uart_tx issig nal rx 」n t0: std 」o gic;sig nal rx_in t1: std 」o gic; sig nalrx 」n t2: std 」o gic;sig nal n eg_rx_i nt:std_logic; sig nal bps_start_r:std_logic; sig nal nu m:i nteger;sig nal tx_data:std_logic_vector(7 dow nto 0);--串口接收数据寄存器,保存直至下一个数据到来 beg inprocess(clk,rst_ n) beg inif (rst_n='O')the nrx_in t0<='0'; rx_in t1<='0';rx_in t2<='0'; elseif (ris in g_edge(clk)) the n rx_in t0<=rx_i nt; rx_in t1<=rx_i nt0; rx_int2<=rx_i nt1; end if; end if;n eg_rx_i nt <=no t(rx_i nt1)a nd (rx_i nt2); end process;process(clk,rst_n)en tity uart_tx isport(clk : in std_logic; rst_n: in std_logic; rs232_tx: outstd_logic; clk_bps: instd_logic; 为接收数据的采样点 一bps_start:out std_logic;时钟启动置位rx_data: in std 」o gic_vector(7 dow nto0); 直至下一个数据来到--系统时钟 --复位信号--RS232接收数据信号 --此时clk_bps 的高电平 --接收到数据后,波特率--接收数据寄存器,保存--接收数据中断信号,接使得串口正在进行接收数据的1位起始位、8位数据位、1beg inif (rst_n='O')thenbps_start_r<='O'; tx_data<="00000000"; elseif (ris in g_edge(clk)) the n if(n eg_rx_i nt='1') the n--接收到串口数据线rs232_rx的下降沿标志信号bps_start_r<='1'; --启动串口准备数据接收tx_data<=rx_data; --接收数据中断信号使能else if((num= 15) and (clk_bps='1')) then --接收完有用数据信bps_start_r<='0';--数据接收完毕,释放波特率启动信号end if;end if;end if;end if;bps_start<=bps_start_r;end process;process(clk,rst_ n)beg inif (rst_n='0')the nrs232_tx<='1';num<=0;elseif (ris in g_edge(clk)) the nif(clk_bps='1')the nnum<=nu m+1;case num iswhe n 1=>rs232_tx<='0';when 2=>rs232_tx<=tx_data(0);--发送第1bitwhen 3=>rs232_tx<=tx_data(1);--发送第2bitwhen 4=>rs232_tx<=tx_data(2);--发送第3bitwhen 5=>rs232_tx<=tx_data(3);--发送第4bitwhen 6=>rs232_tx<=tx_data⑷;--发送第5bitwhen 7=>rs232_tx<=tx_data(5);--发送第6bitwhen 8=>rs232_tx<=tx_data(6);--发送第7bitwhen 9=>rs232_tx<=tx_data(7);--发送第8bitwhe n 10=>rs232_tx<='1';whe n 11= >num <=15;when others=>null;end case; if(num=15) the n num<=0;end if;end if;end if;end if;end process;end behav;四、实验步骤1、建立新工程UART,选择芯片,型号为cyclone ii EP2C35F484C&2、建立源文件,输入程序代码。

相关主题