VHDL串口通信文档格式.docx
《VHDL串口通信文档格式.docx》由会员分享,可在线阅读,更多相关《VHDL串口通信文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
4.2.2UART发送模块
发送过程:
空闲状态,线路处于高电平;
当受到发送数据指令后,拉低线路一个数据位的时间T,接着数据按地位到高位依次发送,数据发送完毕后,接着发送停止位〔停止位为高电平〕,一帧数据发送结束。
(1)模块流程图
根据以上发送过程,发送模块算法示意图设计如图4.5所示。
开始
wrsig=1
N
idle=0
Y
发送数据
停止位
结束
图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所示。
rx=0
接收数据
图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);
0000000010100010"
clkout<
0000000000000001"
elsif(cnt="
0000000101000100"
0000000000000000"
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);
0111000