采用FPGA实现UART转SPI


应用笔记

V1.1 2015/2/10


采用FPGA实现UART转SPI

?


概述


?

本文提供了实现UART转SPI的Verilog代码的功能描述。这份笔记将介绍UART和SPI的基本知识,代码设计的基本思路,以及代码的具体实现及其描述。本程序的具体功能在于配合AD9512_Serial_GUI完成AD9512寄存器的配置,包括读及写过程。



修订历史


以下表格展示了本文档的修订过程


日期


版本号


修订内容


2015/02/08


V1.0


初始版本,通过实际验证


2015/02/10


V1.1


实现UART到SPI和SPI到UART的转换功能[1]

[1]. 代码修订包括更改了实现方式,采用了状态机描述方法是下了UART2SPI的过程,同时增加了SPI2UART的功能。


简介


?

本程序基于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模块的信号说明


信号


类型


功能


clk16x


input


16倍串口通信波特率的采样时钟


rst


input


复位信号,高有效


rxd


input


串口输入信号


rxt


output


串口输出信号


sdio


output


SPI数据输出端口(相对FPGA)


sdo


input


SPI数据输入端口(相对FPGA)


sclk


output


SPI的同步时钟


csb


output


SPI的片选信号


rxd1,rxd2


reg


判断起始位(rxd)


csb_count


reg


判断这是接收的第几帧数据


no_bits_rcvd


reg


判断(串口)接收到的是第几比特的数据


clk1x_enable


reg


串口接收数据时钟使能


clk1x


wire


串口数据的采样时钟


sdio_buf1(2)


reg


暂存串口接收到的数据


sdio_count


reg


SPI发送数据时的计数器

?



参考


?

AD9512数据手册

MATLAB帮助

Xilinx应用手册(xapp341)


代码


?

代码详见AD9512_Serial_GUI(Verilog20150210)

采用FPGA实现UART转SPI

时间: 2024-08-06 19:28:31

采用FPGA实现UART转SPI的相关文章

Uart、SPI和I2C的区别

串口通信:UART.SPI.I2C区别[引用] 1.UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少.数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快.在多机通信上面用的最多. 2.SPI接口和上面UART相比,多了一条同步时钟线,上面UART的缺点也就是它的优点了,对通信双方的时序要求不严格不同设备之间可以很容易结合,而且通信速度非常快.一般用在产品内部元件之间的高速数据通信上面,如大容量存储器等. 3.I2C接口也是两线接口,它是两根线之间通过复杂的逻辑关系传输

UART、SPI、IIC

UART, SPI, IIC的详解及三者的区别和联系 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基本都用于调试. 主机和从机至少要接三根线,RX.TX和GND.TX用于发送数据,RX用于接受数据(收发不是一根线,所以是全双工方式).注意A和B通信A.TX要接B.RX,A.RX要接B.TX(A用TX发B当然要用RX来收了!) 如果A是PC机,B

UART、SPI和I2C详解

做单片机开发时UART,SPI和I2C都是我们最经常使用到的硬件接口,我收集了相关的具体材料对这三种接口进行了详细的解释. UART UART是一种通用串行数据总线,用于异步通信.该总线双向通信,可以实现全双工传输和接收.在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信. 将由计算机内部传送过来的并行数据转换为输出的串行数据流.将计算机外部来的串行数据转换为字节,供计算机内部并行数据的器件使用.在输出的串行

使用Visual Studio deploy NI FPGA板卡(采用FPGA Interface C API Generator)

安装了NI LabVIEW 2015 32bit版本,安装了NI FPGA Interface C API Generator,安装了硬件PCIe-7842R 打开FPGA Interface C API Generator,导入之前用LabVIEW编译生成的FPGA bitfile; a.bitfile 点击generate,生成了几个个文件:1.FPGA bitfile; 2.NiFpga.c;3.NiFpga.h;4.NiFpga_a.h:5.nidist.id. 其中NiFpga_a.h

IIC、SPI和UART区别

第一个区别当然是名字:     SPI(Serial Peripheral Interface:串行外设接口);     I2C(INTER IC BUS)     UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上:     SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SDO).串行数据输入(SDI).SPI总线可以实现多个SPI设备互相连接.提供SPI串行时钟的SPI设备为SPI主机

ADXL345经验总结,采用SPI和I2C总线操作

一. ADXL345简介 ADXL345是ADI公司推出的三轴(x,y,z)iMEMS数字加速度计(digital accelerometer),具有在16G下高分辨率(13Bit)测量能力,同时具备16Bit数字输出.ADXL345 适用于静态倾角测量以及动态加速度测量,高达4mg/LSB的灵敏度允许测量小于1度的倾角. 该传感器还具备单击 /双击探测,自由落体探测,并允许用户设置一个加速度阀值,当加速度值超过设定阀值后可以产生一个信号输出.所有这些功能都可以映射到2个中断上.内置的32级FI

FPGA设计——SPI Flash启动之MC8051设计

1. 概述 本设计采用FPGA技术,在FPGA中实现8051单片机的软核,将外部SPI Flash中的代码数据加载到FPGA内部ram,然后复位MC8051,实现外部flash启动MC8051. 2. 系统框图 8051采用Oregano Systems公司开源的MC8051软核.SPI Flash采用W25Q16芯片存储8051的代码程序.系统框图如下: 3. MC8051简介 Oregano Systems的8051单片机采用VHDL语言开发,具有如下特点: 采用完全同步设计 指令集和标准

SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SDO).串行数据输入(SDI).SPI总线可以实现多个SPI设备互相连接.提供SPI串行时钟的SPI

嵌入式通讯开发 SPI,UART,I2C都有什么区别

SPI,UART,I2C都有什么区别,及其各自的特点 区别:SPI:高速同步串行口.3-4线接口,收发独立.可同步进行 UART:通用异步串行口.按照标准波特率完成双向通讯,速度慢 I2C:一种串行传输方式,三线制,网上可找到其通信协议和用法的 3根线实现数据双向传输 串行外围接口 Serial peripheral interface UART:通用异步收发器 UART是用于控制计算机与串行设备的芯片.有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它