零基础学零基础学FPGA(十一)(十一)FIFO的串口发送机设计及常见错误的串口发送机设计及常见错误
今天要写的是一段基于FIFO的串口发送机设计,之前也写过串口发送的电路,这次写的与上次的有几分类似。
这段代码也是我看过别人写过的之后,消化一下再根据自己的理解写出来的,下面是我写这段代码的全部流程
和思路,希望对刚开始接触的朋友来说有一点点的帮助,也希望有经验的朋友给予宝贵的建议。
首先来解释一下FIFO的含义,FIFO就是First Input First Output的缩写,就是先入先出的意思,按照我的理解就是,先进去的
数据先出,例如一个数组的高位先进,那么读出来的时候也就高位先出。下面是百度百科的解释。
FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端是AD数据采集,另一端是计算机的PCI总线,假设其AD采集的速
率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速
率为1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。另外对于不同宽度的数据接口也可以用FIFO,例如
单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。
下面我们开始设计。
这次设计我们要设计一个串口发送机,想一下的话,我们要发送数据,总得有一个数据产生模块和数据发送模块吧。好,那么
在我们的脑海里就出现了这两个模块。由于我们这次是借用Altera公司提供的IP核FIFO来完成,所以要加入这个模块,这个模
块作为一个数据缓冲器,需要我们例化,等会我们按照思路来例化它。
好,模块出来了,我们将这三个模块分别定义为dataoutput块,fifo_ctrl块和uart_ctrl块。现在考虑连线。我个人感觉在设计之
前,把要设计的东西在草稿纸上将大体框图画出来,具体到每一根连线,这样根据图来写代码要比直接用脑子构图要方便的
多。三个模块,先考虑时钟和复位信号线,三个模块都有,然后,数据产生模块要将产生的数据发给FIFO模块,所以要有数
据写入线,我们定义它为wr-datain,数据写入FIFO块后总要输出,这些数据就是我们要发送的数据,所以定义输出数据线
tx_data,先不管FIFO,我们再来定义数据发送模块的连线,数据发送总要有个启动信号,所以我们定义变量tx_start,之后,
还要有一个输出端给PC机,我们定义这个输出端位rs232,对于FIFO模块的例化过程很简单就不做过多的说明,只把接口说
一下,FIFO模块除了时钟,复位信号外,还有数据输入端口,这个端口要和之前的数据产生模块的数据输出端口相连,还有
写请求端口,高电平有效,数据发送模块每隔1秒钟产生一个16位的数据,并发送写请求命令给FIFO,还有读请求命令,高电
平有效数据发送模块在发送数据时要发送一个读请求给FIFO,从中读取数据后再发送给PC机,还有空信号empty,只要检测
到FIFO中有数据,empty就为低电平,我们可用这个信号来启动数据发送模块。这样一来,我们的整体框架就出来了有了这个
整体框架,再写代码就容易多了。
下面是RTL视图
360桌面截图20140714200658.jpg
下面我们来写代码
按照这个框架,先把接口定义出来,中间的连线用wire型
360桌面截图20140714202033.jpg
设计完端口之后我们就来设计底层模块,先设计数据产生模块dataoutput
这个部分主要是产生数据,可用一个分频电路实现每1s发送一次的数据,产生这16位数据的时候,需要16个时钟,每个时钟
数据自加1,总体来说比较简单
评论0