• 采用FPGA实现UART转SPI


    应用笔记

    V1.1 2015/2/10

    采用FPGA实现UARTSPI

     

    概述

     

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

    修订历史

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

    日期

    版本号

    修订内容

    2015/02/08

    V1.0

    初始版本,通过实际验证

    2015/02/10

    V1.1

    实现UARTSPISPIUART的转换功能[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)

    允许自由转载,无需注明出处 博客由word编写,上传后排版略乱,请谅解
  • 相关阅读:
    解决pip3的ImportError: cannot import name 'main'
    linux 安装Python3.6
    Linux安装redis和部署
    redis密码管理
    CentOS7使用firewalld打开关闭防火墙与端口
    scrapy 从Windwos平台移植到 Linux平台之实操
    Linux 环境下安装Maven
    解决:安装Jenkins时web界面出现该jenkins实例似乎已离线
    持续集成工具Jenkins结合SVN的安装和使用
    Linux下的SVN服务器搭建
  • 原文地址:https://www.cnblogs.com/sea-wind2/p/4284967.html
Copyright © 2020-2023  润新知