微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > FIFO写时碰到的问题

FIFO写时碰到的问题

时间:10-02 整理:3721RD 点击:
我想往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;


这个程序非常简单,不过
1,FIFO并没有读;
2,你的问题应该是FIFO写出错;
3,没有看到i的定义;
至于为什么取数为什么出错,在线看一下i的值,一步一步找问题呗;
另外,你写数的时序明显没有对齐。



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


把i的值0,1,2,3,4,5,换成“000”,“001”,“010”,“011”,“100”,“101”试试;其实我也不能确定问题在哪里;
你不能看一下i的值吗?

时序对齐的话,可能方法比较多,
可以把wreq延时一个时钟,即在clk下打一拍送至fifo。



    我看了下i值,程序的变化是0h,1 h, 2h,其中2h占据了4个时钟,然后又变为0h。
    我把wr_req延迟一个时钟,然后现在时序能对得上了,可是接收到的数据是66 55 55 55 55 55.相应的i值是1h, 2h,2h, 2h, 2h, 2h,

有些奇怪的问题肯定是有缘由的,一步一步认真找;
或者你可以改用状态机;
或者用其他方法,多试一下。

i 没给初值吧。在reset中赋0.试试

i的初始值没有看见在哪里?i的宽度对吗?

你确定你的程序是完整的?仿真过?

把rtl描述称为程序。
不知道rtl描述的是什么电路。
不改的话,以后基本上很难了。

最近在研究SRAM读写问题,存入SRAM之前也需要FIFO进行数据缓存,能否加个好友共同学习。



   cnt_1s 25 比特 好像也不够啊

你这个程序可读性太差了,看了之后就没有去分析的欲望。

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

网站地图

Top