A. fpga中fifo的大小为多少才不浪费存储器资源
FIFO设置的位宽和你选用的FPGA一致,就可以最大限度利用资源、。
B. 请问FIFO是什么意思
FIFO( First Input First Output)简单说就是指先进先出。由于微电子技术的飞速发展,新一代FIFO芯片容量越来越大,体积越来越小,价格越来越便宜。作为一种新型大规模集成电路,FIFO芯片以其灵
活、方便、高效的特性,逐渐在高速数据采集、高速数据处理、高速数据传输以及多机处理系统中得到越来越广泛的应用。
在系统设计中,以增加数据传输率、处理大量数据流、匹配具有不同传输率的系统为目的而广泛使用FIFO存储器,从而提高了系统性能。FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其
内的数据第一个被移出,其中一个存储器的输入口,另一个口是存储器的输出口。对于单片FIFO来说,主要有两种结构:触发导向结构和零导向传输结构。触发导向传输结构的FIFO是由寄存器阵列
构成的,零导向传输结构的FIFO是由具有读和写地址指针的双口RAM构成。
(2)FIFO存储器扩展阅读:
FIFO存储器是系统的缓冲环节,如果没有FIFO存储器,整个系统就不可能正常工作,它主要有几方面的功能:
1、对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;
2、数据集中起来进行进机和存储,可避免频繁的总线操作,减轻CPU的负担;
3、允许系统进行DMA操作,提高数据的传输速度。这是至关重要的一点,如果不采用DMA操作,数据传输将达不到传输要求,而且大大增加CPU的负担,无法同时完成数据的存储工作。
参考资料来源:网络-FIFO存储器
C. 立创商城的存储器怎么样FIFO存储器好用吗
质量还可以
D. FIFO和双口RAM有什么区别
在测控、仪器仪表、语音信号处理和图像通信领域中往往需要多处理器分工完成数字信号处理(DSP)算法和与外部系统的通信、控制、数据采集和人机接口功能。在多机系统中,CPU之间的通信常采用以下几种方式:(1)串行通信。这种方式相对简单,由于受到波特率的限制,在不同档次单片机之间需要通信业务大的场合得不到很好的通信效果。(2)并行通信。利用CPU的I/O功能在CPU之间增加缓冲器或锁存器实现双机通信。通信性能较串行通信有所提高,但仍然得不到理想的效果。(3)利用共享式存储器实现。DMA方式就是其中的一种,能够达到数据的高速传输,但不能同时访问存储器,CPU必须等待总线,而且有些CPU不支持DMA功能。另一种是利用多端口存储器,双口RAM和FIFO是常用的两种多端口的存储器,允许多CPU同时访问存储器,大大提高了通信效率,而且对CPU没有过多的要求,特别适合异种CPU之间异步高速系统中。因此,受到硬件设计者的青睐。
双口RAM是常见的共享式多端口存储器,以图1所示通用双口静态RAM为例来说明双口RAM的工作原理和仲裁逻辑控制。双口RAM最大的特点是存储数据共享。图1中,一个存储器配备两套独立的地址、数据和控制线,允许两个独立的CPU或控制器同时异步地访问存储单元。既然数据共享,就必须存在访问仲裁控制。内部仲裁逻辑控制提供以下功能:对同一地址单元访问的时序控制;存储单元数据块的访问权限分配;信令交换逻辑(例如中断信号)等。
FIFO(First In First Out)全称是先进先出的存储器。先进先出也是FIFO的主要特点。
FIFO只允许两端一个写,一个读,因此FIFO是一种半共享式存储器。在双机系统中,只允许一个CPU往FIFO写数据,另一个CPU从FIFO读数据。而且,只要注意标志输出,空指示不写,满指示不读,就不会发生写入数据丢失和读出数据无效。
本文介绍了以双口RAM和FIFO为例,利用多端口存储器设计多机系统。现对双口RA几FIFO比较如下:(1)FIFO的仲裁控制简单,但其容量不如双口RAM。由于先进先出的特点,特别适合数据缓冲和突发传送数据。某些芯片的内部就集成小容量FIFO,例如,DSP的同步串口就集成两个FIFO,用于接收和发送数据缓冲。双口RAM的仲裁逻辑比FIFO复杂,但其容量较
大。由于存储数据完全共享,适用于双机系统的全局存储器和大容量数据存储共享,例如大容量磁盘的数据缓存可采用双口RAM。(2)FIFO只给外部提供一个读和一个写信号,因此CPU用一个I/O地址便可读或写FIFO,使硬件趋于简单,给编程也带来一些方便,但CPU不能对FIFO内部的存储器进行寻址。双口RAM由于有两套地址线,使硬件较FIFO复杂,但允许CPU访问内部存储单元,因此CPU之间可以自己定主和分配数据块以及数据单元,使软件设计更加灵活。
在异种机系统设计中,利用双口RAM和FIFO能够实时、快速、灵活和方便地进行相互通信,得到满意的效果。
E. FIFO存储器代码
mole fifo(clock,reset,read,write,fifo_in,fifo_out,fifo_empty,fifo_half,fifo_full);
input clock,reset,read,write;
input [7:0] fifo_in;
output [7:0] fifo_out;
output fifo_empty,fifo_half,fifo_full; //表示存储单元使用情况的标志位
reg [7:0] fifo_out;
reg [2:0] read_ptr,write_ptr,counter; //读,写指针及计数器
reg [7:0] ram [7:0]; //8个8位的存储单元
wire fifo_empty,fifo_half,fifo_full;
always@(posedge clock) //复位信号有效时给系统复位
if (reset)
begin
read_ptr=0;
write_ptr=0;
counter=0;
fifo_out=0;
end
else //做读(数据输出),写(数据输入)操作
case({read,write})
2'b00: //没有读写指令
counter=counter;
2'b01: //写指令,数据输入FIFO
begin
ram[write_ptr]=fifo_in; //将输入数据写入存储单元
counter=counter+1; //每写入一个数就让计数器加1
write_ptr=(write_ptr==7)?0:write_ptr+1;
/*写指针加1,若指针指向最后一个存储单元(write_ptr==7),则把指针指向第一个存储单元*/
end
2'b10: //读指令,数据从FIFO输出
begin
fifo_out=ram[read_ptr]; //将存储单元的数据输出
counter=counter-1; //每读出一个数就让计数器减1
read_ptr=(read_ptr==7)?0:read_ptr+1;
/*读指针加1,若指针指向最后一个存储单元(read _ptr ==7),则把指针指向第一个存储单元*/
end
2'b11: //读写指令,同时做数据输入和输出
begin
if(counter==0) //存储单元是空的,所以当前输入数据可以直接输出
fifo_out=fifo_in;
else
begin
ram[write_ptr]=fifo_in;
fifo_out=ram[read_ptr];
write_ptr=(write_ptr==7)?0:write_ptr+1;
read_ptr=(read_ptr==7)?0:read_ptr+1;
end
end
endcase
assign fifo_empty=(counter==0); //存储单元都是空的时候将标志位fifo_empty置1
assign fifo_full=(counter==7); //存储单元都满了的情况下将标志位fifo_full置1
assign fifo_half=(counter==4); //存储单元占用了一半的时候将标志位fifo_half置1
endmole
F. 什么是FIFO
FIFO是First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。
是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单。
但缺点就是只能顺序写入数据,顺序读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
G. 求助!在用FPGA中得Block RAM制作FIFO存储器时,FIFO的读写时钟周期是不是固定的也就是说是由硬件定好了
设置FIFO读写周期是什么意思?控制FIFO的读写时钟?
为什么不通过控制读写使能信号来实现?
H. FIFO 控制器 的作用是什么
IFO 是先入先出存储器的缩写,FIFO 控制器在数字系统中被大量使用,可以作为数据缓存
使用。时钟同步的FIFO 控制器接口如下图所示,主要接口信号定义如下:
RST_N:异步复位信号,当RST_N 为低电平时,FULL 输出‘0’,EMPTY 信号输出‘1’
电平,FIFO 指针指向0,FIFO 被清空;
CLK:时钟信号,输出信号与CLK 信号同步;
DATAIN:数据输入信号,8 位总线;
RD:读有效信号,高电平有效,当RD 位高时,在时钟信号CLK 的上升沿,DATAOUT 输
出一个8 位的有效数据;
WR:写有效信号,当WR 为高电平时,在CLK 的上升沿,从DATAIN 信号向存储器写入
一个8 位的有效数据;
DATAOUT:数据输出信号,8 位总线,在CLK 的上升沿,当RD 为高电平时,从FIFO 中
输出一个8 位的数据;
FULL:存储器写满标志信号,高电平时表示存储器中的数据已经写满;
EMPTY:存储器读空标志信号,高电平时表示存储器中的数据已经被读空了。
要求:用Verilog 写一个8x16 的FIFO,完成先入先出的功能,并且在FIFO读空时输出EMPTY
有效信号,读指针RP 不再移动;FIFO 写满时输出FULL 有效信号,并且即使WR 有效也
不再向存储单元中写入数据(写指针WP 不再移动)。
存储单元使用一个二维数组来建模。注意存储单元的地址在读或者写到最高地址时要能回到
最低值。
写出合适的testbench 来测试所写的Verilog 代码,检验其正确性。
mole fifo_mem(data,clk,rstN,wrN,rdN,empty,full);
inout [7:0] data;
input clk,rstN,wrN,rdN;
output empty,full;
reg [4:0] _cntr,rd_cntr;
wire [3:0] add;
ram16X8 ram(.data(data),.addr(addr),.wrN(wrN),.oe(wrN));
always @(posedge clk or negedge rstN)
if(!rstN) wr_cntr<=0;
else if (!wrN) wr_cntr<=wr_cntr+1;
always @ (posedge clk or negedge rstN)
if(!rstN) rd_cntr<=0;
else if(!rdN) rd_cntr<=rd_cntr+1;
assign addr=wrN?rd_cntr [3:0]: wr_cntr [3:0];
assign empty=(wr_cntr [3:0] == rd_cntr [3:0])&&!(wr_cntr[4]^rd_cntr[4]);
assign full=(wr_cntr [3:0] ==rd_cntr [3:0])&&(wr_cntr[4]^rd_cntr[4]);
endmole
I. 什么是FIFO缓存队列
FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。 FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。 3.FIFO的一些重要参数 FIFO的宽度:也就是英文资料里常看到的THE WIDTH,它只的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM 32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。 FIFO的深度:THE DEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12 ,就可以存储12个8位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公式。在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。在一个具体的应用中也不可能由一些参数算数精确的所需FIFO深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的FIFO深度往往要大于计算值。一般来说根据电路的具体情况,在兼顾系统性能和FIFO成本的情况下估算一个大概的宽度和深度就可以了。而对于写速度慢于读速度的应用,FIFO的深度要根据读出的数据结构和读出数据的由那些具体的要求来确定。 满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。 空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。 读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。 写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。 读指针:指向下一个读出地址。读完后自动加1。 写指针:指向下一个要写入的地址的,写完自动加1。 读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。 4.FIFO的分类 根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。异步FIFO是指读写时钟不一致,读写时钟是互相独立的。 5.FIFO设计的难点 FIFO设计的难点在于怎样判断FIFO的空/满状态。为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。在空的状态下不能进行读操作。怎样判断FIFO的满/空就成了FIFO设计的核心问题。由于同步FIFO几乎很少用到,这里只描述异步FIFO的空/满标志产生问题。 补充: 在用到触发器的设计中,不可避免的会遇到亚稳态的问题(关于亚稳态这里不作介绍,可查看相关资料)。在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到最低。其中的一个方法就是使用格雷码。格雷码在相邻的两个码元之间只由一位变换(二进制码在很多情况下是很多码元在同时变化)。这就会避免计数器与时钟同步的时候发生亚稳态现象。但是格雷码有个缺点就是只能定义2^n的深度,而不能像二进制码那样随意的定义FIFO的深度,因为格雷码必须循环一个2^n,否则就不能保证两个相邻码元之间相差一位的条件,因此也就不是真正的各雷码了。第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为P,那么两个及联的触发器发生亚稳态的概率就为P的平方。但这回导致延时的增加。亚稳态的发生会使得FIFO出现错误,读/写时钟采样的地址指针会与真实的值之间不同,这就导致写入或读出的地址错误。由于考虑延时的作用,空/满标志的产生并不一定出现在FIFO真的空/满时才出现。可能FIFO还未空/满时就出现了空/满标志。这并没有什么不好,只要保证FIFO不出现overflow or underflow 就OK了。 很多关于FIFO的文章其实讨论的都是空/满标志的不同算法问题。 在Vijay A. Nebhrajani的《异步FIFO结构》一文中,作者提出了两个关于FIFO空/满标志的算法。 第一个算法:构造一个指针宽度为N+1,深度为2^N字节的FIFO(为便方比较将格雷码指针转换为二进制指针)。当指针的二进制码中最高位不一致而其它N位都相等时,FIFO为满(在Clifford E. Cummings的文章中以格雷码表示是前两位均不相同,而后两位LSB相同为满,这与换成二进制表示的MSB不同其他相同为满是一样的)。当指针完全相等时,FIFO为空。这也许不容易看出,举个例子说明一下:一个深度为8字节的FIFO怎样工作(使用已转换为二进制的指针)。FIFO_WIDTH=8, 补充: FIFO_DEPTH= 2^N = 8,N = 3,指针宽度为N+1=4。起初rd_ptr_bin和wr_ptr_bin均为“0000”。此时FIFO中写入8个字节的数据。wr_ptr_bin =“1000”,rd_ptr_bin=“0000”。当然,这就是满条件。现在,假设执行了8次的读操作,使得rd_ptr_bin =“1000”,这就是空条件。另外的8次写操作将使wr_ptr_bin 等于“0000”,但rd_ptr_bin 仍然等于“1000”,因此FIFO为满条件。 显然起始指针无需为“0000”。假设它为“0100”,并且FIFO为空,那么8个字节会使wr_ptr_bin =“1100”,, rd_ptr_bin 仍然为“0100”。这又说明FIFO为满。若写指针的高两位MSB大于读指针的高两位MSB则FIFO为“几乎空”。 在Vijay A. Nebhrajani的《异步FIFO结构》第三部分的文章中也提到了一种方法,那就是方向标志与门限。设定了FIFO容量的75%作为上限,设定FIFO容量的25%为下限。当方向标志超过门限便输出满/空标志,这与Clifford E. Cummings的文章中提到的STYLE #2可谓是异曲同工。他们都属于保守的空满判断。其实这时输出空满标志FIFO并不一定真的空/满。 说到此,我们已经清楚地看到,FIFO设计最关键的就是产生空/满标志的算法的不同产生了不同的FIFO。
J. 立创商城中的FIFO存储器好用吗
挺好用的,而且立创的品牌种类也比较多。