程序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="11111110"then
full<='1';
else full<='0';
end if;
else
if wr_compare="11111111"then
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得以实现,该电路软件仿真和硬件实现已经通过验证,并被应用到各种电路中。实践证明它可以解决由于异步产生的错误,同时增加了应用灵活性。
