为什么在FPGA中读取FIFO时,读的第一个数据和第二个数据之间会有两个时钟周期的延迟呢?

neu_2015 2017-04-30 09:35:35
在使用Modesim仿真时,读FIFO的第一个数和第二个数据之间有2个时钟的延迟,这是什么原因造成的啊
...全文
1217 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ao_ 2018-11-25
  • 打赏
  • 举报
回复 1
用的是Xilinx 的 FPGA 吧, 去看官网提供的官方 IP 用户手册 USER GUIDE 里都有写得很详细, 里面解释了为什么读出的时候要有两个时钟的延迟,和他在片子里的实现有关,牵涉到几个寄存器,需要有几个时钟的时间才能到达输出端口。
uid123 2017-04-30
  • 打赏
  • 举报
回复
还有另一种可能,就是在外部存储器中,文件不是以连续的形式存储在存储器中的,是不连续的,所以在每一段的结尾就会有识别字节和下一段地址的字节放入在这个段的末尾,在读到当前段的跳转时占一个时钟,在读取下一段的首地址时占一个时钟。
uid123 2017-04-30
  • 打赏
  • 举报
回复
没程序段不知道,但大概能估计来,可能我说的也不对。你用的这个应该是上操作系统了,最早在单片机里面有靠FOR循环走一个数值进入忙等待,比方说51控制的LED灯闪烁就可以用for循环进行延时,到了操作系统里面,这种延时被操作系统中的中断功能以wait这种方式交到其他程序种运行来实现延时等待,在接到中断后,这个过程种就有2个运算进行(刚刚好2个时钟),一个是记录当前指针的数据压入堆栈,第二个是等待程序的地址指针出到达当前指针寄存器。所以就能运行其他程序,然后等待时间过后回复之前程序运行。
基于FPGA数据采集系统。 主要实现功能流程为:首先通过串口向FPGA发送控制信号,控制DAC芯片tlv5618进行DA装换,转换的数据存在ROM,转换开始ROM数据进行转换。其次用按键控制adc128s052进行模数转换100次,模数转换数据存储到FIFO,再从FIFO数据通过串口输出显示在pc上。 该系统主要包括9个模块:串口接收模块、按键消抖模块、按键控制模块、ROM模块、DAC驱动模块、ADC驱动模块、同步FIFO模块、FIFO控制模块、串口发送模块。各个模块的作用如下: (1)串口接收模块(UART_Byte_Rx.v):完成串口数据接收,将串行数据转换成并行数据输出。 (2)按键消抖模块(key_filter.v):进行按键消抖,可输出一个脉冲按键按下标志和按键按下间标志。 (3)按键控制模块(key_ctrl.v):当在DA一直输出模拟信号,按下按键控制ADC转换100次。 (4)ROM模块(single_port_rom.v):存储DA转换的数据,可存放正弦波形数据。 (5)DAC驱动模块(dac_driver.v):数模转换驱动模块,与外部DAC芯片相连,提供DAC芯片钟和数据信号等。 (6)ADC驱动模块(adc_driver.v):模数转换驱动模块,与外部ADC芯片相连,提供ADC芯片钟和控制信号等。 (7)同步FIFO模块(sync_fifo.v):存放ADC转换后的数据。 (8)FIFO控制模块(fifo_ctrl.v):当FIFO数据,将FIFO数据转换成可以UART串口发送的数据。 (9)串口发送模块(Uart_Byte_Tx.v):经过FIFO控制模块转换的数据通过串口发送模块发送到串口,显示在pc端。 (10)DAC控制模块(dac_ctrl.v):当接收串口指定的指令,开始将ROM的正弦数据进行DAC转换。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧