Jump to content

    
mixa7109

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

Recommended Posts

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

    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;

Share this post


Link to post
Share on other sites

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

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

 

Удачи! Rob. 

Share this post


Link to post
Share on other sites
3 минуты назад, RobFPGA сказал:

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

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

 

Удачи! Rob. 

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

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

Share this post


Link to post
Share on other sites

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

Just now, mixa7109 said:

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

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

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

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

 

Удачи! Rob.  

Share this post


Link to post
Share on other sites
21 минуту назад, RobFPGA сказал:

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

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

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

 

Удачи! Rob.  

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

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

Share this post


Link to post
Share on other sites
5 часов назад, mixa7109 сказал:

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

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


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

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

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

 

Share this post


Link to post
Share on other sites
5 часов назад, andrew_b сказал:


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

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

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

 

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

Share this post


Link to post
Share on other sites
2 часа назад, mixa7109 сказал:

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

"path/to/mem.mif"

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

Share this post


Link to post
Share on other sites
3 часа назад, andrew_b сказал:

"path/to/mem.mif"

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

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

Share this post


Link to post
Share on other sites
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");
	

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

Share this post


Link to post
Share on other sites

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

Важно, работает только для фала формата .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;

Edited by mixa7109

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.