我设计一个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
楼主啊,这个代码在写下吧,读了5分钟,没看明白。
首先 FIFO 用来连接 USB 和 NIOS的纽带,既然是纽带,且是异步FIFO,
不要卡的那么近 控制上两头完全切开。
楼主直接用RAM吧,可靠性会上去一个级别。
USB的数据 BULK ISO都会有间隔,这个时间足够异步传递信息了。
MicroPython中文社区https://micropython.org.cn/forum/
reg [7:0] reg_buffer [0:63];
是不是这样直接用ram?
原理就是这样。
但我想这样需要数据保护, 得到64字节后,需要nios2 完全取走数据,如果来了新数据,必须等待。
整个机制实现起来有点麻烦。
用fifo 的话,可以不管这么多,只要空就可以写数据。
但我ip 口读取,可能要多几个T。担心数据没有上来。不知怎么控制。
楼主,早上好!
是直接调用双口RAM了。 如果你的NIOS时钟 和 USB数据交互的时钟一样的话。
FIFO有个 剩余数据counter,
可以利用这个,并且配合avalon 总线的 wait_request这个信号来使用。
T不要那么在意的吧,avalon 上不是有read data valid 这类的信号吗
MicroPython中文社区https://micropython.org.cn/forum/
我都做好了一个fifo 的 ip, 只能说编译好了。 可添加到qsys 还是加不上, Rstn 不能设置为reset.
我是说altera15下,
我把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 编辑
看来 ,我可能对fifo 的时序,把握不是很好。
不知道怎么查看ip 的时序图。
生成的时候,是可以看到的,但已有的ip 的不知怎么看到其时序图。
属性,只能看到引脚图。