Altera_Forum
Honored Contributor
7 years agoTrouble populating memory from text file
Hello everyone, I need help populating my memory from a text file. Here is my RAM vhdl code:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE STD.TEXTIO.ALL;
-- Add a generic parameter
ENTITY rem_ram IS PORT (
address : IN std_logic_vector(7 DOWNTO 0);
read_data : OUT std_logic_vector(31 DOWNTO 0)
);
END ENTITY rem_ram;
ARCHITECTURE rtl OF rem_ram IS
TYPE ram_type IS ARRAY(0 TO (2**address'LENGTH)-1) OF std_logic_vector(read_data'RANGE);
FUNCTION init_rom RETURN ram_type IS
VARIABLE r : ram_type;
BEGIN
FOR i IN r'RANGE LOOP
r(i) := (OTHERS => '0');
END LOOP;
RETURN r;
END FUNCTION;
-- FILL MEMORY FROM TEXT FILE
FUNCTION fill_memory RETURN ram_type IS
VARIABLE mem : ram_type;
TYPE HexTable IS ARRAY (CHARACTER RANGE <>) OF INTEGER;
CONSTANT lookup : HexTable('0' TO 'F'):=
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1,
-1, -1, -1, -1, 10, 11, 12, 13, 14, 15);
FILE infile: text OPEN read_mode IS "mem_ram.txt";
VARIABLE buff: LINE;
VARIABLE addr_s: STRING(2 DOWNTO 1);
VARIABLE data_s : STRING(8 DOWNTO 1);
VARIABLE addr1, byte_cnt: INTEGER;
VARIABLE data: INTEGER RANGE 4294967295 DOWNTO 0;
BEGIN
WHILE (not endfile(infile)) LOOP
readline(infile, buff);
read(buff, addr_s);
read(buff, byte_cnt);
addr1 := lookup(addr_s(2))*16 + lookup(addr_s(1));
readline (infile, buff);
FOR i IN 1 TO byte_cnt LOOP
read(buff, data_s);
data := lookup(data_s(8))*268435456 + lookup(data_s(7))*16777216 + lookup(data_s(6))*1048576 +
lookup(data_s(5))*65536 + lookup(data_s(4))*4096 + lookup(data_s(3))*256 +
lookup(data_s(2))*16 + lookup(data_s(1));
mem(addr1) := CONV_STD_LOGIC_VECTOR(data, 32);
addr1 := addr1 + 1;
END LOOP;
END LOOP;
RETURN mem;
END FUNCTION;
SIGNAL ram : ram_type := fill_memory;
BEGIN
read_data <= ram(CONV_INTEGER(UNSIGNED(address)));
END ARCHITECTURE rtl;
and here is the text file:
00
8C020000
04
8C030001
08
00430820
0C
AC010003
10
1022FFFF
14
1021FFFA
I suspect that maybe there's an illegal (outside of the hex range) character in the .txt file but I don't see any. Maybe I need to save the text file in a different encoding format? Like ASCII or UTF-8? Thanks everyone!