完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
工程利用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<=fifo2_data_out_2; process(clk_100M) begin if(clk_100M'event and clk_100M='1') then fifo1_data_in_1<=fifo1_data_in_2; fifo1_data_in_2<=fifo_data_in; reden_1_d1<=reden_1; end if; end process; ----fifo1 process(nrst,clk_100M,reden_1,empty_2) begin if (nrst='0') then wr_en_d1 <='0'; wr_en_d1_1 <='0'; wr_en_d1_2 <='0'; -- rd_en_d1 <='0'; -- rd_en_d1 <='0'; elsif (clk_100M'event and clk_100M='1') then empty_2<=empty_1; wr_en_d1_1<= wr_en_d1; if (empty_2='0' and full_d1='0') then wr_en_d1 <='1'; reden_1 <='1'; else wr_en_d1 <='0'; reden_1 <='0'; end if; end if; end process; wr_en_d1_2 <= wr_en_d1; reden <= reden_1_d1; process(nrst,clk_100M,empty_d1) begin if (nrst='0') then wr_en_d2<='0'; elsif (clk_100M'event and clk_100M='1') then if (empty_d1='0' and full_d2='0') then wr_en_d2<='1'; rd_en_d1<='1'; else wr_en_d2<='0'; rd_en_d1<='0'; end if; end if; end process; process(clk_100M,empty_d2) begin if (clk_100M'event and clk_100M='1') then if (empty_d2='0' ) then rd_en_d2<='1'; else rd_en_d2<='0'; end if; end if; end process; fifo_save : fifo1 PORT MAP ( rst => 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; |
|
相关推荐
15个回答
|
|
真的没有像你这样用过
|
|
|
|
|
|
|
|
为什么要用两个fifo呢?直接用32bit进,1bit出,就可以啊,这样少了,中间的设计,如果中间连接不好的话,可能第二个fifo写入的是空,输出都是0,所以,感觉上是没有数据出来
|
|
|
|
fly1986163 发表于 2016-12-26 16:26 FIFO 的IP不支持32位输入,1位输出,我把设计改为一个FIFO,32位输入,8位输出,仍然没有输出,改为32位输出就正常了,所以在考虑,是不是FIFO的IP不支持不同位宽的设计 |
|
|
|
|
|
|
|
考虑过这个方案,并串转换,但是32位的数据时钟是100M,如果采用移位输出的话,那么输出时钟是不是应该是3.2GHz呢?这个时钟频率对于FPGA来说太大了,如果不采用这么大的时钟,感觉会丢数据 |
|
|
|
看看这两个fifo的状态,整个工作过程中两个fifo都不能空或者满,如果出现空满了就要看一下读写信号的控制!!!
|
|
|
|
青色仙人掌 发表于 2016-12-26 17:28 骚年,用fifo和你自己写最终输出的时钟是一样的,你如果是100M的32位数据接受,如果并转串,输出就是3.2G的1bit数据,如果时钟慢了,肯定会丢数,这跟你自己写还是用fif无关 |
|
|
|
fly1986163 发表于 2016-12-28 14:26 用FIFO的话,如果写的快读的慢,那么读不完的数据可以缓存在FIFO里面吧,这就是为啥要计算FIFO的深度应该是多少,而调用IP核生成的fifo,实际上就是一个双端口的块RAM,我是一直这么理解的 |
|
|
|
从仿真看,时序都是正确的,如果我把数据位宽设置成一致就可以正常输出数据了,在考虑是不是位宽不一致才出现的问题 |
|
|
|
如果是一直有32bit的数据过来,而且全部有用,用相同的时钟输出的话,你传32t必须丢掉31bit,否则再大的fifo也无法承载你持续进来的数据。
|
|
|
|
顶一下
|
|
|
|
兄弟啊,注意复位是高电平复位,看你设计的“nrst”时低电平,把nrst取个反接到FIFO的复位端口上。我的答案有用的话,希望采纳。
|
|
|
|
兄弟啊,注意复位是高电平复位,看你设计的“nrst”时低电平,把nrst取个反接到FIFO的复位端口上。我的答案有用的话,希望采纳。
|
|
|
|
如果你的数据是一直存在的,那么写的快,读的慢,总有一个时刻fifo会被写满,同样会存在数据丢失问题; 如果数据不是一直存在的,那么同样可以考虑使用移位寄存器的方法来实现。 总之关键在于读写速率的匹配。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1830 浏览 1 评论
助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4
1116 浏览 0 评论
2926 浏览 1 评论
2602 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
2896 浏览 0 评论
2138 浏览 58 评论
6085 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-7 21:18 , Processed in 0.824900 second(s), Total 67, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号