关键词:FIFO
双口RAM 格雷码 VHDL
FIFO(先进先出行列)是一种在电子体系得到广泛使用的器材,一般用于数据的缓存和用于包容异步信号的频率或相位的差异。FIFO的完成一般是使用双口RAM和读写地址发生模块来完成的。FIFO的接口信号包含异步的写时钟(wr_clk)和读时钟(rd_clk)、与写时钟同步的写有用(wren)和写数据(wr_data)、与读时钟同步的读有用(rden)和读数据(rd_data)。为了完成正确的读写和防止FIFO的上溢或下溢,一般还应该给出与读时钟和写时钟同步的FIFO的空标志(empty)和满标志(full)以制止读写操作。
1 异步FIFO功用描绘
图1给出了FIFO的接口信号和内部模块图。
由图1能够看出,写地址发生模块依据写时钟和写有用信号发生递加的写地睛,读地址发生模块依据读时钟和读有用信号发生递加的读地址。FIFO的操作如下:在写时钟wr_clk的升沿,当wren有用时,将wr_data写入双口RAM中写地址对应的方位中;始终将读地址对应的双口RAM中的数据输出到读数据总线上。这样就完成了先进先出的功用。
写地址发生模块还依据读地址和写地址联系发生FIFO的满标志。当wren有用时,若写地址+2=读地址时,full为1;当wren无效时,若写地址+1=读地址时,full为1。读地址发生模块还依据读地址和写地址的差发生FIFO的空标志。当rden有用时,若写地址-1=读地址时,empty为1;当rden无效时,若写地址=读地址时,empty为1。依照以上方法发生标志信号是为了提早一个时钟周期发生对应的标志信号。
因为空标志和满标志操控了FIFO的操作,因而标志过错会引起操作的过错。如上所述,标志的发生是经过对读写地址的比较发生的,当读写时钟彻底异步时,对读写地址进行比较时,或许得出过错的成果。例如,在读地址改变过程中,因为读地址的各位改变并不同步,核算读写地址的差值,或许发生过错的差值,导致发生过错的满标志信号。若将未满标志置为满标志时,或许下降了使用的功能,下降写数据速率;而将满置标志置为未满时,履行一次写操作,则或许发生溢出过错,这关于实践使用来说是肯定应该防止的。空标志信号的发生也或许发生相似的过错。
2 异步FIFO的改善规划
从以上剖析中能够看出,异步FIFO之所以会发生过错是国为在地址改变时,因为多位地址各位改变时刻不同,异步时钟对其进行采样时数值或许为不同于地址改变丧后数值的其他值,异步发生过错的空标志和满标志,以致于发生FIFO的操作过错。
格雷码是一种在相邻计数值之间只要一位发生改变的编码方法。能够看出,若读写地址选用格雷码编码方法,就能够处理上面的问题。
为了使用的灵敏,还增加了两个标志信号,将满(almosf_full)标志和空(almost_empty)标志别离界说如下:当写地址与读地址的间隔小于某个预先界说数值时,almost_full为1;当读地址与写地址的间隔小于这个预先界说的数值时,almost_empty为1。
3 异步FIFO的VHDL完成
硬件描绘言语VHDL(Very-high speed %&&&&&%
Hardware Description Language)是一种使用于电路规划的高层次描绘言语,具有行为级、寄存器传输级和门级等多层次描绘,而且具有简略、易读、易修正和与工艺无关等长处。现在VHDL言语现已得到多种EDA东西的支撑,归纳东西得到迅速发展,VHDL言语的行为级归纳也现已得到支撑和完成,因而使用VHDL言语进行电路规划能够节省开发本钱和周期。
首要给出格雷码和一般自然码之间的转化模块的VHDL程序。
程序1:自然码码到格雷码的转化程序
entity norm_to_gery is
generic(width:integer:=8);
port(
din:in std_logic_vector(width-1 downto 0);
dout:out std_logic_vector(width-1 downto 0);
end norm_to_grey;
architecture norm_to_grey of norm_to_grey is
begin
dout=din xor(‘0’ din(width-1 downto
1));
end norm_to_grey;
程序2:格雷码到自然码的转化程序
process(din)
variable tempd:std_logic;
begin
for i in width-1 downto 0 loop tempd:=’0′;
for j in width-1 downto i loop tempd:=tempd
xor din(j);
end loop;
dout(i)=tempd;
end loop;
end process;
在给出异步FIFO的VHDL程序之前,先给出一些内部信号的解说:
wadd ——自然码写地址
wadd_grey ——格雷码写地址
wr_radd_grey ——写时钟采样的格雷码读地址
wr_radd ——写时钟采样的自然码读地址
almost_length ——发生将满和将空标志的予界说读写地址差值
程序3:写地址发生模块,此程序一起发生写地址的自然码和格雷码
waddp=wadd+1;
u1:norm_to_grey
port map(waddp,wadd_grey_temp);
wadd_process:process(clr,wr_clk)
begin
if clr=’0’then
wadd=(others=>’0′);
wadd_grey=(others=>’0′);
elsif wr_clk’event and wr_clk=’1’then
if wren=’1’then
wadd=waddp;
wadd_grey=wadd_grey_temp;
end if;
end if;
end process;
程序4:满标志和满标志发生模块,以8位地址为例。
u2:grey_to_norm
port map(wr_radd_grey,wr_radd_temp);
process(clr,wr_clk~
begin
if clr=’0’then
wr_radd_grey=(others=>’0′);
wr_radd=(Others=>’0′)
elsif wr_clk’event and wr_clk=’1’then
wr_radd_grey=radd_grey;
wr_radd=wr_radd_temp;
end if;
end process;
wr_compare=wadd-wr_radd;
full_process:process(clr,wr_clk)
begin
if clr=’0’then
full=’0’;
elsif wr_clk’event and wr_clk=’1’then
if(wren=’1′)then
if wr_compare=11111110then
full=’1′;
else full=’0′;
end if;
else
if wr_compare=11111111then
full=’1′;
else full=’0′;
end if;
end if;
end if;
end process;
almost_full_process:process(clr,wr_clk)
begin
if clr=’0′ then
almost_full=’0′;
elsif wr_clk’event and wr_clk=’1’then
if(wren=’1′)then
if wr_compare>(11111110-almost_length)then
almost_full=’1′;
else almost_full=’0′;
end if;
else
if wr_compare>(11111111-almost_length)then
almost_full=’1′;
else almost_full=’0′;
end if;
end if;
end if;
end process;
读地址的发生模块和空标志及空标志的发生模块与写地址模块相似。
4 定论
为了处理FIFO的异步操作问题,本文提出了一种使用格雷码对地址进行编码的异步FIFO的规划,并选用VHDL言语进行电路规划,使用Altera公司FLEX10KE系列FPGA得以完成,该电路软件仿真和硬件完成现现已过验证,并被使用到各种电路中。实践证明它能够处理因为异步发生的过错,一起增加了使用灵敏性。