UART串口通信实验报告Word文档下载推荐.docx

上传人:b****5 文档编号:16537523 上传时间:2022-11-24 格式:DOCX 页数:13 大小:27.50KB
下载 相关 举报
UART串口通信实验报告Word文档下载推荐.docx_第1页
第1页 / 共13页
UART串口通信实验报告Word文档下载推荐.docx_第2页
第2页 / 共13页
UART串口通信实验报告Word文档下载推荐.docx_第3页
第3页 / 共13页
UART串口通信实验报告Word文档下载推荐.docx_第4页
第4页 / 共13页
UART串口通信实验报告Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

UART串口通信实验报告Word文档下载推荐.docx

《UART串口通信实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《UART串口通信实验报告Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

UART串口通信实验报告Word文档下载推荐.docx

空闲位:

处于逻辑“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;

entityuartis

port(clk:

instd_logic;

--系统时钟

rst_n:

--复位信号

rs232_rx:

--RS232接收数据信号;

rs232_tx:

outstd_logic--RS232发送数据信号;

);

enduart;

architecturebehavofuartis

componentuart_rxport(clk:

rst_n:

rs232_rx:

--RS232接收数据信号

clk_bps:

--此时clk_bps的高电平为接收数据的采样点

bps_start:

outstd_logic;

--接收到数据后,波特率时钟启动置位

rx_data:

outstd_logic_vector(7downto0);

--接收数据寄存器,保存直至下一个数据来到

rx_int:

outstd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送);

endcomponent;

componentspeed_selectport(clk:

rst_n:

clk_bps:

outstd_logic;

--此时clk_bps的高电平为接收或者发送数据位的中间采样点

bps_start:

instd_logic--接收数据后,波特率时钟启动信号置位);

componentuart_txport(clk:

rst_n:

--复位信号

rs232_tx:

clk_bps:

--此时clk_bps的高电平为接收数据的采样点

bps_start:

rx_data:

instd_logic_vector(7downto0);

rx_int:

instd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);

signalbps_start_1:

std_logic;

signalbps_start_2:

signalclk_bps_1:

signalclk_bps_2:

signalrx_data:

std_logic_vector(7downto0);

signalrx_int:

begin

RX_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=>

rst_n=>

clk_bps=>

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:

clk_bps_2,

bps_start_2

endbehav;

--------------------------------------------------------------------------------------

---------------------------------3个子模块---------------------------------------------

---------------------------------异步接收模块-------------------------------------------

entityuart_rxis

clk_bps:

bps_start:

rx_data:

rx_int:

outstd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);

enduart_rx;

architecturebehavofuart_rxis

signalrs232_rx0:

std_logic;

signalrs232_rx1:

signalrs232_rx2:

signalrs232_rx3:

signalneg_rs232_rx:

signalbps_start_r:

signalnum:

integer;

signalrx_data_r:

--串口接收数据寄存器,保存直至下一个数据到来

begin

process(clk,rst_n)

if(rst_n='

0'

)then

rs232_rx0<

='

;

rs232_rx1<

rs232_rx2<

rs232_rx3<

else

if(rising_edge(clk))then

rs232_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;

bps_start_r<

rx_int<

else

if(neg_rs232_rx='

1'

)then--接收到串口数据线rs232_rx的下降沿标志信号

bps_start_r<

--启动串口准备数据接收

rx_int<

--接收数据中断信号使能

elseif((num=15)and(clk_bps='

))then--接收完有用数据信息

bps_start_r<

--数据接收完毕,释放波特率启动信号

rx_int<

--接收数据中断信号关闭

endif;

endif;

bps_start<

=bps_start_r;

rx_data_r<

="

00000000"

rx_data<

num<

=0;

if(clk_bps='

num<

=num+1;

casenumis

when1=>

rx_data_r(0)<

--锁存第0bit

when2=>

rx_data_r

(1)<

when3=>

rx_data_r

(2)<

when4=>

rx_data_r(3)<

when5=>

rx_data_r(4)<

when6=>

rx_data_r(5)<

when7=>

rx_data_r(6)<

when8=>

rx_data_r(7)<

when10=>

rx_data<

=rx_data_r;

when11=>

num<

=15;

whenothers=>

null;

endcase;

if(num=15)then

num<

endif;

endbehav;

---------------------------------波特率控制模块-----------------------------------------

entityspeed_selectis

instd_logic--接收数据后,波特率时钟启动信号置位或者开始发送数据时,波特率时钟启动信号置位);

endspeed_select;

architecturebehavofspeed_selectis

signalcnt:

std_logic_vector(12downto0);

signalclk_bps_r:

constantBPS_PARA:

integer:

=5207;

constantBPS_PARA_2:

=2603;

cnt<

0000000000000"

if((cnt=BPS_PARA)or(bps_start='

))then

cnt<

--波特率计数器清零

else

cnt<

=cnt+'

--波特率时钟计数启动

clk_bps_r<

if(cnt=BPS_PARA_2)then

clk_bps_r<

--clk_bps_r高电平为接收数据位的中间采样点,同时也作为发送数据的数据改变点

clk_bps_r<

clk_bps<

=clk_bps_r;

---------------------------------异步发送模块-------------------------------------------

entityuart_txis

--接收数据寄存器,保存直至下一个数据来到

instd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);

enduart_tx;

architecturebehavofuart_txis

signalrx_int0:

signalrx_int1:

signalrx_int2:

signalneg_rx_int:

signaltx_data:

rx_int0<

rx_int1<

rx_int2<

rx_int0<

=rx_int;

rx_int1<

=rx_int0;

rx_int2<

=rx_int1;

neg_rx_int<

=not(rx_int1)and(rx_int2);

tx_data<

if(neg_rx_int='

tx_data<

=rx_data;

rs232_tx<

rs232_tx<

=tx_data(0);

--发送第1bit

=tx_data

(1);

--发送第2bit

=tx_data

(2);

--发送第3bit

=tx_data(3);

--发送第4bit

=tx_data(4);

--发送第5bit

=tx_data(5);

--发送第6bit

=tx_data(6);

--发送第7bit

when9=>

=tx_data(7);

--发送第8bit

en

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1