注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

eeleader的个人空间 http://home.eeworld.com.cn/space-uid-210489.html [收藏] [复制] [分享] [RSS]

日志

UART串口收发控制器设计详解

已有 5052 次阅读2013-3-25 11:53 |个人分类:FPGA 开发技术总结|

UART调试记录:UART协议看起来很简单,但是里面涉及好几个小细节,处理起来也不是那么轻松顺畅的,代码写完,调试过了再想起来来也确实就那么回事。重要的是掌握解决问题的方法,代码贴在这里,备忘备参考备修改。

异步通信协议
      

这是发送模块与接收快联调的一种方式,进来的的八位数据经过控制器的串行发送和串行接收,再并行送出去,以验证各个模块的功能正确与否。各个模块的代码如下:

顶层原理图如下,各模块的连接关系在原理图里非常清楚,故省略顶层例化模块:

给出我用的testbench:

仿真波形如下:红色圆圈内的数据是0010011;

可以_dout内的数据使一位一位进来的,其实在没有接收完成时,rx_dout是不应该放出去的,所以上面接收模块的assign rx_dout=data_int;是没有意义的,还是改为REG型在接收一帧数据完成的时候再给他赋值为好。改了以后应该是这样样子:

下面是另外一种方式的联调模式,数据串行从接收端进来,传递到发送模块再串行发送出去,原理图如下:
下面接收模块的rx_complete是上面的rx_start信号,没有改过来记得就行,上面的原理图改了

代码是一样的,只是顶层接线方式有所不同,这很简单。

下面是加了奇校验位的,在发送模块加几行代码即可,接收也在case里面再添一行就行。。

assign check=tx_din[0]+tx_din[1]+tx_din[2]+tx_din[3]+tx_din[4]+tx_din[5]+tx_din[6]+tx_din[7];

if(check%2==0)     check_bit<=1;
                   else  check_bit<=0; 

8:txd<=tx_din[6];
9:txd<=tx_din[7];
10:txd<=check_bit;
11:txd<=1'b1; 

需要注意的几个问题

1、发送起始位,复位的时候把TXD拉高,发送数据的第一位给0;
2、波特率时钟的计算,知道为什么要16倍波特率。
3、接收端怎么检测开始信号,涉及到下降沿的检测。
4、怎么确认开始信号。
5、理解接收数据时的操作方式,16次采样取中间值。附图。

 

 

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-7-24 08:22 , Processed in 0.038949 second(s), 11 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2019 http://bbs.eeworld.com.cn/

返回顶部