基于FPGA的UART通信中的fifo问题
http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_646724BHJEPJ.pngUART通信顶层程序 (原文件名:QQ截图未命名.png)
这是我的UART顶层程序,FPGA通过串口接收数据给ARM,ARM通过它发送数据。请问
1.ARM该什么时候给发送端的fifo写数据,又什么时候从接收端的fifo中读数据?这个时序怎么控制啊?
2.如果不用fifo做缓存,该用什么?寄存器吗?
谢谢! 1.发送端的fifo非满即可往里面写数据,接收端fifo非空即可从里面读数据。当然,如果用超时的方式接收数据效率会更高些。可以用查询的方法查询fifo的空/满标志位,也可以用中断的方式。通常情况下,发送用查询方式,接收用中断方式(非空中断或超时中断)。
2.用寄存器也可以。但是资源允许的情况下,用fifo比较好,效率高些。 FIFO需要一个flag 回复【1楼】hjjft
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_646919UCJCFY.jpg
(原文件名:lpm_fifo_transmitter_wave0.jpg)
这是fifo的时序图,里面有个时钟信号,读写使能信号如何与时钟同步啊?读写信号太短或太长可能会导致读写不到数据或读写了几遍数据。如果读写一直有效则要保证数据要随时钟及时变化,否则会读写几遍,这些都怎么控制啊?
谢谢! 干嘛不用spi? 回复【3楼】laokongzhuang
-----------------------------------------------------------------------
读写信号要与fifo的驱动时钟同步 回复【5楼】hjjft
-----------------------------------------------------------------------
就是不明白如何做到同步啊,读写信号是ARM传过来的,时钟是FPGA内部提供的,这个同步应该比较麻烦吧?有没有简单的方法实现缓存呢? 用fifo的驱动时钟对ARM的读写信号进行采样,然后生成同步的读写信号。 如果有将ARM的读写时钟引入FPGA的话,可以直接使用该时钟来驱动fifo,就可以很方便地实现同步 回复【6楼】laokongzhuang
-----------------------------------------------------------------------
请问读写信号的宽度如何和fifo的驱动时钟信号匹配?比如fifo驱动时钟周期200ns,那么读写信号的有效宽度就必须满足在第一个时钟沿时有效,在下一个时钟沿必须无效,否则就会读写两次数据,这个如何做到?谢谢! 时钟信号频率至少8或16倍波特率时钟,也就是所谓一个未采样8或16次的单片机内部做法 mark 感觉不太好弄! 楼主,FPGA的UART通信搞好了吗,可以发我一份做个参考吗?chenwg7@126.com laokongzhuang 发表于 2011-6-28 10:53 static/image/common/back.gif
回复【6楼】laokongzhuang
-----------------------------------------------------------------------
请 ...
这个问题你得到答案了吗?
我也有相应的问题。
是读取了二次还是一次呢?
是不是第一次读取或写入的时候没有完成,第二次不会被触发,不会执行?还是被默默挂起了,最后又执行了第二次? UART需要配置波特率,对模块的运行时钟根据波特率寄存器用个计数器做一个采样时钟即可 UART用FIFO有点浪费资源了吧,UART16550还差不多...
页:
[1]