您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 带fifo的串口发送器FPGA实现
带fifo的Uart发送器的FPGA实现FPGA使用Altera公司EP4C15F17C8N芯片,它的性能优越,支持大部分IP核使用。常用它来学习NIOSII。使用它实现带FIFO的串口。首先,对uart的实现进行设计。Uart的时序如下图所示:一般使用Uart时,配置为无校验,一个停止位,一个起始位,8位数据。其中尤其重要的为波特率的设置。波特率对应了Uart通信的位宽,用FPGA实现Uart其实就是对通信位宽的调制。位宽通过基础时钟分频得到。Uart波特率计算及实现以9600波特率为例计算:9600的意思为每秒传输的bit数为9600,所以位宽为:1/9600s,换算为ns为:104167ns。那么,如果时钟频率为25MHz,位宽系数为:104167/40=2604。综合上述分析,可以得到一个公式,即:分频系数=时钟频率/波特率。例如:115200波特率,50MHz时钟其对应位宽为:50000000/115200=434。那么以115200波特率,50MHz时钟为例实现Uart的发送。计时器对时钟计数,经过434个周期之后,对计数器加1操作,对相应的信号进行操作,即可实现,它的源代码如下:always@(posedgeclkornegedgerst)if(rst==1'd0)count=17'd0;elseif(count==17'd434)count=17'd0;elsecount=count+1'd1;wiresendclk=(count==17'd434);根据sendclk对Uart进行实现,代码如下:always@(posedgeclkornegedgerst)if(rst==1'b0)TX=1'b1;elseif(FIFOempty==1'b1)beginTX=1'b1;endelsecase(txcount)4'd0:TX=1'b0;//startbitislow4'd1:TX=fifodata[0];4'd2:TX=fifodata[1];4'd3:TX=fifodata[2];4'd4:TX=fifodata[3];4'd5:TX=fifodata[4];4'd6:TX=fifodata[5];4'd7:TX=fifodata[6];4'd8:TX=fifodata[7];4'd9:TX=1'b1;//stopbitsdefault:TX=1'b1;endcase它包含了一个有限状态机。需要注意的地方:为了使串口通信准确无误,要使TX信号在Uart的空闲时期全部置1才行,否则发送数据会出错。作者因为TX在rst时,将其初始化为0,导致发送的数据移位。这个要避免。调试工具:U口转串口,串口调试助手。FIFO的设计和实现:FIFO使用同步时钟,即SCFIFO。需要注意满、空、读请求、写请求的操作,时钟一般使用基础时钟。在空的时候不能读。在满的时候不能写。需要注意的问题是:当输入的数据速度大于输出的数据速度时,会丢数!举一个例子:115200波特率的串口:11520字符/s,将此速度作为输出速度。输入的数据速度:(时钟为50MHz)4096个时钟周期发送10个字符,即:10*10^9/20=121070,这样输入的数据速度大于输出的速度,导致最终FIFO写满,所以会丢数。所以数据输入的速度小于输出的速度才行。
本文标题:带fifo的串口发送器FPGA实现
链接地址:https://www.777doc.com/doc-5822932 .html