Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第8章

上传人:E**** 文档编号:89355121 上传时间:2019-05-23 格式:PPT 页数:57 大小:922KB
返回 下载 相关 举报
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第8章_第1页
第1页 / 共57页
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第8章_第2页
第2页 / 共57页
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第8章_第3页
第3页 / 共57页
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第8章_第4页
第4页 / 共57页
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第8章_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第8章》由会员分享,可在线阅读,更多相关《Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第8章(57页珍藏版)》请在金锄头文库上搜索。

1、第八章 UART串口通信控制器,8.1 UART传输系统 8.2 UART接收模块设计 8.3 UART发送模块设计 8.4 UART系统的总结 本章小结,8.1 UART传输系统 UART整个系统包含两个部分:发送器和接收器。发送器主要是使用移位寄存器将并行的数据一位一位地按照某特定速率发送出去,而接收器恰好相反,它将数据使用移位寄存器一位一位地接收回来,然后再进行打包。,整个UART数据传输在单线上进行,发送和接收信号线分别标记为TXD和RXD。具体传输过程如下:首先在不进行数据传输时,处于空状态(即idle状态),串行线RXD或者TXD上面信号置1(高电平)。在数据发送过程中,开始时发送

2、0(Start状态,意味着发送数据开始),然后依次发送数据位(可选择6位、7位和8位的数据位宽)、奇偶校验位(位数可选)、停止位。在这里,奇偶校验是为了检验传输中是否有误码。对于偶校验来说,当传输数据中有偶数个1时,校验位为0。对于奇校验,当传输数据中有奇数个1时,校验位为0;停止位置1(高电平),可以是1位、1.5位或者2位。如图8-1所示为8位数据传输位,无校验位,1位停止位的UART传输数据格式。在这里要注意,数据传输为LSB方式,即低位在前,高位在后;另外,还有MSB方式,即高位在前,低位在后。所以数据处理时一定要注意数据的传输方式。,图8-1 8位UART数据传输协议,另外,要注意串

3、口传输过程中物理连线仅仅有三根信号线:TXD、RXD和GND信号。所以UART传输过程当中,没有时钟信息包含在里面。那么发送端与接收端需要协商一个数据传输的速率才能进行传输,通常称为传输波特率,即每秒钟传输多少位数据。波特率的计算包括了数据位数、停止位、校验位。通常所用的波特率包括以下几种:2400,9600,19 200 Bps(即B/s,波特每秒)等。本节举例以如下的通信方式为标准:波特率为19 200,8位数据宽,1位停止位且没有校验位。,8.2 UART接收模块设计 8.2.1 设计方案 通常选用16倍于波特率的时钟进行采样,也就是说串行通信线上的每个数据位都采样16次。假设在数据传输

4、中有N位的数据和M位的停止位,那么过采样的具体步骤如下: (1) 等待接收信号为0,按照UART协议,数据传输以0(低电平)为起始位,开启采样时钟计数器。 (2) 当计数器计数到7,也就是已经计数到起始位数据的中间时刻时,开始清零计数器,然后重新开始。,(3) 当计数器计到15时,从时间上分析已经到第一位数据的中间,这时开始采集数据,并移位到寄存器中,然后重新启动计数器。 (4) 重复N-1次步骤(3),接收剩余的数据。 (5) 如果使用了校验位,那么再重复一次步骤(3)来获取校验位值。 (6) 重复M次步骤(3),获取停止位。,采用上述方法有如下优点:使用采样时钟来估计数据到达的中间时刻,然

5、后采样,即使在数据起始位采集不准时,估计的误差也仅仅在1/16,也就是后续采集数据时刻会有距数据到达中间时刻有1/16的数据偏差,其实是不会影响数据的正确采集的。但是也有缺点:数据波特率不可以太高。如果波特率太高,要求的采样时钟就会太高,这样会引起系统的不稳定。,整个UART接收模块包括如下几个部分(如图8-2所示): (1) UART接收器:用来接收串行传输数据; (2) 波特率产生器:产生采样时钟; (3) 接口电路:包括提供数据缓冲,UART和其它系统之间的握手状态信号等。,图8-2 UART接收器模块框图,8.2.2 波特率产生器 根据过采样采集原理,波特率产生器需要产生一个采样信号,

6、其频率为UART 传输波特率的16倍。为了不在FPGA 系统中产生别的时钟域,从而违背FPGA 同步设计的原则,应采用系统时钟的使能时钟脉冲来产生采样信号,而不是采用直接送到UART接收器的时钟信号。 对于19 200 Bps波特率来说,采样频率应该为307 200(19 200 16)。由于系统时钟为50 MHz,波特率产生 器需要一个模163计数器 ,也就是每163个时钟产生一个时钟脉宽的脉冲信号作为接收采样信号。,8.2.3 UART接收器 为了能够清晰地了解过采样数据采集方法,设计了如图8-3所示的UART接收模块流程图。为了增强程序的规范性并方便以后的修改,设置了两个常数D_BIT和

7、SB_TICK。D_BIT表示数据的位宽,包括16、32、24位;SB_TICK表示针对不同的停止位需要的采样时钟脉冲个数,对应停止位为1、1.5和2位,所选择的采样脉冲数为16、24和32。选择D_BIT为8位,即停止位为1位,SB_TICK为16位。,按照上述过采样原理,所设计流程图包括三个状态:开始、数据传输和停止状态,对应于UART传输协议当中的开始位、数据传输位、停止位。s_tick信号为波特率产生模块提供的脉冲信号,它在每16个时钟周期有一个翻转。需要注意的是,状态机是在每次s_tick信号有效之后才进行状态变化的。同时设置两个寄存器(计数器):s和n。s寄存器用来追踪采样时钟数,

8、在start状态时计数到7,在数据传输状态时计数到15,然后等SB_TICK信号来临时进入停止状态。n计数器追踪在数据传输状态接收到的数据位数,接收到数据移位寄存到b寄存器当中。状态信号rx_done_tick用来指示接收状态的结束标志,在接收状态结束时输出一个时钟周期的高电平。对应代码如程序8-1所示。,图8-3 UART接收器的ASMD状态转移图,【程序8-1】 UART接收器。 module uart_rx #( parameter DBIT = 8, / 数据位宽 SB_TICK = 16 / 对应停止位的采样脉冲数 ) ( input wire clk, reset, input w

9、ire rx, s_tick, output reg rx_done_tick, output wire 7:0 dout );,/ 状态机状态声明 localparam 1:0 idle = 2b00, start = 2b01, data = 2b10, stop = 2b11; / 信号声明 reg 1:0 state_reg, state_next; reg 3:0 s_reg, s_next; reg 2:0 n_reg, n_next; reg 7:0 b_reg, b_next;,/ FSMD 状态和数据寄存器 always (posedge clk, posedge reset

10、) if (reset) begin state_reg = idle; s_reg = 0; n_reg = 0; b_reg = 0; end else begin state_reg = state_next; s_reg = s_next; n_reg = n_next; b_reg = b_next; end,/ FSMD 下一状态逻辑 always * begin state_next = state_reg; rx_done_tick = 1b0; s_next = s_reg; n_next = n_reg; b_next = b_reg; case (state_reg) i

11、dle: if (rx) begin state_next = start; s_next = 0; end start: if (s_tick),if (s_reg=7) begin state_next = data; s_next = 0; n_next = 0; end else s_next = s_reg + 1; data: if (s_tick) if (s_reg=15) begin s_next = 0; b_next = rx, b_reg7:1; if (n_reg=(DBIT-1) state_next = stop ;,else n_next = n_reg + 1

12、; end else s_next = s_reg + 1; stop: if (s_tick) if (s_reg=(SB_TICK-1) begin state_next = idle; rx_done_tick =1b1; end else s_next = s_reg + 1; endcase end / 输出 assign dout = b_reg; endmodule,8.2.4 接口电路 在FPGA系统设计中,UART经常作为串行通信的接口,主系统通过周期性检测接收和发送状态字与UART 进行通信。接收模块接口电路有两个功能: 提供一种正确的数据传输机制,包括对单个数据或者数据包

13、的正确传输,同时能够避免重复接收和漏接收; 对于包传输来说,接口模块电路提供了主系统和UART接收器之间的缓冲器。,常用的接口方案有三种: (1) 采用状态寄存器; (2) 采用状态寄存器和单个数据缓冲器; (3) 采用FIFO缓冲器。 注意在程序8-1中,UART接收器在每次数据接收完之后置位rx_ready_tick信号,就是用来跟主系统进行握手用的。,1方案一 第一种方案是采用一个状态寄存器来检测是否有新的有效数据到达,这个寄存器有两个输入信号,一个为置位标志:set_flag,用来置位寄存器。一个为清零标志:clr_flag,用来清零寄存器。状态标识信号rx_ready_tick信号与

14、set_flag信号相连,如果新的有效数据到来将置位set_flag,而对于主系统来说,通过检测标识信号的输出来判断是否有新的有效数据来临。等接收到一个字节时,延时一个时钟周期之后clr_flag信号有效,如图8-4(a)所示为第一种方案的接口电路顶层原理图。 为了与外界电路进行通信,标识寄存器输出取反并产生最终rx_empty信号,表示没有新的有效数据。在本方案中,主系统直接从UART的移位寄存器接收到数据,并没有做任何的缓冲,那么很有可能在主系统还在传输旧的数据时(状态寄存器有效),UART系统开始一个新的传输,这时旧数据就会被新数据覆盖,而导致发生错误。,2方案二 为了改善上述电路,采用第二种方案。在第一个方案的基础上增加一个字的缓冲器,如图8-4(b)所示。当信号rx_ready_tick有效时,接收数据存储到缓冲器,同时状态寄存器有效,接收器可以持续接收数据而不会影响已经接收到的旧的数据。这样,如果主系统能够在新数据到达之前处理接收数据,则不会有数据被覆盖,如程序8-2所示。,【程序8-2】 带缓冲器的UART接口程序。 module flag_buf #

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号