采用FPGA实现UART转SPI
2015-02-10 21:40
197 查看
应用笔记 V1.1 2015/2/10 | 采用FPGA实现UART转SPI |
概述 | 本文提供了实现UART转SPI的Verilog代码的功能描述。这份笔记将介绍UART和SPI的基本知识,代码设计的基本思路,以及代码的具体实现及其描述。本程序的具体功能在于配合AD9512_Serial_GUI完成AD9512寄存器的配置,包括读及写过程。 |
修订历史 | 以下表格展示了本文档的修订过程
|
简介 | 本程序基于ISE14.7编写,PC机程序采用MATLAB编写,具体参考《程序说明-MATLAB串口操作和GUI编程》。阅读本文档内容前建议先阅读《程序说明-MATLAB串口操作和GUI编程》。 串行通信的帧格式如下所示 图 1 串行数据帧格式 对于AD9512而言,SPI的时序要求如下所示 图 2 AD9512写控制 UART转SPI的过程是通过上位机配置AD9512的过程,我们的目的在于将图 1中的帧格式转换为图 2所示的数据流。对应图二我们需要考虑三路信号 CSB:片选信号 SCLK:时钟 SDIO:数据 SDIO的数据不止8比特,可控制,简单起见我们每次写入1字节的数据。那么此时SDIO的数据流一次有24比特。对应可取串行通信的帧长为8比特,24比特相当于3帧。一旦确定了SDIO,通过FPGA可以很容易确定CSB和SCLK。 因此我们需要采用一个24位的寄存器来存储接收到的数据。那么问题是,我们该如何接收数据呢? 我们可以通过判断第一个下降沿来确定帧的起始,两个寄存器就可以满足这一要求。由于通信过程时钟不同源,我们希望采样点尽可能在中间,采用以高倍于波特率的时钟很容易就可以满足这一点。这里我们选择16倍波特率采样。我们需要一个计数器来判断接收了几个比特,同时还需要计数这是接收的第几帧。一旦我们接收到24比特的有效数据,就可以开始配置AD9512的寄存器了。 在设计之前我们需要考虑一下读寄存器的需求,V1.0版本的程序没有考虑这一点,所以V1.1的程序重写了。因此,做事之前考虑全面是很有必要的。 图 3 AD9512读控制 我们注意到实际上发送两帧数据就可以开始读数了,但为了和写控制一致,我们选择了在发送端发送一帧无意义的数据。一旦地址写入,在SCLK下降沿SDO开始串行输出寄存器的取值。 针对这些控制,我们觉得采用状态机来实现,状态包括: IDLE:空闲状态,等待接收PC发送数据完成 START:数据接收完毕,判断控制字是读还是写 SEND_START:写状态,开始写数(24bits) SEND_END:写完数据 RECV_SEND:接收状态,开始写控制字(16bits) RECV_BEGIN:接收状态,接收8比特数据 RECV_END :接收完毕 UART_START:接收完毕,开始发送数据 状态设置不是特别合理,但基本完成功能,独热码设计。 |
信号说明 | 图 4 UART转SPI模块 表格 1 UART转SPI模块的信号说明
|
参考 | AD9512数据手册 MATLAB帮助 Xilinx应用手册(xapp341) |
代码 | 代码详见AD9512_Serial_GUI(Verilog20150210) |
相关文章推荐
- C6203B DSP系统中用FPGA实现UART的技术难点及解决方案
- 基于FPGA/CPLD设计与实现UART
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现
- FPGA通过SPI对ADC配置简介(五)-----Verilog实现3线SPI配置
- 利用FPGA实现UART的设计
- "阻塞--中断"驱动模型在i2c在子系统、uart驱动、spi子系统中的实现
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现
- 采用FPGA IP实现DDR的读写控制的设计与验证
- FPGA的SPI从机模块实现
- FPGA的SPI从机模块实现
- 采用OpenCL标准实现FPGA设计
- SPI及其FPGA实现
- 基于Verilog简易UART的FPGA/CPLD实现
- FPGA的SPI从机模块实现
- 采用FPGA实现实时边缘检测VGA显示
- FPGA通过SPI对ADC配置简介(四)-------Verilog实现4线SPI配置
- 采用OpenCL标准实现FPGA设计
- spi总线简介及FPGA实现
- 采用OpenCL标准实现FPGA设计
- 基于FPGA/CPLD设计与实现UART(VHDL)