应用笔记

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)

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

  1. Uart、SPI和I2C的区别

    串口通信:UART.SPI.I2C区别[引用]   1.UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少.数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快.在多机通信上面 ...

  2. 采用FPGA实现音频模数转换器

    http://www.21ic.com/app/eda/200905/42832.htm http://www.eefocus.com/article/09-10/84673s.html 摘 要 简要 ...

  3. UART、SPI和I2C详解

    做单片机开发时UART,SPI和I2C都是我们最经常使用到的硬件接口,我收集了相关的具体材料对这三种接口进行了详细的解释. UART UART是一种通用串行数据总线,用于异步通信.该总线双向通信,可以 ...

  4. USB、UART、SPI等总线速率

    1. USB总线 USB1.1: ---低速模式(low speed):1.5Mbps ---全速模式(full speed): 12Mbps USB2.0:向下兼容.增加了高速模式,最大速率480M ...

  5. USB、UART、SPI等总线速率(转)

    1. USB总线 USB1.1: ——-低速模式(low speed):1.5Mbps ——-全速模式(full speed): 12Mbps USB2.0:向下兼容.增加了高速模式,最大速率480M ...

  6. UART,USART,SPI,I2C等总线的介绍与区别20160526

    首先来说一下UART和USART的区别: 1.字面意义: UART:universal asynchronous receiver and transmitter通用异步收发器: USART:univ ...

  7. 基于FPGA的UART协议实现(通过线性序列机)

    //////////////////2018/10/15 更新源代码: 实现uart这东西其实早就写了,不过不太完善,对于一个完美主义者来说,必须解决掉它. 1.什么是UART?        通用异 ...

  8. UART、SPI、I2C协议异同点

    I2C.SPI.UART都是常见的低速板级通信协议,目前主流的SoC都内置了这些通讯协议的控制器,同样,各种传感器.Touch控制器.指纹模块.蓝牙模块.WIFI模块也都兼容这三种通信方式的一种或几种 ...

  9. 串行总线 —— I2C、UART、SPI

    I2C,也叫 IIC,是一种常见的串行总线,它只需要两根线即可在连接于总线上的器件之间传送信息. 0. 电气知识 开漏输出:Open drain output,不输出电压,低电平时接地,高电平时不接地 ...

随机推荐

  1. 20145207《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    <Java 程序设计>实验一(Java开发环境的熟悉)实验报告 目录 改变 Java开发环境的熟悉实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.增加了自 ...

  2. JS中的eval函数

           最近开始慢慢学习前端的脚本了,上次碰到了一个问题,需要通过一个对象的属性名称来获得这个对象这个属性的值.如果在C#中,那么直接通过反射就可以了.而在js中,也有类似的函数,那就是eval ...

  3. Spark优化一则 - 减少Shuffle

    Spark优化一则 - 减少Shuffle 看了Spark Summit 2014的A Deeper Understanding of Spark Internals,视频(要***)详细讲解了Spa ...

  4. 二、利用EnterpriseFrameWork快速开发Web系统(B/S)

    EnterpriseFrameWork框架实例源代码下载: 实例下载 本章通过一个开发实例来讲解Web系统的开发经过,以及会碰到的一些问题.实例功能就是业务系统中最常见的增.删.改.查来演示,用一个界 ...

  5. Windows环境下php开启GD库的方法

    一.GD库是什么? GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印.在网站上GD库通常用来生成缩略图,或者用来对图片加 ...

  6. [二读]The Art of Pompeii's Influence on Neo-Classicism

    The Art of Pompeii's Influence on Neo-Classicism The discovery of Pompeii's ruins in 1599 profoundly ...

  7. 关于购买Redis服务器:腾讯云、阿里云还是华为云?

    个人分类: redis使用 编辑 新年伊始,很多商家都开始进行新年产品大促销,在分布是缓存Redis领域,几家大公司也是打得如火如荼,各有千秋啊. 现在市场上比较有口碑的商家有腾讯云.阿里云.华为云三 ...

  8. Apriori 获取关联规则实现

    前言 自己的一个Apriori 获取关联规则的python实现.具体原理不讲,代码添加了说明,还是很好理解的. 数据预处理 #最小置信度 min_conf = 0.5 #最小支持度 min_sup = ...

  9. 【Python进阶】无论API怎么变,SDK都可以根据URL实现完全动态的调用

    现在很多网站都搞REST API,比如新浪微博.豆瓣啥的,调用API的URL类似: http://api.server/user/friends http://api.server/user/time ...

  10. [leetcode-811-Subdomain Visit Count]

    A website domain like "discuss.leetcode.com" consists of various subdomains. At the top le ...