How can I discribe a ROM in VHDL

 1 library ieee;
 2 use ieee.std_logic_1164.all;
 3 use ieee.numeric_std.all;
 4 
 5 entity single_port_rom is
 6 
 7   port
 8   (
 9     addr : in natural range 0 to 255;
10     clk  : in std_logic;
11     q    : out std_logic_vector(7 downto 0)
12   );
13 
14 end entity;
15 
16 architecture rtl of single_port_rom is
17 
18   -- Build a 2-D array type for the RoM
19   subtype word_t is std_logic_vector(7 downto 0);
20   type memory_t is array(255 downto 0) of word_t;
21 
22   function init_rom
23     return memory_t is
24     variable tmp : memory_t := (others => (others => '0'));
25   begin
26     for addr_pos in 0 to 255 loop
27         -- Initialize each address with the address itself
28       tmp(addr_pos) := std_logic_vector(to_unsigned(addr_pos, 8));
29     end loop;
30     return tmp;
31   end init_rom;
32 
33   -- Declare the ROM signal and specify a default value.  Quartus II
34   -- will create a memory initialization file (.mif) based on the 
35   -- default value.
36   signal rom : memory_t := init_rom;
37 
38 begin
 1 library ieee;
 2 use ieee.std_logic_1164.all;
 3 
 4 entity ROM is
 5   port ( address : in std_logic_vector(3 downto 0);
 6          data : out std_logic_vector(7 downto 0) );
 7 end entity ROM;
 8 
 9 architecture behavioral of ROM is
10   type mem is array ( 0 to 2**4 - 1) of std_logic_vector(7 downto 0);
11   constant my_Rom : mem := (
12     0  => "00000000",
13     1  => "00000001",
14     2  => "00000010",
15     3  => "00000011",
16     4  => "00000100",
17     5  => "11110000",
18     6  => "11110000",
19     7  => "11110000",
20     8  => "11110000",
21     9  => "11110000",
22     10 => "11110000",
23     11 => "11110000",
24     12 => "11110000",
25     13 => "11110000",
26     14 => "11110000",
27     15 => "11110000");
28 begin
29    process (address)
30    begin
31      case address is
32        when "0000" => data <= my_rom(0);
33        when "0001" => data <= my_rom(1);
34        when "0010" => data <= my_rom(2);
35        when "0011" => data <= my_rom(3);
36        when "0100" => data <= my_rom(4);
37        when "0101" => data <= my_rom(5);
38        when "0110" => data <= my_rom(6);
39        when "0111" => data <= my_rom(7);
40        when "1000" => data <= my_rom(8);
41        when "1001" => data <= my_rom(9);
42        when "1010" => data <= my_rom(10);
 1 library ieee;
 2 use ieee.std_logic_1164.all;
 3 use ieee.numeric_std.all;
 4 
 5 entity single_port_rom is
 6 
 7   generic
 8   (
 9     DATA_WIDTH : natural := 8;
10     ADDR_WIDTH : natural := 8
11   );
12 
13   port
14   (
15     clk  : in std_logic;
16     addr : in natural range 0 to 2**ADDR_WIDTH - 1;
17     q    : out std_logic_vector((DATA_WIDTH -1) downto 0)
18   );
19 
20 end entity;
21 
22 architecture rtl of single_port_rom is
23 
24   -- Build a 2-D array type for the RoM
25   subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0);
26   type memory_t is array(2**ADDR_WIDTH-1 downto 0) of word_t;
27 
28   function init_rom
29     return memory_t is 
30     variable tmp : memory_t := (others => (others => '0'));
31   begin
32     for addr_pos in 0 to 2**ADDR_WIDTH - 1 loop
33       -- Initialize each address with the address itself
34       tmp(addr_pos) := std_logic_vector(to_unsigned(addr_pos, DATA_WIDTH));
35     end loop;
36     return tmp;
37   end init_rom;
38 
39   -- Declare the ROM signal and specify a default value.  Quartus II
40   -- will create a memory initialization file (.mif) based on the 
41   -- default value.
42   signal rom : memory_t := init_rom;
43 
44 begin
45 
46   process(clk)
47   begin
48     if(rising_edge(clk)) then
49       q <= rom(addr);
50     end if;
51   end process;
52 
53 end rtl;

 1 --------------------------------------------------------------
 2 -- 32*8 ROM module (ESD Book Chapter 5)
 3 -- by Weijun Zhang, 04/2001
 4 --
 5 -- ROM model has predefined content for read only purpose
 6 --------------------------------------------------------------
 7 
 8 library ieee;
 9 use ieee.std_logic_1164.all;
10 use ieee.std_logic_arith.all;
11 use ieee.std_logic_unsigned.all;
12 
13 entity ROM is
14   port( Clock : in std_logic;
15     Reset    : in std_logic;
16     Enable   : in std_logic;
17     Read     : in std_logic;
18     Address  : in std_logic_vector(4 downto 0);
19     Data_out : out std_logic_vector(7 downto 0)
20   );
21 end ROM;
22 
23 --------------------------------------------------------------
24 
25 architecture Behav of ROM is
26 
27   type ROM_Array is array (0 to 31)
28 of std_logic_vector(7 downto 0);
29 
30   constant Content : ROM_Array := (
31     0      => "00000001",   -- Suppose ROM has
32     1      => "00000010",   -- prestored value
33     2      => "00000011",   -- like this table
34     3      => "00000100", --
35     4      => "00000101",   --
36     5      => "00000110", --
37     6      => "00000111",   --
38     7      => "00001000", --
39     8      => "00001001", --
40     9      => "00001010", --
41     10     => "00001011",  --
42     11     => "00001100", --
43     12     => "00001101", --
44     13     => "00001110",  --
45     14     => "00001111",  --
46     others => "11111111"   --
47   );
48 
49 begin
50   process(Clock, Reset, Read, Address)
51   begin
52     if( Reset = '1' ) then
53       Data_out <= "ZZZZZZZZ";
54     elsif( Clock'event and Clock = '1' ) then
55       if Enable = '1' then
56         if( Read = '1' ) then
57           Data_out <= Content(conv_integer(Address));
58         else
59           Data_out <= "ZZZZZZZZ";
60         end if;
61       end if;
62     end if;
63   end process;
64 end Behav;
43        when "1011" => data <= my_rom(11);
44        when "1100" => data <= my_rom(12);
45        when "1101" => data <= my_rom(13);
46        when "1110" => data <= my_rom(14);
47        when "1111" => data <= my_rom(15);
48        when others => data <= "00000000";
49      end case;
50   end process;
51 end architecture behavioral;


39 
40   process(clk)
41   begin
42     if(rising_edge(clk)) then
43       q <= rom(addr);
44     end if;
45   end process;
46 
47 end rtl;

原文地址:https://www.cnblogs.com/shangdawei/p/2495189.html