ROM(定数使用)

掲載ページ:148、リスト番号:6.10

【VHDL記述】


library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_unsigned.all;


entity ROM is -- 記憶容量 2**AL(words)

generic( WL : integer := 8; -- ワード長(bits)

AL : integer := 4 ); -- アドレスバス長(bits)

port( RE : in std_logic;

ADDR : in std_logic_vector(AL-1 downto 0);

DATA_OUT : out std_logic_vector(WL-1 downto 0));

end ROM;


architecture BEHAVIOR of ROM is


subtype WORD is std_logic_vector(WL-1 downto 0);

type MEMORY is array ( 0 to 2**AL-1 ) of WORD;

constant MEM : MEMORY := (

"01101100", "10000000", "01100010", "00000000",

"10110001", "10101010", "00000001", "00110011",

"00000100", "01110100", "10000001", "00001111",

"00000000", "00000000", "00000000", "00000000" );


begin

READ_OP: process( RE, ADDR ) begin

if ( RE = '1' ) then

DATA_OUT <= MEM(conv_integer(ADDR));

end if;

end process;

end BEHAVIOR;

【Verilog-HDL記述】


module ROM (

RE, ADDR,

DATA_OUT

);

// 記憶容量 2**AL(words)

parameter WL = 8; // ワード長(bits)

parameter AL = 4; // アドレスバス長(bits)

input RE;

input[ AL-1 : 0 ] ADDR;

output[ WL-1 : 0 ] DATA_OUT;


reg[ WL-1 : 0 ] DATA_OUT;


always @ ( RE or ADDR ) begin : READ_OP

if ( RE ) begin

DATA_OUT <= FUNC_MEM( ADDR );

end

end


function[ WL-1 : 0 ] FUNC_MEM;

input[ AL-1 : 0 ] ADDR;

begin

case ( ADDR )

0: FUNC_MEM = 'b01101100;

1: FUNC_MEM = 'b10000000;

2: FUNC_MEM = 'b01100010;

3: FUNC_MEM = 'b00000000;

4: FUNC_MEM = 'b10110001;

5: FUNC_MEM = 'b10101010;

6: FUNC_MEM = 'b00000001;

7: FUNC_MEM = 'b00110011;

8: FUNC_MEM = 'b00000100;

9: FUNC_MEM = 'b01110100;

10: FUNC_MEM = 'b10000001;

11: FUNC_MEM = 'b00001111;

12: FUNC_MEM = 'b00000000;

13: FUNC_MEM = 'b00000000;

14: FUNC_MEM = 'b00000000;

15: FUNC_MEM = 'b00000000;

endcase

end

endfunction

endmodule

【合成結果(WL=8, AL=4 の場合)】