|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2019-4-1 09:28 编辑
" L; L4 N4 n0 B p1 m" U3 L
n- A9 R- ?( b7 U4 D- I L/ Z0 L第十二章 串口接收模块设计与验证
' V/ i+ d( U& a* p: N* g* u4 ~! H# O- B" M
实验目的:1.串口接收模块设计与验证 2.使用ISSP进行调试与验证设计的数据接收模块 ![]()
( r0 D( b; S, P+ h实验原理: 在上一讲介绍了串口发送模块的设计思想,其UART发送端发送一个字节数据时序图如图12-1所示。 ![]()
+ S. i [5 w* |3 o5 L9 K图12-1 发送一字节数据时序图 这一讲介绍串口接收模块的设计与实现。当对于数据线的每一位进行采样,一般情况下每一位数据的中间点是最稳定的,因此一般应用中,采集中间时刻时的电平即认为是此位数据的电平,如图12-2所示。 # T! e4 s+ c/ e: B4 O
图12-2 串口接收时序图 但是在工业应用中,现场往往有非常强的电磁干扰,只采样一次就作为该数据的电平判定,是不保险的,有可能恰好采集到被干扰的信号而导致结果出错,因此需要使用多次采样求概率的方式进行。因此这里提出以下为改进型的单bit数据接收方式示意图,如图12-3。
$ D4 g B6 _* {图12-3 改进型串口接收方式示意图 在图12-3中,将每一位数据又平均分成了16小段,对于Bit_x这一位数据,考虑到数据在刚刚发生变化和即将发生变化的这一时期,数据极有可能不稳定的(用红色标出的两段),在这两个时间段采集数据,很有可能得到错误的结果,因此判定这两段时间的电平无效,采集时直接忽略。而中间这一时间段(用绿色标出),数据本身是比较稳定的,一般都代表了正确的结果。也就是前面提到的中间测量方式,但是也不排除该段数据受强电磁干扰而出现错误的电平脉冲,因此对这一段电平,进行多次采样,并求高低电平发生的概率,6次采集结果中,取出现次数多的电平作为采样结果。例如,采样6次的结果分别为1/1/1/1/0/1/,则取电平结果为1,若为0/0/1/0/0/0,,则取电平结果为0,当6次采样结果中1和0各占一半(各3次),则可判断当前通信线路环境非常恶劣,数据不具有可靠性,不进行处理。 这样串口接收模块主要就需要包含起始位检测模块、波特率产生模块以及数据接收模块。 实验步骤: 基于以上原理,串口接收模块整体框图如图12-5所示,其接口列表如表12-1所示。
1 q6 T8 H4 p2 [9 d" W _* ]5 z图12-5 串口接收模块整体框图 / C! W1 }* [ p. w+ t
表12-1 模块接口列表 经过以上的分析,建立工程子文件夹后,新建一个以名为uart_byte_rx的工程保存在prj下,并在本工程目录的rtl文件夹下新建verilog file文件并以uart_byte_rx.v保存。由上面的分析可以得出如下的信号列表。 4 m$ y& g3 r2 A5 o% Z* ^2 h
# z/ X& i3 }( Q" R2 F这里输入数据相对于系统时钟是个异步信号,因此也需要对其进行同步,这就与按键的输入部分一样,不再详述。 ![]() - K) y# y, P: }% V" {. Z, v
2 `9 E$ u9 u# ], z/ a
3 H; D& K/ A+ x( ~8 s; I! D g- E% s! H1 O3 m/ n2 \' B
/ C1 }1 C3 j" H; q! y Q0 k, Y
串口接收模块主要构成之一即为波特率时钟生成模块。这里根据上面提到的过采样方式,实际的采样频率是波特率的16倍,因此存在计数值与波特率之间的关系如表12-3所示,其中系统时钟周期为System_clk_period,这里为20ns。 3 T7 I8 C0 R4 B G$ Z2 z: F
2 @& p/ }( ~, ~% }表12-2 采样时钟计算 不同波特率对应采样时钟分频计数值的选择如下。这里依旧使用了一个选择器,来实现本部分功能。
d" G! ]3 ^9 b
' W, L- U8 b2 l( k" ~7 @* ?4 W7 O+ W, u% g. u
现在产生采样时钟,即波特率时钟的16倍。
2 ~; D( g* h! v5 y' N) E7 B6 {4 U$ u U9 y) {
6 S% W! T" L9 d4 P, Z) e, f5 u; E" L
采样时钟计数器,计数器清零条件之一bps_cnt == 8'd159 即一个字节接收完毕, (bps_cnt == 8'd12 &&(START_BIT > 2))是实现起始位检测是否出错,详细在后面会解释。
2 F* N" I5 ]% e8 F7 m
: {0 o2 d" u2 { M! L% u2 q0 `' T6 N. R
- z6 u* x& r: Z: C( l
以图12-3起始位为例,实现数据接收,中间时间段的bps_cnt值分别为6、7、8、9、10、11,然后直接累加本位数据。然后下一位需要进行计算时的值即为bps_cnt加16,也就是22、23、24、25、26、27,也直接累加本位数据。以此类推可以得到其他位的数据。 现解释为何在上面清零条件之一为(bps_cnt == 8'd12 && (START_BIT > 2)),理想情况下(真正的起始位)也就是当bps_cnt计数值为12时,START_BIT的计算值应该为0。如果此时START_BIT的计算值大于2,也就代表着在6次采样中有一半或以上状态为高电平,这样我们认为真正的起始位尚未到来,不进行数据采集。若不加此操作,进入了一种假采样会使后面的数据接收错误,或者即使接收了也不是真实的数据。
0 l) P% F) R5 T7 H1 a0 N
& d# W! w8 b- ~! M0 G一次采样结束后再将数据一次性传输出去。在原理部分介绍一位数据采集结果中,取出现次数多的电平作为采样结果。6次采样认为大于等于4的数据才是真实数据,这样判断我们可以写为 ,也可以写为, 也可以直接令其等于当前位的第二位数据。011/010/100/101这几个数据分别为3/2/4/5,可以发现只需判断第二位即可。 ![]() ![]() ) }" X5 z7 W# i$ \; f
( i* n# ]1 Y- q0 |% F, @
进行分析和综合直至没有错误以及警告。 为了测试仿真编写测试激励文件,新建uart_byte_rx_tb.v文件保存到testbench文件夹下,这里产生数据的激励使用上一讲的发送数据来做,因此激励文件只需在上一节的激励文件中,修改端口信息、例化本模块以及将发送模块输出的Rs232_Tx连接到接收模块上的Rs232_Rx即可。修改后的激励文件如下: 6 C1 y% u: C' e9 W& r. _$ J2 T
![]() ![]()
5 y5 C3 y3 i. @% y: r! q9 g3 y2 _; Z) A% B5 o
& V6 D' G/ c% Z2 o/ V8 w" ~. g7 q
设置好仿真脚本后进行功能仿真,可以看到如图12-6所示的波形文件,每当一个字节发送结束后,数据输出data_byte_r均会更新输出一次。下图中由于Rs232_Rx仅声明了没有调用,因此无数据显示,可以直接删除。
. ^1 ]8 T& o; T; t4 n4 s/ B, M e图12-6 单byte数据接收仿真波形图 为了使用ISSP进行调试与验证设计的数据接收模块,这里使用的是ISSP的探针功能,与上一讲使用的源不同。其主要配置如图12-7所示,并加入到工程中。
& s) T9 x+ ?0 c' M图12-7 ISSP主要参数配置 在本工程目录的rtl文件夹下新建verilogfile文件在此文件下输入以下内容并以uart_rx_top.v保存,并设置为顶层文件。这里例化了数据接收模块以及ISSP工具。 只有接收成功后才采集数据,也符合实际使用情况。 ![]()
0 V* f$ G8 b, i" M5 W
8 h) \' L _( W# [! i% v* a3 ~
* j F: u* n1 w分配引脚后全编译无误后下载工程到开发板中。在Quartus II中点击Tools—In-System Source and ProbesEditor启动ISSP,手动选择下载器后,并将数据格式改为设计中的hex格式,持续触发模式。打开串口助手波特率设置为9600、没有校验位、8位数据位以及1bit停止位。
0 x- P: G7 v& E; z4 o7 e图12-8 串口助手设置界面
+ s+ `! d6 E( `2 z& `图12-9ISSP工具设置界面 在串口助手上先后输入aa、38后在ISSP使用界面可以看到Data会随之对应变化。即设计无误。
E* k) X( z& J( F图12-10串口助手发送数据
" i* ]3 e# k- S, h( I$ g图12-11-1探针接收到数据 ![]() 图12-11-2探针接收到数据 ' } Q) v3 [% v2 f
: e @0 ], L, h, S6 y' Y
: D8 Z. R6 D5 m) @- y2 v6 G) ]5 ]3 @0 L, v! E: K; l2 L# \
小梅哥 芯航线电子工作室
% B. g5 z' z& Q. E" L" u ! e8 J* G, @9 |7 S
|
|