VHDL串口通信Word格式.docx
- 文档编号:18534513
- 上传时间:2022-12-19
- 格式:DOCX
- 页数:17
- 大小:103.79KB
VHDL串口通信Word格式.docx
《VHDL串口通信Word格式.docx》由会员分享,可在线阅读,更多相关《VHDL串口通信Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
根据以上发送过程,发送模块算法示意图设计如图4.5所示。
图4.5UART发送数据算法示意图
(2)生成模块文件
新建一原理图文件,将VHDL源文件生成对应的模块文件如图4.6所示,其中clk为时钟输入,datain为需要发送的数据输入,wrsig为发送命令输入,idle为忙闲信号输出,tx为串行数据输出端。
图4.6UART发送模块
(3)波形仿真
要对发送模块进行时序仿真必须设计一测试模块,即在每一个clk来时产生一个八位的数据。
测试模块代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitytestuartis
port(clk:
instd_logic;
dataout:
outstd_logic_vector(7downto0);
wrsig:
outstd_logic
);
endtestuart;
architectureoneoftestuartis
signaldataoutreg:
std_logic_vector(7downto0);
signalcnt:
std_logic_vector(7downto0);
begin
dataout<
=dataoutreg;
process(clk)
begin
if(clk'
eventandclk='
1'
)then
if(cnt="
11111110"
)then
dataoutreg<
=dataoutreg+"
00000001"
;
wrsig<
='
cnt<
="
00000000"
else
0'
=cnt+"
endif;
endprocess;
endone;
保存文件为testuart.hdl,单击Files→Create/Update→CreateSymbolFilesforCurrentFile命令,为testuart.hdl生成原理图模块。
新建一个原理图文件,各个模块的连接如图4.7所示。
在原理图的适当位置放置testuart模块和uarttx模块,并添加输入输出端口。
图4.7UART发送模块仿真原理图
保存原理图为uarttxts.bdf。
编译工程文件,编译无误后新建波形仿真文件,加入输入输出信号,设置系统时钟信号clk的周期为20ns,保存波形文件为uarttxts.vwf,进行UART数据发送的波形仿真,波形仿真报告如图4.8所示
图4.8UART发送模块仿真结果
对上图分析看出,当发送命令wrsig的上升沿有效时,启动发送数据。
串行数据的波形与发送数据dataout相一致,UART的发送模块得到正确验证。
4.2.3UART接收模块
UART接收模块的功能:
时时检测线路,当线路产生下降沿时,即认为线路有数据传输,启动接收数据进程进行接收,按从低位到高位接收数据。
根据以上描述的接收模块的功能,可将接收模块算法示意图设计如图4.9所示。
图4.9接收模块算法示意图
(2)生成模块文件
新建一原理图文件,将VHDL源文件生成对应的模块文件如图4.10所示,其中clk为时钟输入,rx为需要串行数据输入,dataout为并行输出,rdsig为忙闲信号输出。
图4.10UART接收模块
(3)波形仿真
新建一个原理图文件,加入各功能模块,并添加输入输出端口,各个模块的连接如图4.11所示。
图4.11UART接收模块仿真原理图
保存原理图为uartrxts.bdf。
编译工程文件,编译无误后新建波形仿真文件,加入输入输出信号,设置系统时钟clk为50MHz,保存为uartrxts.vwf,进行UART数据接收的波形仿真,波形仿真报告如图4.12所示。
图4.12UART接收模块仿真结果
对上图分析看出,UART接收模块接收到的数据与UART发送模块发送的数据相一至,每接收到一个数据都有一个读取数据指示rdisg,UART接收模块得到正确验证。
4.2.3硬件测试
按照下图连接个模块,在PC机上安装一个串口调试工具,通过串口调试工具向FPGA发送一个数据,看在PC机上能否接受到发送的数据。
测试结果如下
附录:
程序代码
UART分频模块代码:
entityclkdivis
port(
clk:
clkout:
outstd_logic
endclkdiv;
architectureoneofclkdivis
signalcnt:
std_logic_vector(15downto0);
00010"
clkout<
00001"
elsif(cnt="
00100"
00000"
UART发送模块代码:
entityuarttxis
clk:
instd_logic;
datain:
instd_logic_vector(7downto0);
idle:
outstd_logic;
tx:
enduarttx;
architectureoneofuarttxis
signalsend:
std_logic;
signalwrsigbuf:
signalidlereg:
signalwrsigrise:
idle<
=idlereg;
------------------------------------------------------
wrsigbuf<
=wrsig;
wrsigrise<
=(notwrsigbuf)andwrsig;
----------------------------------------------------------
if(wrsigrise='
and(notidlereg='
))then
send<
10100000"
--------------------------------------------------------
if(send='
casecntis
when"
=>
tx<
idlereg<
00010000"
=datain(0);
00100000"
=datain
(1);
00110000"
=datain
(2);
01000000"
=datain(3);
01010000"
=datain(4);
01100000"
=datain(5);
01110000"
=datain(6);
10000000"
=datain(7);
10010000"
whenothers=>
endcase;
UART接收模块代码:
entityuartrxis
rx:
outstd_logic_vector(7downto0);
rdsig:
enduartrx;
architectureoneofuartrxis
signalrdsigreg:
std_logic;
signalrxbuf:
signalrxfall:
signalreceive:
signalidle:
------------------------------------------------
rxbuf<
=rx;
if(rxbuf='
andrx='
rxfall<
--------------------------------------------------
if(rxfall='
andidle='
)then
receive<
elsif(cnt="
10011000"
---------------------------------------------------
process(clk)
if(receive='
casecntis
=>
rdsig<
00011000"
dataout(0)<
00101000"
dataout
(1)<
00111000"
dataout
(2)<
01001000"
dataout(3)<
01011000"
dataout(4)<
01101000"
dataout(5)<
01111000"
dataout(6)<
10001000"
dataout(7)<
--when"
--idle<
--cnt<
--rdsig<
whenothers=>
----------------------------------------------
UART测试模块代码:
---signalwrsig:
-------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 串口 通信