UART串口通信实验报告材料Word文档下载推荐.docx
- 文档编号:17791532
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:13
- 大小:28.41KB
UART串口通信实验报告材料Word文档下载推荐.docx
《UART串口通信实验报告材料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《UART串口通信实验报告材料Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
空闲位:
处于逻辑“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:
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
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UART 串口 通信 实验 报告 材料
![提示](https://static.bdocx.com/images/bang_tan.gif)