[FPGA开发] ip 和 fifo 怎么联合使用?

liwenz   2016-8-6 20:10 楼主
我设计一个ip (avalon 接口),我打算使用2个fifo, 一个用于写入,一个用于读取。

比如usb, 这个ip 功能就是来了数据,就放fifo里, nios2 检测not IsEmpty, 就读取fifo, 数据发送就相反。

问题是读取fifo的时候需要有时序操作,主要是: rdreq, wrreq,这样的话,直接用avalon 接口读取,和写入有几个T 的延迟。

是不是有这问题,怎么处理好呢?



下面是一个串口例子中 写fifo 的过程:



  always @ ( posedge CLK or negedge RSTn )
      if( !RSTn )
        begin
        i <= 2'd0;
      isWrite <= 1'b0;
      isRX <= 1'b0;
      end
    else
        case( i )
        0:
      if( RX_Done_Sig ) begin isRX <= 1'b0; i <= i + 1'b1; end
      else isRX <= 1'b1;
      1:      if( !Full_Sig ) i <= i + 1'b1;
      2:      begin isWrite <= 1'b1; i <= i + 1'b1; end
      3:     begin isWrite <= 1'b0; i <= 2'd0; end
    endcase

回复评论 (6)

楼主啊,这个代码在写下吧,读了5分钟,没看明白。

首先 FIFO 用来连接 USB 和  NIOS的纽带,既然是纽带,且是异步FIFO,
不要卡的那么近 控制上两头完全切开。

楼主直接用RAM吧,可靠性会上去一个级别。
USB的数据 BULK ISO都会有间隔,这个时间足够异步传递信息了。
MicroPython中文社区https://micropython.org.cn/forum/  
点赞  2016-8-6 22:11
reg                [7:0]        reg_buffer [0:63];
是不是这样直接用ram?
原理就是这样。
但我想这样需要数据保护, 得到64字节后,需要nios2 完全取走数据,如果来了新数据,必须等待。
整个机制实现起来有点麻烦。
用fifo 的话,可以不管这么多,只要空就可以写数据。
但我ip 口读取,可能要多几个T。担心数据没有上来。不知怎么控制。
点赞  2016-8-7 01:09
楼主,早上好!

是直接调用双口RAM了。 如果你的NIOS时钟  和  USB数据交互的时钟一样的话。

FIFO有个 剩余数据counter,
可以利用这个,并且配合avalon 总线的 wait_request这个信号来使用。
T不要那么在意的吧,avalon 上不是有read data valid 这类的信号吗
MicroPython中文社区https://micropython.org.cn/forum/  
点赞  2016-8-7 07:36
我都做好了一个fifo 的 ip, 只能说编译好了。 可添加到qsys 还是加不上, Rstn 不能设置为reset.
我是说altera15下,
  • QsysNewIp.png
点赞  2016-8-8 20:57
我把reset 名称由 RSTn 改为reset 就可以识别了。 其实也可以自己添加归类 达到同样目的,但我不知道怎么类的名字。 现在就是结果不对,全都是0. 是不是reset 有方向需要设置,比如低位复位信号。 目前显示是这样的: data2=0, status=0,count=0 data2=0, status=0,count=0 data2=0, status=0,count=0, Rdata=0; data2 中间输出, status 2个isEmpty, isFull. count 确实那个reset 应该设置为reset_n, 但结果还是 不怎么好 init:data2=0, status=9,count=0 data2=0, status=9,count=0 data2=0, status=9,count=0 data2=0, status=9,count=0, Rdata=0; 程序是这样的: int main() { unsigned char status,Rdata,data2,count; printf("Hello from Nios II and alter15B!\n"); data2=FIFOT->inter; status=FIFOT->status; count=FIFOT->count; printf("init: data2=%x,status=%x, count=%x\n",data2,status,count); FIFOT->status=0x0; FIFOT->data =0x01; FIFOT->data =0x12; FIFOT->data =0x23; FIFOT->data =0x34; FIFOT->data =0x45; FIFOT->data =0x56; // data2=FIFOT->inter; status=FIFOT->status; count=FIFOT->count; printf("data2=%x,status=%x, count=%x\n",data2,status,count); FIFOT->status=0x01; //control data2=FIFOT->inter; status=FIFOT->status; count=FIFOT->count; printf("data2=%x,status=%x, count=%x\n",data2,status,count); Rdata=FIFOT->data; data2=FIFOT->inter; status=FIFOT->status; count=FIFOT->count; printf("data2=%x,status=%x, count=%x,Rdata=%x\n",data2,status,count,Rdata); return 0; } 状态字部分是: if(address==2'b0)begin //status readdata[0] <=Empty_Sig1; readdata[1] <=Empty_Sig2; readdata[2] <=Full_Sig1; readdata[3] <=Full_Sig2; end 9的意思是: 第一个是Empty,第2个是full else begin //count readdata[3:0] <=fifo_num1; readdata[7:4] <=fifo_num2; end 从程序看,我没有写那么多字节呀 本帖最后由 liwenz 于 2016-8-9 00:13 编辑
点赞  2016-8-9 00:08
看来 ,我可能对fifo 的时序,把握不是很好。
不知道怎么查看ip 的时序图。
生成的时候,是可以看到的,但已有的ip 的不知怎么看到其时序图。
属性,只能看到引脚图。
点赞  2016-8-9 09:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复