library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity SYFIFO is
generic(FIFO_Depth : integer :=10; FIFO_Width : integer :=10);
port(
read_clock_in : in std_logic;
write_clock_in : in std_logic;
read_enable_in : in std_logic;
write_enable_in : in std_logic;
full_out : out std_logic;
empty_out: out std_logic;
reset_in : in std_logic;
write_data_in : in std_logic_vector(FIFO_Width-1 downto 0);
read_data_out : out std_logic_vector(FIFO_Width-1 downto 0));
end SYFIFO;
architecture FIFOArc of SYFIFO is
type BlockRam is array (0 to FIFO_Depth-1) of std_logic_vector(FIFO_Width-1 downto 0);
signal RAM : BlockRam;
signal read_clk : std_logic;
signal write_clk : std_logic;
signal read_enable : std_logic;
signal write_enable : std_logic;
signal full : std_logic;
signal empty : std_logic;
signal reset : std_logic;
signal read_addr : integer range 0 to FIFO_Depth-1;--std_logic_vector(9 downto 0);
signal write_addr : integer range 0 to FIFO_Depth-1;--std_logic_vector(9 downto 0);
begin
read_enable <= read_enable_in;
write_enable <= write_enable_in;
read_clk <= read_clock_in;
write_clk <= write_clock_in;
full_out <= full;
empty_out <= empty;
reset <= reset_in;
-------------------------------------------------------
--读地址指针信号的产生
-------------------------------------------------------
proc1:process(read_clk,reset)
begin
if (reset='1') then
read_addr <= FIFO_Depth-1;
elsif (read_clk'event and read_clk='1') then
if (read_enable='1' and empty='0') then
if (read_addr=FIFO_Depth-1) then
read_addr<=0;
else
read_addr <= read_addr+1;
end if;
end if;
end if;
end process proc1;
-------------------------------------------------------
--写地址指针信号的产生
-------------------------------------------------------
proc2:process(write_clk,reset)
begin
if (reset='1') then
write_addr <= 0;
elsif (write_clk'event and write_clk='1') then
if (write_enable='1' and full='0') then
if(write_addr=FIFO_Depth-1) then
write_addr <=0;
else
write_addr <= write_addr+1;
end if;
end if;
end if;
end process proc2;
--------------------------------------------------------
---读操作
--------------------------------------------------------
proc3:process(read_clk)
begin
if (read_clk'event and read_clk='1') then
if (read_enable='1' and empty='0') then
read_data_out <= RAM(read_addr);
end if;
end if;
end process proc3;
-------------------------------------------------------
----写操作
--------------------------------------------------------
proc4:process(write_clk)
begin
if (write_clk'event and write_clk='1') then
if (write_enable='1' and full='0') then
RAM(write_addr) <= write_data_in;
end if;
end if;
end process proc4;
------------------------------------------------------
--空标志和读使能信号的产生
------------------------------------------------------
proc5:process(read_clk,reset)
begin
if (reset='1') then
empty <= '1';
read_enable <= '0';
elsif (read_clk'event and read_clk='1') then
if ((read_addr=write_addr-2 or (read_addr=FIFO_Depth-1 and write_addr=1) or (read_addr=FIFO_Depth-2 and write_addr=0)) and (read_enable='0' and write_enable='1')) then
empty <='1';
read_enable <= '0';
elsif (empty='1' and write_enable='0') then
empty <='0';
read_enable <= '1';
end if;
end if;
end process proc5;
------------------------------------------------------
--满标志和写使能信号的产生
------------------------------------------------------
proc6:process(write_clk,reset)
begin
if (reset='1') then
full <= '0';
write_enable <= '0';
elsif (write_clk'event and write_clk='1') then
if (read_addr=write_addr and read_enable='1' and write_enable='0') then
full <='1';
write_enable <= '0';
elsif (full='1' and read_enable='0') then
full <='0';
write_enable <= '1';
end if;
end if;
end process proc6;
---------------------------------------------------------
---输出空满标志信号
---------------------------------------------------------
proc7:process(write_clk)
begin
if (write_clk'event and write_clk='1') then
full_out <= full;
empty_out <= empty;
end if;
end process proc7;
end FIFOArc;
,这个程序不能综合,急急急!!!!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |