Перейти к содержанию
    

Инициализация памяти в VHDL (Quartus - ModelSim)

Всем привет!
Следующая проблема, я пытаюсь инициализировать память с помощью атрибутов:

    type memory is array (511 downto 0) of std_logic_vector (15 downto 0);
    signal ram_data: memory; 
    attribute ram_init_file : string;
    attribute ram_init_file of ram_data : signal is "mem.mif";
Он синтезирует память со следующими параметрами:

Info (12133): Instantiated megafunction "altsyncram:ram_data_rtl_0" with the following parameter:
    Info (12134): Parameter "OPERATION_MODE" = "ROM"
    Info (12134): Parameter "WIDTH_A" = "16"
    Info (12134): Parameter "WIDTHAD_A" = "9"
    Info (12134): Parameter "NUMWORDS_A" = "512"
    Info (12134): Parameter "OUTDATA_REG_A" = "UNREGISTERED"
    Info (12134): Parameter "ADDRESS_ACLR_A" = "NONE"
    Info (12134): Parameter "OUTDATA_ACLR_A" = "NONE"
    Info (12134): Parameter "INDATA_ACLR_A" = "NONE"
    Info (12134): Parameter "WRCONTROL_ACLR_A" = "NONE"
    Info (12134): Parameter "INIT_FILE" = "mem.mif"

И все было было бы хорошо, но в ModelSim вижу следующее:

image.thumb.png.60c6b057f24c35613396bf9f8536affe.png

Если задать память через мегафункции и там прописать файл инициализации, то все хорошо, но мне надо научиться через атрибуты. В чем проблемы?

Вот все библиотеки: 

library ieee;                                                                            
use ieee.std_logic_1164.all;                                                        
use ieee.std_logic_unsigned.all;                                                    
use ieee.std_logic_arith.all;
use ieee.math_real.all;

LIBRARY altera_mf;
USE altera_mf.altera_mf_components.all;

library altera;
use altera.altera_syn_attributes.all;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Скорее всего путь файла  ведет "на деревню к дедушке". Если путь к файлу не прописан или он относительный  то Modelsim  ищет такие файлы начиная с текущей рабочей папки сима. 

 

Удачи! Rob. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, RobFPGA сказал:

Приветствую!

Скорее всего путь файла  ведет "на деревню к дедушке". Если путь к файлу не прописан или он относительный  то Modelsim  ищет такие файлы начиная с текущей рабочей папки сима. 

 

Удачи! Rob. 

Спасибо за ответ!

Я указал путь к файлу в настройках quartus. Как мне прописать путь для modelsin? Я его запускаю прям через оболочку quartus

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!
 

Just now, mixa7109 said:

Спасибо за ответ!

Я указал путь к файлу в настройках quartus. Как мне прописать путь для modelsin? Я его запускаю прям через оболочку quartus

Увы не скажу - я не пользуюсь запуском сима напрямую из Qu.  :unknw:

Если  вы  задаете  путь  в RTL коде  то :
либо  указывайте полный абсолютный путь
либо  относительный к рабочей папке  запуска сима
либо  копируйте  эти фалы в рабочую папку  запуска сима

 

Удачи! Rob.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, RobFPGA сказал:

Приветствую!
 

Увы не скажу - я не пользуюсь запуском сима напрямую из Qu.  :unknw:

Если  вы  задаете  путь  в RTL коде  то :
либо  указывайте полный абсолютный путь
либо  относительный к рабочей папке  запуска сима
либо  копируйте  эти фалы в рабочую папку  запуска сима

 

Удачи! Rob.  

А где можно посмотреть информацию по альтернативному запуску modelsim?

Если есть время, то может опишите как запустить его подоугому?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, mixa7109 сказал:

А где можно посмотреть информацию по альтернативному запуску modelsim?

Если есть время, то может опишите как запустить его подоугому?


Альтернативный путь -- это как раз запуск его изо всяких сред. Нормальный путь -- это запуск непосредственно из ОС.

Абослютный путь к файлу -- это тупик. При переносе проекта на другую машину с другой структурой каталогов всё внезапно перестаёт работать.

Относительный путь должен быть одинаковым и для симулятора, и для синтезатора. Поэтому тут нужна соответствующая структура проекта.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, andrew_b сказал:


Альтернативный путь -- это как раз запуск его изо всяких сред. Нормальный путь -- это запуск непосредственно из ОС.

Абослютный путь к файлу -- это тупик. При переносе проекта на другую машину с другой структурой каталогов всё внезапно перестаёт работать.

Относительный путь должен быть одинаковым и для симулятора, и для синтезатора. Поэтому тут нужна соответствующая структура проекта.

 

Хорошо, а как прописать то путь к файлу для симулятора? Если я буду запускать по нормальному

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, mixa7109 сказал:

Хорошо, а как прописать то путь к файлу для симулятора?

"path/to/mem.mif"

Но я упустил один важный момент: атрибуты предназначены для синтеза. Симулятор их игнорирует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, andrew_b сказал:

"path/to/mem.mif"

Но я упустил один важный момент: атрибуты предназначены для синтеза. Симулятор их игнорирует.

Вау. А как тогда быть? Я прошерстил уже кучу сайтов и не могу найти ответ....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 минут назад, mixa7109 сказал:

Вау. А как тогда быть? Я прошерстил уже кучу сайтов и не могу найти ответ....

Пишите функцию, котора читает файл, и инициализируйте ею сигнал.

	type memory is array (511 downto 0) of std_logic_vector (15 downto 0);
	 
	function read_mif_file (file_name : string) return memory is
	begin
	    <function body>
	end;
	 
	signal ram_data: memory := read_mif_file ("path/to/mem.mif");
	

Реализацию функции можете подсмотреть в модели мегафункции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем, я решил. Все работает. Всем спасибо!
Может кому-то спасу пару часов жизни.....

Важно, работает только для фала формата .hex

 

DATAWIDTH - задается в generic. 

    library work;
    use work.Const_type.all;

    type memory is array (L - 1 downto 0) of std_logic_vector (DATAWIDTH - 1 downto 0);    
    impure function init_mem_hex(FileName  : in string) return memory is
        file data_init             : TEXT;
        variable buf             : line;
        variable mem_data            : memory := (others => (others => '0'));
        variable datain          : string(integer(DATAWIDTH / 4) downto 1);
    begin 
        FILE_OPEN(data_init, FileName, READ_MODE); 
            for i in 0 to L - 1 loop
                 READLINE(data_init, buf);
                if (buf(buf'LOW) = ':') then
                    shrink_line(buf, 9);
                    READ(L=>buf, VALUE=>datain);                         
                    mem_data(i) := CONV_STD_LOGIC_VECTOR(HEX_STR_TO_INT(datain), DATAWIDTH);        
                end if;
            end loop;
        return mem_data;
        FILE_CLOSE(data_init);
    end function;
--    
    signal     ram_data    :    memory := init_mem_hex("./mem_init.hex");

-----------------------------------------------------------

А это файл пакета функций.

ibrary ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use std.textio.all;   

package Const_type is

    type my_signal_one    is array(integer range<>) of std_logic;
    type my_vector_one    is array(integer range<>) of std_logic_vector;
    type my_vector_sec    is array(integer range<>, integer range<>) of std_logic_vector;
    
    procedure SHRINK_LINE (str_line : inout line; pos : in integer);
    
    function HEX_STR_TO_INT (str : in string) return integer;
    
end package;

package body Const_type is

function HEX_STR_TO_INT (str : in string) return integer is
variable len : integer := str'length;
variable ivalue : integer := 0;
variable digit : integer := 0;
begin
    for i in len downto 1 loop
        case str(i) is
            when '0' => digit := 0;
            when '1' => digit := 1;
            when '2' => digit := 2;
            when '3' => digit := 3;
            when '4' => digit := 4;
            when '5' => digit := 5;
            when '6' => digit := 6;
            when '7' => digit := 7;
            when '8' => digit := 8;
            when '9' => digit := 9;
            when 'A' => digit := 10;
            when 'a' => digit := 10;
            when 'B' => digit := 11;
            when 'b' => digit := 11;
            when 'C' => digit := 12;
            when 'c' => digit := 12;
            when 'D' => digit := 13;
            when 'd' => digit := 13;
            when 'E' => digit := 14;
            when 'e' => digit := 14;
            when 'F' => digit := 15;
            when 'f' => digit := 15;
            when others =>
                ASSERT FALSE
                REPORT "Illegal hex character "&  str(i) & "! "
                SEVERITY ERROR;
        end case;
        ivalue := ivalue * 16 + digit;
    end loop;
    return ivalue;
end HEX_STR_TO_INT;

procedure SHRINK_LINE (str_line : inout line; pos : in integer) is
subtype nstring is string(1 to pos);
variable str : nstring;
begin
    if (pos >= 1) then
        read(str_line, str);
    end if;
end;
    
end package body;

Изменено пользователем mixa7109

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...