您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 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。这两者的概念很容易搞错。三、实现程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityuartisport(clk:instd_logic;--系统时钟rst_n:instd_logic;--复位信号rs232_rx:instd_logic;--RS232接收数据信号;rs232_tx:outstd_logic--RS232发送数据信号;);enduart;architecturebehavofuartis现代电路与系统实验报告componentuart_rxport(clk:instd_logic;--系统时钟rst_n:instd_logic;--复位信号rs232_rx:instd_logic;--RS232接收数据信号clk_bps:instd_logic;--此时clk_bps的高电平为接收数据的采样点bps_start:outstd_logic;--接收到数据后,波特率时钟启动置位rx_data:outstd_logic_vector(7downto0);--接收数据寄存器,保存直至下一个数据来到rx_int:outstd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送);endcomponent;componentspeed_selectport(clk:instd_logic;--系统时钟rst_n:instd_logic;--复位信号clk_bps:outstd_logic;--此时clk_bps的高电平为接收或者发送数据位的中间采样点bps_start:instd_logic--接收数据后,波特率时钟启动信号置位);endcomponent;componentuart_txport(clk:instd_logic;--系统时钟rst_n:instd_logic;--复位信号rs232_tx:outstd_logic;--RS232接收数据信号clk_bps:instd_logic;--此时clk_bps的高电平为接收数据的采样点bps_start:outstd_logic;--接收到数据后,波特率时钟启动置位rx_data:instd_logic_vector(7downto0);--接收数据寄存器,保存直至下一个数据来到rx_int:instd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);endcomponent;signalbps_start_1:std_logic;signalbps_start_2:std_logic;signalclk_bps_1:std_logic;signalclk_bps_2:std_logic;signalrx_data:std_logic_vector(7downto0);signalrx_int:std_logic;beginRX_TOP:uart_rxportmap(clk=clk,现代电路与系统实验报告rst_n=rst_n,rs232_rx=rs232_rx,clk_bps=clk_bps_1,bps_start=bps_start_1,rx_data=rx_data,rx_int=rx_int);SPEED_TOP_RX:speed_selectportmap(clk=clk,rst_n=rst_n,clk_bps=clk_bps_1,bps_start=bps_start_1);TX_TOP:uart_txportmap(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_int=rx_int--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);SPEED_TOP_TX:speed_selectportmap(clk=clk,rst_n=rst_n,clk_bps=clk_bps_2,bps_start=bps_start_2);endbehav;-----------------------------------------------------------------------------------------------------------------------3个子模块---------------------------------------------现代电路与系统实验报告---------------------------------异步接收模块-------------------------------------------libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityuart_rxisport(clk:instd_logic;--系统时钟rst_n:instd_logic;--复位信号rs232_rx:instd_logic;--RS232接收数据信号clk_bps:instd_logic;--此时clk_bps的高电平为接收数据的采样点bps_start:outstd_logic;--接收到数据后,波特率时钟启动置位rx_data:outstd_logic_vector(7downto0);--接收数据寄存器,保存直至下一个数据来到rx_int:outstd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);enduart_rx;architecturebehavofuart_rxissignalrs232_rx0:std_logic;signalrs232_rx1:std_logic;signalrs232_rx2:std_logic;signalrs232_rx3:std_logic;signalneg_rs232_rx:std_logic;signalbps_start_r:std_logic;signalnum:integer;signalrx_data_r:std_logic_vector(7downto0);--串口接收数据寄存器,保存直至下一个数据到来beginprocess(clk,rst_n)beginif(rst_n='0')thenrs232_rx0='0';rs232_rx1='0';rs232_rx2='0';rs232_rx3='0';elseif(rising_edge(clk))thenrs232_rx0=rs232_rx;现代电路与系统实验报告rs232_rx1=rs232_rx0;rs232_rx2=rs232_rx1;rs232_rx3=rs232_rx2;endif;endif;neg_rs232_rx=rs232_rx3andrs232_rx2andnot(rs232_rx1)andnot(rs232_rx0);endprocess;process(clk,rst_n)beginif(rst_n='0')thenbps_start_r='0';rx_int='0';elseif(rising_edge(clk))thenif(neg_rs232_rx='1')then--接收到串口数据线rs232_rx的下降沿标志信号bps_start_r='1';--启动串口准备数据接收rx_int='1';--接收数据中断信号使能elseif((num=15)and(clk_bps='1'))then--接收完有用数据信息bps_start_r='0';--数据接收完毕,释放波特率启动信号rx_int='0';--接收数据中断信号关闭endif;endif;endif;endif;bps_start=bps_start_r;endprocess;process(clk,rst_n)beginif(rst_n='0')thenrx_data_r=00000000;rx_data=00000000;num=0;elseif(rising_edge(clk))thenif(clk_bps='1')thennum=num+1;casenumis现代电路与系统实验报告when1=rx_data_r(0)=rs232_rx;--锁存第0bitwhen2=rx_data_r(1)=rs232_rx;--锁存第0bitwhen3=rx_data_r(2)=rs232_rx;--锁存第0bitwhen4=rx_data_r(3)=rs232_rx;--锁存第0bitwhen5=rx_data_r(4)=rs232_rx;--锁存第0bitwhen6=rx_data_r(5)=rs232_rx;--锁存第0bitwhen7=rx_data_r(6)=rs232_rx;--锁存第0bitwhen8=rx_data_r(7)=rs232_rx;--锁存第0bitwhen10=rx_data=rx_data_r;when11=num=15;whenothers
本文标题:UART串口通信实验报告
链接地址:https://www.777doc.com/doc-7407713 .html