XILINX FIFO IP核调用问题
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会被写满,同样会存在数据丢失问题;
如果数据不是一直存在的,那么同样可以考虑使用移位寄存器的方法来实现。
总之关键在于读写速率的匹配。