FIFO内存的VHDL代码

根据某些读者的要求,我在此VHDL项目中为FIFO内存进行了VHDL代码(FIFO记忆的Verilog代码). 

FIFO 有16个8位数据宽度阶段和五个状态信号,包括溢出,下溢,空,完整和阈值。通过在Xilinx ISIM上进行混合语言仿真,通过相同的Verilog测试台码验证FIFO存储器的VHDL代码。 

FIFO内存的VHDL代码

FIFO的VHDL代码如下:

Library IEEE;
USE IEEE.Std_logic_1164.all;
-- FPGA projects using VHDL/ VHDL 
-- fpga4student.com
-- FIFO内存的VHDL代码
entity fifo_mem is 
   port(
      data_out : out std_logic_vector(7 downto 0);    
      fifo_full, fifo_empty, fifo_threshold, 
      fifo_overflow, fifo_underflow: out std_logic;
      clk :in std_logic;  
      rst_n: in std_logic;  
      wr :in  std_logic;
      rd: in std_logic;
      data_in: in std_logic_vector(7 downto 0)
   );
end fifo_mem;
architecture Behavioral of fifo_mem is  
component write_pointer
   port(
      wptr : out std_logic_vector(4 downto 0);    
   fifo_we: out std_logic;
      clk :in std_logic;  
   rst_n: in std_logic;  
      wr :in  std_logic;
   fifo_full: in std_logic
   );
end component;
component read_pointer
   port(
      rptr : out std_logic_vector(4 downto 0);    
   fifo_rd: out std_logic;
      clk :in std_logic;  
   rst_n: in std_logic;  
      rd :in  std_logic;
   fifo_empty: in std_logic
   );
end component;
component memory_array
   port(
      data_out : out std_logic_vector(7 downto 0);    
   rptr: in  std_logic_vector(4 downto 0);    
      clk :in std_logic;  
   fifo_we: in std_logic;  
      wptr :in  std_logic_vector(4 downto 0);    
   data_in: in std_logic_vector(7 downto 0)
   );
end component;
component status_signal
   port(
      fifo_full, fifo_empty, fifo_threshold: out std_logic;    
   fifo_overflow, fifo_underflow : out std_logic;    
      wr, rd, fifo_we, fifo_rd,clk,rst_n :in std_logic;  
      wptr, rptr: in  std_logic_vector(4 downto 0)
   );
end component;
  signal empty, full: std_logic;    
  signal wptr,rptr: std_logic_vector(4 downto 0);
  signal fifo_we,fifo_rd: std_logic;    
begin  

 write_pointer_unit: write_pointer port map 
      (   
          wptr => wptr, 
       fifo_we=> fifo_we, 
       wr=> wr,  
       fifo_full => full,
       clk => clk,
       rst_n => rst_n
      );
 read_pointer_unit: read_pointer port map 
      (
       rptr => rptr,
       fifo_rd => fifo_rd,
       rd => rd ,
       fifo_empty => empty,
       clk => clk,
       rst_n => rst_n
      );
 memory_array_unit: memory_array port map 
      (
       data_out => data_out,
       data_in => data_in,
       clk => clk,
       fifo_we => fifo_we,
       wptr => wptr,
       rptr => rptr
      );
 status_signal_unit: status_signal port map 
      (
       fifo_full => full,
       fifo_empty => empty,
       fifo_threshold => fifo_threshold,
       fifo_overflow => fifo_overflow, 
       fifo_underflow => fifo_underflow,
       wr => wr, 
       rd => rd, 
       fifo_we => fifo_we,
       fifo_rd => fifo_rd,
       wptr => wptr,
       rptr => rptr,
       clk => clk,
       rst_n => rst_n
      );
 fifo_empty <= empty;
 fifo_full <= full;
end Behavioral; 
Library IEEE;
USE IEEE.Std_logic_1164.all;
USE ieee.std_logic_arith.all;  
USE ieee.std_logic_unsigned.all;  
-- FPGA projects using VHDL/ VHDL 
-- fpga4student.com
-- FIFO内存的VHDL代码
-- status signals 
entity status_signal is 
   port(
      fifo_full, fifo_empty, fifo_threshold: out std_logic;    
   fifo_overflow, fifo_underflow : out std_logic;    
      wr, rd, fifo_we, fifo_rd,clk,rst_n :in std_logic;  
      wptr, rptr: in  std_logic_vector(4 downto 0)
   );
end status_signal;
architecture Behavioral of status_signal is  
  signal fbit_comp, overflow_set, underflow_set: std_logic;
  signal pointer_equal: std_logic;
  signal pointer_result:std_logic_vector(4 downto 0);
  signal full, empty: std_logic;
begin  
 
  fbit_comp <= wptr(4) xor rptr(4);
  pointer_equal <= '1' 
  when (wptr(3 downto 0) = rptr(3 downto 0)) else '0';
  pointer_result <= wptr - rptr;
  overflow_set <= full and wr;
  underflow_set <= empty and rd;
  full <= fbit_comp and  pointer_equal;
  empty <= (not fbit_comp) and  pointer_equal;
  fifo_threshold <=  '1' 
  when (pointer_result(4) or pointer_result(3))='1' else '0';
  fifo_full <= full;
  fifo_empty <= empty;
  process(clk,rst_n)
  begin
  if(rst_n='0') then 
 fifo_overflow <= '0';
  elsif(rising_edge(clk)) then 
     if ((overflow_set='1')and (fifo_rd='0')) then 
  fifo_overflow <='1';
  elsif(fifo_rd='1') then 
  fifo_overflow <= '0';
  end if;
  end if;
  end process;
  
  process(clk,rst_n)
  begin
  if(rst_n='0') then  
 fifo_underflow <='0';
  elsif(rising_edge(clk)) then
    if((underflow_set='1')and(fifo_we='0')) then
       fifo_underflow <='1';
    elsif(fifo_we='1') then 
      fifo_underflow <='0';
 end if;
   end if;
  end process;
end Behavioral; 

Library IEEE;
USE IEEE.Std_logic_1164.all;
USE ieee.numeric_std.ALL;
-- FPGA projects using VHDL/ VHDL 
-- fpga4student.com
-- FIFO内存的VHDL代码
-- Memory array 
entity memory_array is 
   port(
      data_out : out std_logic_vector(7 downto 0);    
   rptr: in  std_logic_vector(4 downto 0);    
      clk :in std_logic;  
   fifo_we: in std_logic;  
      wptr :in  std_logic_vector(4 downto 0);    
   data_in: in std_logic_vector(7 downto 0)
   );
end memory_array;
architecture Behavioral of memory_array is  
 type mem_array is array (0 to 15) of std_logic_vector(7 downto 0);
 signal data_out2: mem_array;
begin  
 
 process(clk)
 begin 
     if(rising_edge(clk)) then
   if(fifo_we='1') then 
          data_out2(to_integer(unsigned(wptr(3 downto 0)))) <= data_in; 
   end if;
  end if;      
 end process;  
 data_out <= data_out2(to_integer(unsigned(rptr(3 downto 0))));
 
end Behavioral; 

Library IEEE;
USE IEEE.Std_logic_1164.all;
USE ieee.std_logic_arith.all;  
USE ieee.std_logic_unsigned.all; 
 -- FPGA projects using VHDL/ VHDL 
-- fpga4student.com
-- FIFO内存的VHDL代码
-- Read pointer 
entity read_pointer is 
   port(
      rptr : out std_logic_vector(4 downto 0);    
   fifo_rd: out std_logic;
      clk :in std_logic;  
   rst_n: in std_logic;  
      rd :in  std_logic;
   fifo_empty: in std_logic
   );
end read_pointer;
architecture Behavioral of read_pointer is  
signal re: std_logic;
signal read_addr:std_logic_vector(4 downto 0);    
begin  
 rptr <= read_addr;
 fifo_rd <= re ;
 re <= (not fifo_empty) and rd;
 process(clk,rst_n)
 begin 
     if(rst_n='0') then 
   read_addr <= (others => '0');
     elsif(rising_edge(clk)) then
   if(re='1') then 
    read_addr <= read_addr + "00001"; 
   end if;
  end if;      
 end process;  
end Behavioral; 

Library IEEE;
USE IEEE.Std_logic_1164.all;
USE ieee.std_logic_arith.all;  
USE ieee.std_logic_unsigned.all; 
-- FPGA projects using VHDL/ VHDL 
-- fpga4student.com
-- FIFO内存的VHDL代码
-- Write pointer  
entity write_pointer is 
   port(
      wptr : out std_logic_vector(4 downto 0);    
   fifo_we: out std_logic;
      clk :in std_logic;  
   rst_n: in std_logic;  
      wr :in  std_logic;
   fifo_full: in std_logic
   );
end write_pointer;
architecture Behavioral of write_pointer is  
signal we: std_logic;
signal write_addr:std_logic_vector(4 downto 0);    
begin  
 fifo_we <= we;
 we <= (not fifo_full) and wr;
 wptr <= write_addr;
 process(clk,rst_n)
 begin 
     if(rst_n='0') then 
   write_addr <= (others => '0');
     elsif(rising_edge(clk)) then
   if(we='1') then 
    write_addr <= write_addr + "00001"; 
   end if;
  end if;      
 end process;  
end Behavioral; 

使用相同的测试台代码验证FIFO存储器的VHDL代码 前一篇文章。我使用Xilinx ISIM来运行混合语言仿真。 FIFO内存的VHDL代码的Verilog Testbench代码,您也可以下载 这里

运行模拟后,正确的结果应如下所示:
时间=                 110, data_out =   1, mem =   1
时间=                 120,WR = 1,RD = 0,data_in = 02
时间=                 130, data_out =   1, mem =   1
时间=                 140,WR = 0,RD = 0,data_in = 02
时间=                 150, data_out =   1, mem =   1
时间=                 170, data_out =   1, mem =   1
时间=                 190, data_out =   1, mem =   1
时间=                 190,WR = 1,RD = 0,data_in = 03
时间=                 210, data_out =   1, mem =   1
时间=                 210,WR = 0,RD = 0,data_in = 03
时间=                 230, data_out =   1, mem =   1
时间=                 250, data_out =   1, mem =   1
时间=                 260,WR = 1,RD = 0,DATA_IN = 04
时间=                 270, data_out =   1, mem =   1
时间=                 280,WR = 0,RD = 0,data_in = 04
时间=                 290, data_out =   1, mem =   1
时间=                 310, data_out =   1, mem =   1
时间=                 330, data_out =   1, mem =   1
时间=                 330,WR = 1,RD = 0,data_in = 05
时间=                 350, data_out =   1, mem =   1
时间=                 350,WR = 0,RD = 0,data_in = 05
时间=                 370, data_out =   1, mem =   1
时间=                 390, data_out =   1, mem =   1
时间=                 400,WR = 1,RD = 0,DATA_IN = 06
时间=                 410, data_out =   1, mem =   1
时间=                 420,WR = 0,RD = 0,data_in = 06
时间=                 430, data_out =   1, mem =   1
时间=                 450, data_out =   1, mem =   1
时间=                 470, data_out =   1, mem =   1
时间=                 470,WR = 1,RD = 0,DATA_IN = 07
时间=                 490, data_out =   1, mem =   1
时间=                 490,WR = 0,RD = 0,data_in = 07
时间=                 510, data_out =   1, mem =   1
时间=                 530, data_out =   1, mem =   1
时间=                 540,WR = 1,RD = 0,DATA_IN = 08
时间=                 550, data_out =   1, mem =   1
时间=                 560,WR = 0,RD = 0,data_in = 08
时间=                 570, data_out =   1, mem =   1
时间=                 590, data_out =   1, mem =   1
时间=                 610, data_out =   1, mem =   1
时间=                 610,WR = 1,RD = 0,DATA_IN = 09
时间=                 630, data_out =   1, mem =   1
时间=                 630,WR = 0,RD = 0,data_in = 09
时间=                 650, data_out =   1, mem =   1
时间=                 670, data_out =   1, mem =   1
时间=                 680,WR = 1,RD = 0,data_in = 0a
时间=                 690, data_out =   1, mem =   1
时间=                 700,WR = 0,RD = 0,data_in = 0a
时间=                 710, data_out =   1, mem =   1
时间=                 730, data_out =   1, mem =   1
时间=                 750, data_out =   1, mem =   1
时间=                 750,WR = 1,RD = 0,data_in = 0b
时间=                 770, data_out =   1, mem =   1
时间=                 770,WR = 0,RD = 0,data_in = 0b
时间=                 790, data_out =   1, mem =   1
时间=                 810, data_out =   1, mem =   1
时间=                 820,WR = 1,RD = 0,DATA_IN = 0C
时间=                 830, data_out =   1, mem =   1
时间=                 840,WR = 0,RD = 0,DATA_IN = 0C
时间=                 850, data_out =   1, mem =   1
时间=                 870, data_out =   1, mem =   1
时间=                 890, data_out =   1, mem =   1
时间=                 890,WR = 1,RD = 0,data_in = 0d
时间=                 910, data_out =   1, mem =   1
时间=                 910,WR = 0,RD = 0,data_in = 0d
时间=                 930, data_out =   1, mem =   1
时间=                 950, data_out =   1, mem =   1
时间=                 960,WR = 1,RD = 0,data_in = 0e
时间=                 970, data_out =   1, mem =   1
时间=                 980,WR = 0,RD = 0,data_in = 0e
时间=                 990, data_out =   1, mem =   1
时间=                1010, data_out =   1, mem =   1
时间=                1030, data_out =   1, mem =   1
时间=               1030,WR = 1,RD = 0,data_in = 0f
时间=                1050, data_out =   1, mem =   1
时间=               1050,WR = 0,RD = 0,data_in = 0f
时间=                1070, data_out =   1, mem =   1
时间=                1090, data_out =   1, mem =   1
时间=               1100,WR = 1,RD = 0,data_in = 10
时间=                1110, data_out =   1, mem =   1
时间=               1120,WR = 0,RD = 0,data_in = 10
时间=                1130, data_out =   1, mem =   1
时间=                1150, data_out =   1, mem =   1
时间=                1170, data_out =   1, mem =   1
时间=               1170,WR = 1,RD = 0,DATA_IN = 11
时间=                1190, data_out =   1, mem =   1
时间=               1190,WR = 0,RD = 0,DATA_IN = 11
时间=                1210, data_out =   1, mem =   1
时间=               1220,WR = 0,RD = 1,data_in = 11
时间=                1230, data_out =   1, mem =   1
通过------通过----------通过-------------通过
时间=               1240,WR = 0,RD = 0,data_in = 11
时间=                1250, data_out =   2, mem =   2
时间=               1260,WR = 0,RD = 1,data_in = 11
时间=                1270, data_out =   2, mem =   2
通过------通过----------通过-------------通过
时间=               1280,WR = 0,RD = 0,data_in = 11
时间=                1290, data_out =   3, mem =   3
时间=               1300,WR = 0,RD = 1,DATA_IN = 11
时间=                1310, data_out =   3, mem =   3
通过------通过----------通过-------------通过
时间=               1320,WR = 0,RD = 0,data_in = 11
时间=                1330, data_out =   4, mem =   4
时间=               1340,WR = 0,RD = 1,DATA_IN = 11
时间=                1350, data_out =   4, mem =   4
通过------通过----------通过-------------通过
时间=               1360,WR = 0,RD = 0,DATA_IN = 11
时间=                1370, data_out =   5, mem =   5
时间=               1380,WR = 0,RD = 1,data_in = 11
时间=                1390, data_out =   5, mem =   5
通过------通过----------通过-------------通过
时间=               1400,WR = 0,RD = 0,data_in = 11
时间=                1410, data_out =   6, mem =   6
时间=               1420,WR = 0,RD = 1,DATA_IN = 11
时间=                1430, data_out =   6, mem =   6
通过------通过----------通过-------------通过
时间=               1440,WR = 0,RD = 0,data_in = 11
时间=                1450, data_out =   7, mem =   7
时间=               1460,WR = 0,RD = 1,data_in = 11
时间=                1470, data_out =   7, mem =   7
通过------通过----------通过-------------通过
时间=               1480,WR = 0,RD = 0,data_in = 11
时间=                1490, data_out =   8, mem =   8
时间=               1500,WR = 0,RD = 1,data_in = 11
时间=                1510, data_out =   8, mem =   8
通过------通过----------通过-------------通过
时间=               1520,WR = 0,RD = 0,data_in = 11
时间=                1530, data_out =   9, mem =   9
时间=               1540,WR = 0,RD = 1,data_in = 11
时间=                1550, data_out =   9, mem =   9
通过------通过----------通过-------------通过
时间=               1560,WR = 0,RD = 0,DATA_IN = 11
时间=                1570, data_out =  10, mem =  10
时间=               1580,WR = 0,RD = 1,data_in = 11
时间=                1590, data_out =  10, mem =  10
通过------通过----------通过-------------通过
时间=               1600,WR = 0,RD = 0,data_in = 11
时间=                1610, data_out =  11, mem =  11
时间=               1620,WR = 0,RD = 1,data_in = 11
时间=                1630, data_out =  11, mem =  11
通过------通过----------通过-------------通过
时间=               1640,WR = 0,RD = 0,data_in = 11
时间=                1650, data_out =  12, mem =  12
时间=               1660,WR = 0,RD = 1,data_in = 11
时间=                1670, data_out =  12, mem =  12
通过------通过----------通过-------------通过
时间=               1680,WR = 0,RD = 0,data_in = 11
时间=                1690, data_out =  13, mem =  13
时间=               1700,WR = 0,RD = 1,data_in = 11
时间=                1710, data_out =  13, mem =  13
通过------通过----------通过-------------通过
时间=               1720,WR = 0,RD = 0,data_in = 11
时间=                1730, data_out =  14, mem =  14
时间=               1740,WR = 0,RD = 1,data_in = 11
时间=                1750, data_out =  14, mem =  14
通过------通过----------通过-------------通过
时间=               1760,WR = 0,RD = 0,data_in = 11
时间=                1770, data_out =  15, mem =  15
时间=               1780,WR = 0,RD = 1,data_in = 11
时间=                1790, data_out =  15, mem =  15
通过------通过----------通过-------------通过
时间=               1800,WR = 0,RD = 0,data_in = 11
时间=                1810, data_out =  16, mem =  16
时间=               1820,WR = 0,RD = 1,data_in = 11
时间=                1830, data_out =  16, mem =  16
通过------通过----------通过-------------通过

FIFO内存的模拟波形:

FIFO内存的VHDL代码
通过观察模拟波形和内存,很容易看出数据如何写入FIFO以及如何从FIFO读出数据。有人注意到,溢出,下溢,空,完整的状态信号非常重要,可以确定FIFO的正确性。
推荐的 VHDL项目:
1. 什么是FPGA? VHDL如何在FPGA上使用
2. FIFO内存的VHDL代码
3. FIR筛选器的VHDL代码
4. 8位微控制器的VHDL代码
5. 矩阵乘法的VHDL代码
6. 用于开关尾圈计数器的VHDL代码
7. FPGA上数字闹钟的VHDL代码
8. 8位比较器的VHDL代码
9. 如何使用VHDL将文本文件加载到FPGA中
10。 D触发器的VHDL代码
11.  完整加法器的VHDL代码
12. VHDL中的PWM发生器,具有可变占空比
13。 ALU的VHDL代码
14。 VHDL代码用于测试台的计数器
15。 16位ALU的VHDL代码
16。 vhdl的变速器设计
17。 VHDL中的非线性查找表实现
18。 VHDL中的加密协处理器设计

19。 Verilog vs vhdl.:通过示例解释
20。 FPGA时钟分频器的VHDL代码
21。 如何生成时钟使能信号而不是创建另一个时钟域
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
26。 使用FSM的停车系统VHDL码
27。 VHDL编码VS软件编程
FPGA Verilog VHDL课程

2评论:

  1. 你可以帮助我,我想要FIFO 7 * 7和路由器7 * 7的代码

    回复删除
  2. 您能否为FIFO提供硬件设计,以便更好地了解内存和内存元素

    回复删除

趋势FPGA项目