首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
基于FPGA的串行接收模块的设计
来源:本站整理  作者:佚名  2009-08-10 09:12:43



4 FPGA接收串行数据的软件设计
本方案采用的串行异步通信的帧格式为:1位起始位+5位数据位+1位停止位。经检测与分析,如果已经确定异步通信的帧格式,那么每个字符就可以分别用固定的 7位数据表示。比如:字符‘ 0’:‘0000011’;字符‘ 1’:‘0100011’。其中第 1位数据‘ 0’为起始位,昀后 1位数据‘1’为停止位,中间 5位数据为数据位。例如:用串口调试助手软件发送字符串‘100’,则会在 FPGA的 RxD引脚测得如图 3的波形。其中, st1,st2,st3表示先后发送的 3个字符, t1,t2,t3则表示对每个字符进行检测时所经过的 3种状态。
正如图3波形所示,接收逻辑首先通过检测输入数据的下降沿来检查起始位。然后产生接收时钟,利用接收时钟来采样串行输入数据。由于字符‘0’和‘1’在5位数据位中的仅第一位有区别,因此只要准确地将第一位数据检测出来就可以得出串口调试助手所发送的字符串。再利用移位操作,将字符串存储在缓存器(即另一组可以更新的字符串)中。

 


至于剩下的4位数据位和一位停止位,就可以不随接收时钟采样。待串口调试组手发送的字符串全部存储之后,一起在该模块中进行判断,并根据字符串的不同来控制FPGA不同的输出。接收时钟是根据数据传输的波特率产生的:接收时钟= 16×19200Hz。它始于起始位的下降沿,终于第5位数据位的上升沿。下面是实现检测第1个字符的VHDL源程序。 


if(clk0'event and clk0='1')then ----外部时钟
case state is
when st1=> ----第1 个字符开始
case tate is
when t1=> ----起始位开始
if(rxd='1')then ----未到下降沿不计数
cnt16 <= "0000";
cnt48 <= "000000"; ----所有时钟清零
else cnt16 <=cnt16+1; ----下降沿来,起始位计数开始
end if;
if(cnt16="1111")then
tate <= t2; ----起始位完,进入数据位
end if;
when t2=> ----进入第1 位数据位
if(cnt16="1111")then
cnt16 <= "0000";
else cnt16 <= cnt16+1;
end if;
if(cnt16="0011")then
sdata <= rxd; ----采样第1 位数据位
end if;
if(cnt16="0111")then
if(sdata='0')then
data(0)<='0';
else data(0)<='1'; ----判断采样值,如果为0,则发送字符为0,
反之亦然
end if;
end if;
if(cnt16="1111")then
tate <= t3; ----第1 位数据位完,进入下一状态
end if;
when t3=> ----进入第2 位,第3 位和第4 位数据状态
if(cnt16="1111")then

cnt48 <= "000000";
else cnt48 <= cnt48+1; ----不对剩下的数据采样,直接计数
end if;
if(cnt48="101111")then
sdata <='0'; ----采样位清零
tate <= t1; ----进入采集下一字符的准备状态
state <= st2; ----第1 个字符采集完,进入下一字符
end if;
end case;
fdata(0) <= data(0); ----采集完的字符存入缓存区
…… …… ……

 

上一页  [1] [2] [3] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:185,718.80000 毫秒