微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > XILINX FIFO IP核调用问题

XILINX FIFO IP核调用问题

时间:10-02 整理:3721RD 点击:
工程利用ISE自带的FIFO核将32位的并行数据经过缓存以单bit输出,读写时钟相同,首先将32位数据经过FIFO1变成8位输出,再将8位数据经过FIFO2变成1位输出,对程序仿真结果显示正确,但是下载到板子测试的时候,却得不到输出数据,求大神帮忙看看是否是代码的问题呢?多谢啦
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
use ieee.std_logic_arith.all;
USE ieee.numeric_std.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity transmit is
PORT(
clk_100M      : in std_logic;
-- clk_100M       : in std_logic;
nrst          : in std_logic;
fifo_data_in  : in std_logic_vector(31 downto 0);
empty_1       : in std_logic;
reden         : out std_logic;
fifo_data_out : out std_logic_vector(0 downto 0)

);
end transmit;
architecture Behavioral of transmit is

COMPONENT fifo1
  PORT (
    rst    : IN STD_LOGIC;
    wr_clk : IN STD_LOGIC;
    rd_clk : IN STD_LOGIC;
    din    : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
    wr_en  : IN STD_LOGIC;
    rd_en  : IN STD_LOGIC;
    dout   : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
    full   : OUT STD_LOGIC;
    empty  : OUT STD_LOGIC
  );
END COMPONENT;
COMPONENT fifo2
  PORT (
    rst : IN STD_LOGIC;
    wr_clk : IN STD_LOGIC;
    rd_clk : IN STD_LOGIC;
    din : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
    wr_en : IN STD_LOGIC;
    rd_en : IN STD_LOGIC;
    dout : OUT STD_LOGIC_VECTOR(0 DOWNTO 0);
    full : OUT STD_LOGIC;
    empty : OUT STD_LOGIC
  );
END COMPONENT;

signal fifo1_data_in_1   : std_logic_vector(31 downto 0);
signal fifo1_data_in_2   : std_logic_vector(31 downto 0);
signal empty_2           :  std_logic;
signal reden_1           :  std_logic;
signal fifo1_data_out_1  : std_logic_vector(7 downto 0);
signal fifo2_data_out_2  : std_logic_vector(0 downto 0);
signal reden_1_d1        :  std_logic;
--signal clk_100M        :  std_logic;
--signal clk_40M         :  std_logic;
----fifo1
signal wr_en_d1          :  std_logic;
signal wr_en_d1_1        :  std_logic;
signal wr_en_d1_2        :  std_logic;
signal rd_en_d1          :  std_logic;
signal full_d1           :  std_logic;
signal empty_d1          :  std_logic;
----fifo2
signal wr_en_d2          :  std_logic;
signal rd_en_d2          :  std_logic;
signal full_d2           :  std_logic;
signal empty_d2          :  std_logic;

begin
fifo_data_out nrst,
    wr_clk => clk_100M,
    rd_clk => clk_100M,
    din => fifo1_data_in_1,
    wr_en => wr_en_d1,
    rd_en => rd_en_d1,
    dout => fifo1_data_out_1,
    full => full_d1,
    empty => empty_d1
  );         

fifo_trans : fifo2
  PORT MAP (
    rst => nrst,
    wr_clk => clk_100M,
    rd_clk => clk_100M,
    din => fifo1_data_out_1,
    wr_en => wr_en_d2,
    rd_en => rd_en_d2,
    dout =>fifo2_data_out_2,
    full => full_d2,
    empty => empty_d2
  );
end Behavioral;

真的没有像你这样用过

有什么地方逻辑说不通吗

为什么要用两个fifo呢?直接用32bit进,1bit出,就可以啊,这样少了,中间的设计,如果中间连接不好的话,可能第二个fifo写入的是空,输出都是0,所以,感觉上是没有数据出来

FIFO 的IP不支持32位输入,1位输出,我把设计改为一个FIFO,32位输入,8位输出,仍然没有输出,改为32位输出就正常了,所以在考虑,是不是FIFO的IP不支持不同位宽的设计

你可以自己写一个模块,一个32bit的数据,通过移位,每次把最低位输出,就解决了

考虑过这个方案,并串转换,但是32位的数据时钟是100M,如果采用移位输出的话,那么输出时钟是不是应该是3.2GHz呢?这个时钟频率对于FPGA来说太大了,如果不采用这么大的时钟,感觉会丢数据

看看这两个fifo的状态,整个工作过程中两个fifo都不能空或者满,如果出现空满了就要看一下读写信号的控制!

骚年,用fifo和你自己写最终输出的时钟是一样的,你如果是100M的32位数据接受,如果并转串,输出就是3.2G的1bit数据,如果时钟慢了,肯定会丢数,这跟你自己写还是用fif无关

用FIFO的话,如果写的快读的慢,那么读不完的数据可以缓存在FIFO里面吧,这就是为啥要计算FIFO的深度应该是多少,而调用IP核生成的fifo,实际上就是一个双端口的块RAM,我是一直这么理解的

从仿真看,时序都是正确的,如果我把数据位宽设置成一致就可以正常输出数据了,在考虑是不是位宽不一致才出现的问题

如果是一直有32bit的数据过来,而且全部有用,用相同的时钟输出的话,你传32t必须丢掉31bit,否则再大的fifo也无法承载你持续进来的数据。

顶一下

兄弟啊,注意复位是高电平复位,看你设计的“nrst”时低电平,把nrst取个反接到FIFO的复位端口上。我的答案有用的话,希望采纳。

兄弟啊,注意复位是高电平复位,看你设计的“nrst”时低电平,把nrst取个反接到FIFO的复位端口上。我的答案有用的话,希望采纳。

如果你的数据是一直存在的,那么写的快,读的慢,总有一个时刻fifo会被写满,同样会存在数据丢失问题;
如果数据不是一直存在的,那么同样可以考虑使用移位寄存器的方法来实现。
总之关键在于读写速率的匹配。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top