单端口RAM的VHDL代码

此VHDL帖子介绍了 甚高密度脂蛋白代码 用于单端口RAM(随机存取存储器)。还提供了VHDL测试平台代码来测试单端口 内存 在Xilinx ISIM中。 内存 的大小为128x8位。

单端口RAM的VHDL代码

 如上图所示,在128x8单端口RAM中 甚高密度脂蛋白 具有以下输入和输出:

1. 内存 _CLOCK:时钟信号,用于将数据顺序写入单端口RAM。
2. 内存 _DATA_IN:启用后,将在提供的输入地址RAM_ADDR上将8位输入数据写入RAM。 
3. 内存 _WR:仅当RAM_WR = 1时,RAM_DATA_IN在时钟信号的上升沿写入RAM时,用于写入RAM的写使能信号。 
4. 内存 _ADDR:6位地址,在其中写入8位输入数据并读出数据。
5. 内存 _DATA_OUT:从提供的输入地址RAM_ADDR中读取的8位输出数据。

单端口的VHDL代码 内存 :

-- fpga4student.com: FPGA projects, Verilog projects, 甚高密度脂蛋白项目 
-- 甚高密度脂蛋白 project: 单端口RAM的VHDL代码 
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE ieee.numeric_std.ALL;

-- A 128x8 single-port 内存  in 甚高密度脂蛋白
entity Single_port_RAM_VHDL is
port(
 内存 _ADDR: in std_logic_vector(6 downto 0); -- Address to write/read 内存 
 内存 _DATA_IN: in std_logic_vector(7 downto 0); -- Data to write into 内存 
 内存 _WR: in std_logic; -- Write enable 
 内存 _CLOCK: in std_logic; -- clock input for 内存 
 内存 _DATA_OUT: out std_logic_vector(7 downto 0) -- Data output of 内存 
);
end Single_port_RAM_VHDL;

architecture Behavioral of Single_port_RAM_VHDL is
-- define the new type for the 128x8 内存  
type 内存 _ARRAY is array (0 to 127 ) of std_logic_vector (7 downto 0);
-- initial values in the 内存 
signal 内存 : 内存 _ARRAY :=(
   x"55",x"66",x"77",x"67",-- 0x00: 
   x"99",x"00",x"00",x"11",-- 0x04: 
   x"00",x"00",x"00",x"00",-- 0x08: 
   x"00",x"00",x"00",x"00",-- 0x0C: 
   x"00",x"00",x"00",x"00",-- 0x10: 
   x"00",x"00",x"00",x"00",-- 0x14: 
   x"00",x"00",x"00",x"00",-- 0x18: 
   x"00",x"00",x"00",x"00",-- 0x1C: 
   x"00",x"00",x"00",x"00",-- 0x20: 
   x"00",x"00",x"00",x"00",-- 0x24: 
   x"00",x"00",x"00",x"00",-- 0x28: 
   x"00",x"00",x"00",x"00",-- 0x2C: 
   x"00",x"00",x"00",x"00",-- 0x30: 
   x"00",x"00",x"00",x"00",-- 0x34: 
   x"00",x"00",x"00",x"00",-- 0x38: 
   x"00",x"00",x"00",x"00",-- 0x3C: 
   x"00",x"00",x"00",x"00",-- 0x40: 
   x"00",x"00",x"00",x"00",-- 0x44: 
   x"00",x"00",x"00",x"00",-- 0x48: 
   x"00",x"00",x"00",x"00",-- 0x4C: 
   x"00",x"00",x"00",x"00",-- 0x50: 
   x"00",x"00",x"00",x"00",-- 0x54: 
   x"00",x"00",x"00",x"00",-- 0x58: 
   x"00",x"00",x"00",x"00",-- 0x5C: 
   x"00",x"00",x"00",x"00",
   x"00",x"00",x"00",x"00",
   x"00",x"00",x"00",x"00",
   x"00",x"00",x"00",x"00",
   x"00",x"00",x"00",x"00",
   x"00",x"00",x"00",x"00",
   x"00",x"00",x"00",x"00",
   x"00",x"00",x"00",x"00"
   ); 
begin
process(RAM_CLOCK)
begin
 if(rising_edge(RAM_CLOCK)) then
 if(RAM_WR='1') then -- when write enable = 1, 
 -- write input data into 内存  at the provided address
 内存 (to_integer(unsigned(RAM_ADDR))) <= 内存 _DATA_IN;
 -- The index of the 内存  array type needs to be integer so
 -- converts 内存 _ADDR from std_logic_vector -> Unsigned -> Interger using numeric_std library
 end if;
 end if;
end process;
 -- Data to be read out 
 内存 _DATA_OUT <= 内存 (to_integer(unsigned(RAM_ADDR)));
end Behavioral;

单端口RAM的VHDL Testbench代码:

-- fpga4student.com: FPGA projects, Verilog projects, 甚高密度脂蛋白项目 
-- 甚高密度脂蛋白 project: 单端口RAM的VHDL代码 
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
-- 甚高密度脂蛋白 testbench code for the single-port 内存 
ENTITY tb_RAM_VHDL IS
END tb_RAM_VHDL;
 
ARCHITECTURE behavior OF tb_RAM_VHDL IS 
 
    -- Component Declaration for the single-port 内存  in 甚高密度脂蛋白
 
    COMPONENT Single_port_RAM_VHDL
    PORT(
         内存 _ADDR : IN  std_logic_vector(6 downto 0);
         内存 _DATA_IN : IN  std_logic_vector(7 downto 0);
         内存 _WR : IN  std_logic;
         内存 _CLOCK : IN  std_logic;
         内存 _DATA_OUT : OUT  std_logic_vector(7 downto 0)
        );
    END COMPONENT;
    

   --Inputs
   signal 内存 _ADDR : std_logic_vector(6 downto 0) := (others => '0');
   signal 内存 _DATA_IN : std_logic_vector(7 downto 0) := (others => '0');
   signal 内存 _WR : std_logic := '0';
   signal 内存 _CLOCK : std_logic := '0';

  --Outputs
   signal 内存 _DATA_OUT : std_logic_vector(7 downto 0);

   -- Clock period definitions
   constant 内存 _CLOCK_period : time := 10 ns;
 
BEGIN
 
 -- Instantiate the single-port 内存  in 甚高密度脂蛋白
   uut: Single_port_RAM_VHDL PORT MAP (
          内存 _ADDR => 内存 _ADDR,
          内存 _DATA_IN => 内存 _DATA_IN,
          内存 _WR => 内存 _WR,
          内存 _CLOCK => 内存 _CLOCK,
          内存 _DATA_OUT => 内存 _DATA_OUT
        );

   -- Clock process definitions
   内存 _CLOCK_process :process
   begin
  内存 _CLOCK <= '0';
  wait for 内存 _CLOCK_period/2;
  内存 _CLOCK <= '1';
  wait for 内存 _CLOCK_period/2;
   end process;

   stim_proc: process
   begin  
  内存 _WR <= '0'; 
  内存 _ADDR <= "0000000";
  内存 _DATA_IN <= x"FF";
      wait for 100 ns; 
  -- start reading data from 内存  
  for i in 0 to 5 loop
  内存 _ADDR <= 内存 _ADDR + "0000001";
      wait for 内存 _CLOCK_period*5;
  end loop;
  内存 _ADDR <= "0000000";
  内存 _WR <= '1';
  -- start writing to 内存 
  wait for 100 ns; 
  for i in 0 to 5 loop
  内存 _ADDR <= 内存 _ADDR + "0000001";
  内存 _DATA_IN <= 内存 _DATA_IN-x"01";
      wait for 内存 _CLOCK_period*5;
  end loop;  
  内存 _WR <= '0';
      wait;
   end process;

END;

甚高密度脂蛋白中单端口RAM的仿真波形:

单端口RAM的VHDL代码
仿真波形显示了VHDL中单端口RAM的正确写入和读取操作。单端口RAM的VHDL代码用于8位微控制器 这里.
FPGA Verilog 甚高密度脂蛋白课程

4条评论:

  1. 嗨,我有两个组件,一个组件必须使用ready,enable信号执行,如何执行?

    回复删除
    回覆
    1. 创建一个有限状态机来控制数据流。

      删除
  2. 嗨,Van Loi先生您的项目非常好,但是对我来说却很困难,因为我还有些项目'尚未了解它的操作原理。因此,它仅有的代码还不够。我希望您可以为每个项目提供更多的规范或操作原则。它'太棒了。非常感谢。

    回复删除

热门FPGA项目