在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3625|回复: 13

[求助] FIFO写时碰到的问题

[复制链接]
发表于 2016-6-6 14:25:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我想往FIFO中写数据,共6个字节,11 22 33 44 55 66;每次一个字节,利用6个时钟循环写入实现,如下面程序中的case语句,可是为什么总是循环读的是低4个字节数据,66 55 66 55 ..... 如贴图所示。我程序到底错在哪个地方?
parameter T1S = 32'd49_999_999;
reg [47:0] Data_out = 48'b00010001_00100010_00110011_01000100_01010101_01100110; //11 22 33 44 55 66;

always @ (posedge clk_a or negedge rst_n)
      if(!rst_n)
         cnt_1s <= 25'd0;
          else if (cnt_1s == T1S)
                  cnt_1s <= 25'd0;
          else
                  cnt_1s <= cnt_1s +1'b1;
                  
assign wr_req =(cnt_1s >= 32'd49_999_994)&&(cnt_1s <= 32'd49_999_999);  

always @ (posedge clk_a or negedge rst_n)
         if(!rst_n)
            wr_datain_r <= 8'd0;
                 else if((cnt_1s >= 32'd49_999_994)&&(cnt_1s <= 32'd49_999_999))
                 begin
            timer1s <= 1;
          case (i)
                   0: begin wr_datain_r <=  Data_out [ 7:0]; i <= i+1; end
                   1: begin wr_datain_r <=  Data_out [15:8]; i <= i+1; end
                   2: begin wr_datain_r <=  Data_out [23:16]; i <= i+1; end
                   3: begin wr_datain_r <=  Data_out [31:24]; i <= i+1; end
                   4: begin wr_datain_r <=  Data_out [39:32]; i <= i+1; end
                   5: begin wr_datain_r <=  Data_out [47:40]; i <= 0; end  
                  
                    endcase
                    end                    
                 else
                    begin
            timer1s <= 0;
                    wr_datain_r <= 8'd0;
                    end
               
assign wr_datain = wr_datain_r;
fifo.JPG
发表于 2016-6-6 14:40:22 | 显示全部楼层
这个程序非常简单,不过
1,FIFO并没有读;
2,你的问题应该是FIFO写出错;
3,没有看到i的定义;
至于为什么取数为什么出错,在线看一下i的值,一步一步找问题呗;
另外,你写数的时序明显没有对齐。
 楼主| 发表于 2016-6-6 15:11:44 | 显示全部楼层
回复 2# fascinate_lyd98


    我这个只是截取了写的部分程序,读的部分没贴出来,因为通过串口输出,直接从串口助手就可以看到输出了,跟那个wr_datain的数值是一样的,
另外那个i的定义可能有问题,我现在定义成reg [2:0] i. 可是程序现在写却变为00 66 55 55 55 55;出现这个00应该是你所说的时序没有对齐导致,
请问,如何对齐时序?另外那个i的定义,包括case语句里该如何修改?如您所说,简单的问题,可是已经被卡了快一周了,麻烦了!
发表于 2016-6-6 15:30:36 | 显示全部楼层
回复 3# hms2006

把i的值0,1,2,3,4,5,换成“000”,“001”,“010”,“011”,“100”,“101”试试;其实我也不能确定问题在哪里;
你不能看一下i的值吗?
发表于 2016-6-6 15:33:53 | 显示全部楼层
时序对齐的话,可能方法比较多,
可以把wreq延时一个时钟,即在clk下打一拍送至fifo。
 楼主| 发表于 2016-6-6 15:58:44 | 显示全部楼层
本帖最后由 hms2006 于 2016-6-6 16:08 编辑

回复 4# fascinate_lyd98


    我看了下i值,程序的变化是0h,1 h, 2h,其中2h占据了4个时钟,然后又变为0h。

    我把wr_req延迟一个时钟,然后现在时序能对得上了,可是接收到的数据是66 55 55 55 55 55.相应的i值是1h, 2h,2h, 2h, 2h, 2h,
发表于 2016-6-6 16:06:45 | 显示全部楼层
有些奇怪的问题肯定是有缘由的,一步一步认真找;
或者你可以改用状态机;
或者用其他方法,多试一下。
发表于 2016-6-6 18:51:30 | 显示全部楼层
i 没给初值吧。在reset中赋0.试试
发表于 2016-6-6 22:21:55 | 显示全部楼层
i的初始值没有看见在哪里?i的宽度对吗?
发表于 2016-6-7 09:03:31 | 显示全部楼层
你确定你的程序是完整的?仿真过?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-6 08:08 , Processed in 0.022977 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表