3705|6

91

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

ip 和 fifo 怎么联合使用? [复制链接]

 我设计一个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
此帖出自Altera SoC论坛

最新回复

楼主,早上好! 是直接调用双口RAM了。 如果你的NIOS时钟  和  USB数据交互的时钟一样的话。 FIFO有个 剩余数据counter, 可以利用这个,并且配合avalon 总线的 wait_request这个信号来使用。 T不要那么在意的吧,avalon 上不是有read data valid 这类的信号吗  详情 回复 发表于 2016-8-7 07:36
点赞 关注
 
 

回复
举报

1950

帖子

4

TA的资源

版主

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

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

楼主直接用RAM吧,可靠性会上去一个级别。
USB的数据 BULK ISO都会有间隔,这个时间足够异步传递信息了。
此帖出自Altera SoC论坛
个人签名MicroPython中文社区https://micropython.org.cn/forum/  
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
reg                [7:0]        reg_buffer [0:63];
是不是这样直接用ram?
原理就是这样。
但我想这样需要数据保护, 得到64字节后,需要nios2 完全取走数据,如果来了新数据,必须等待。
整个机制实现起来有点麻烦。
用fifo 的话,可以不管这么多,只要空就可以写数据。
但我ip 口读取,可能要多几个T。担心数据没有上来。不知怎么控制。
此帖出自Altera SoC论坛
 
 
 

回复

1950

帖子

4

TA的资源

版主

4
 
楼主,早上好!

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

FIFO有个 剩余数据counter,
可以利用这个,并且配合avalon 总线的 wait_request这个信号来使用。
T不要那么在意的吧,avalon 上不是有read data valid 这类的信号吗
此帖出自Altera SoC论坛
个人签名MicroPython中文社区https://micropython.org.cn/forum/  
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(中级)

5
 
我都做好了一个fifo 的 ip, 只能说编译好了。 可添加到qsys 还是加不上, Rstn 不能设置为reset.
我是说altera15下,

QsysNewIp.png (33.01 KB, 下载次数: 0)

QsysNewIp.png
此帖出自Altera SoC论坛
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(中级)

6
 
本帖最后由 liwenz 于 2016-8-9 00:13 编辑

我把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

从程序看,我没有写那么多字节呀
此帖出自Altera SoC论坛
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(中级)

7
 
看来 ,我可能对fifo 的时序,把握不是很好。
不知道怎么查看ip 的时序图。
生成的时候,是可以看到的,但已有的ip 的不知怎么看到其时序图。
属性,只能看到引脚图。
此帖出自Altera SoC论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表