首页 技术 正文
技术 2022年11月18日
0 收藏 639 点赞 4,921 浏览 1741 个字

应用笔记

V1.1 2015/2/10

采用FPGA实现UART转SPI

 

概述

 

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

采用FPGA实现UART转SPI

修订历史

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

日期

版本号

修订内容

2015/02/08

V1.0

初始版本,通过实际验证

2015/02/10

V1.1

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

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

采用FPGA实现UART转SPI

简介

 

本程序基于ISE14.7编写,PC机程序采用MATLAB编写,具体参考《程序说明-MATLAB串口操作和GUI编程》。阅读本文档内容前建议先阅读《程序说明-MATLAB串口操作和GUI编程》。

串行通信的帧格式如下所示

 

采用FPGA实现UART转SPI

图 1 串行数据帧格式

 

对于AD9512而言,SPI的时序要求如下所示

 

采用FPGA实现UART转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的程序重写了。因此,做事之前考虑全面是很有必要的。

 

采用FPGA实现UART转SPI

图 3 AD9512读控制

 

我们注意到实际上发送两帧数据就可以开始读数了,但为了和写控制一致,我们选择了在发送端发送一帧无意义的数据。一旦地址写入,在SCLK下降沿SDO开始串行输出寄存器的取值。

针对这些控制,我们觉得采用状态机来实现,状态包括:

  • IDLE:空闲状态,等待接收PC发送数据完成
  • START:数据接收完毕,判断控制字是读还是写
  • SEND_START:写状态,开始写数(24bits)
  • SEND_END:写完数据
  • RECV_SEND:接收状态,开始写控制字(16bits)
  • RECV_BEGIN:接收状态,接收8比特数据
  • RECV_END :接收完毕
  • UART_START:接收完毕,开始发送数据

状态设置不是特别合理,但基本完成功能,独热码设计。

采用FPGA实现UART转SPI

信号说明

 

采用FPGA实现UART转SPI

图 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发送数据时的计数器

 

采用FPGA实现UART转SPI

参考

 

AD9512数据手册

MATLAB帮助

Xilinx应用手册(xapp341)

采用FPGA实现UART转SPI

代码

 

代码详见AD9512_Serial_GUI(Verilog20150210)

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,996
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,510
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,353
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,137
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848