原创 FPGA篇之带FIFO的UART设计

2013-12-21 23:59 7486 25 26 分类: FPGA/CPLD 文集: FPGA篇

UART是最常用的串行通信方式,几乎每一款MCU或者处理器都有UART。但是很多MCUUART都没有带硬件FIFO,而一般嵌入式处理器的UART都带硬件FIFO,可是FIFO的深度常见的是816或者32。在一些较大数据包的传输场合,带较大深度FIFOUART,可以有效提高传输效率和降低CPU的负担。FPGA具有较大容量的嵌入式RAM,适合组成FIFO,比如ALTERAFPGA,利用Quartus II里的MegaWizard Plug-In Manager工具,很方便就可以生成可定制深度和位宽的FIFO。为构建带FIFOUART提供有利条件。本文介绍的是一种包含512字节FIFO并且带并行总线的UART设计。

20131221233756213.jpg

1

如图1所示,就是一种用FPGA设计的UART 结构图。采用常用的并行总线作为与主机通信的接口,可直接与CPU总线对接。通过总线操作,可以直接访问控制寄存器、状态寄存器和读写数据寄存器。写数据寄存器与发送FIFO相连,总线每写入一个数据,就会相应增加到发送FIFO中。如果使能了发送使能控制位,发送逻辑就会从发送FIFO读出数据到发送移位寄存器,串行数据从TXD发出。同样,如果使能了接收使能控制位,当接收逻辑收到一个数据时,就写入接收FIFO,接收FIFO读端口的第一个字节被映射到读数据寄存器。这样总线每读出一个字节,就相当于从接收FIFO读出一个字节。

UART还带有接收中断功能,只要设定了中断触发值寄存器,当接收FIFO数据个数达到中断触发值时,就会从INT引脚产生中断信号,通知主机。

波特率的设定是通过设定分频值寄存器,产生波特率时钟。UART采用16倍波特率的采样时钟,所以波特率Baud = sysclk/16/(分频值+1)。由于收发是异步的,所以发送逻辑和接收逻辑使用不同的时钟产生模块。

20131221233818617.jpg

2

采用自顶而下的模块化设计方法,分为总线控制、发送逻辑、接收逻辑、时钟产生、发送FIFO、接收FIFO以及FIFO读写控制模块。在Quartus II里综合出来的顶层RTL如图2

1

地址

寄存器

描述

读写

0x00

FIFO

W:发送FIFO

R:接收FIFO

R/W

0x01

分频值

Baud = sysclk/16/(分频值+1)

W

0x02

中断触发值

当接收FIFO有效个数≥中断触发值时,触发中断

W

0x03

状态寄存器

Bit0:接收FIFO空;

Bit1:接收FIFO满;

Bit2:发送FIFO空;

Bit3:发送FIFO满;

Bit4:接收FIFO有效个数第8位;

Bit5:接收FIFO有效个数第9位;

Bit6~ Bit7:保留

R

0x04

接收FIFO有效个数

接收FIFO有效个数0~7位;

R

0x05

控制寄存器

Bit0:发送FIFO清空位;

Bit1:接收FIFO清空位;

Bit2:接收使能位;

Bit3:发送使能位;

Bit4~Bit7:保留

W

总线可操作的内部寄存器以及描述见表1所示。在本例中,发送和接收FIFO的深度都是512字节。发送FIFO和接收FIFO共用了地址0x00UART使用1位起始位、8位数据位和1位停止位。

 

使用modelsim进行UART的功能仿真。仿真的方法是采用UART自发自收的方式,把RXD连接到TXD。先通过总线设置好UART的控制寄存器,使能发送和接收,设定中断触发值为5,然后往发送FIFO写入从0x55~0x5e10个字节。经过一段时间后,读取接收FIFO的数据个数,然后依次把接收到的数据读出。仿真结果见如图345

20131221233847560.jpg

3

3是整个仿真截图,可以看到,当写入数据之后,txd引脚就开始输出串行数据,依次是0x55~0x5e。同时数据从rxd输入到接收逻辑,也就是每发送一个数据就相应接收到相同的一个数据。当发送完5个字节后,int_out信号置为高,此时产生中断。

20131221233905695.jpg

4

4是仿真开始时的截图,总线依次写入了中断触发值为5;分频值为1,也就是波特率为主时钟的1/32;清空发送和接收FIFO,并使能了发送和接收;然后依次写入0x55~0x5e到发送FIFOtxd开始有波形,表示开始发送数据。

20131221233922353.jpg

5

5是仿真的末期截图,总线先读取接收FIFO有效数据个数为10,然后依次从接收FIFO读出的数据为0x55~0x5e,说明接收到了发送的10个字节。说明功能仿真通过。

文章评论1条评论)

登录后参与讨论

用户125281 2015-9-30 12:56

似乎没FIFO超时中断,如果收到的字节数不是FIFO Trigger门限的整数倍,那么多出来的那些字节就一直要等着。。?
相关推荐阅读
用户224096 2014-03-29 10:57
[博客大赛]PCB设计后期检查
当一块PCB板完成了布局布线,又检查连通性和间距都没有报错的情况下,一块PCB是不是就完成了呢?答案当然是否定。很多初学者也包括一些有经验的工程师,由于时间紧或者不耐烦亦或者过于自信,往往草...
用户224096 2014-03-29 10:22
基于CYUSB3014 USB3.0总线开发技术
1.引言 USB(Universal Serial Bus,通用串行总线)以其无需配置、即插即用等特性获得了广泛的应用。2004年提出的USB2.0标准,传输速度最大能够达到480Mbps。但在 ...
用户224096 2014-02-07 15:09
产品要稳定,超频须谨慎
最近发现公司生产部一批某型号产品经过高温老化后,很多机子都出现问题,某项功能有时能工作,有时不能工作,导致这批机子只能暂停生产。问题是由机子里一块当数据中继的电路板引起的,这块板子负责收集各个模块采集...
用户224096 2014-01-14 22:10
运放使用注意事项
运放是作为最通用的模拟器件,广泛用于信号变换调理、ADC采样前端、电源电路等场合中。虽然运放外围电路简单,不过在使用过程中还是有很多需要注意的地方。 1、注意输入电压是否超限 图1是ADI的OP0...
用户224096 2013-12-26 17:06
怎样把可调DC-DC变身为数控稳压电源
图1DC-DC开关稳压电路由于其高效率、大电流的优点被广泛使用。可调DC-DC可以通过调节反馈分压电阻来调节输出电压。图1是常用DC-DC降压稳压芯片LM2596-Adj的典型应用电路,通过调节R1和...
用户224096 2013-12-24 19:19
MCU篇之慎用“假”OD门
除了传统51单片机之外,一般的MCU都有较强的IO功能,可以设置为几种常见的配置方式:推挽输出、OD输出、浮空输入、上下拉输入等。有时候,我们需要把IO设置为OD输出方式,写“0”时由下拉管主动把电压...
我要评论
1
25
关闭 站长推荐上一条 /2 下一条