3

Quartus が RAM を正常に認識し、RAM メガファンクションをインスタンス化するエンティティを作成しました。そのRAMをファイルから初期化できればいいのですが。そのようなファイル (.mif ファイル) を作成するためのチュートリアルを見つけました。そのファイルを作成したので、Quartus にそのモジュールを初期化させる方法がわかりません。どんな助けでも大歓迎です。

ここに私のRAMエンティティがあります:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity RAM is
    port (
        clk: in std_logic;
        we: in std_logic;
        data_in: in std_logic_vector (7 downto 0);
        read_addr: in integer range 0 to 65535;
        write_addr: in integer range 0 to 65535;
        data_out: out std_logic_vector (7 downto 0)
    );
end entity RAM;

architecture RAM_arch of RAM is
type memory is array (65535 downto 0) of std_logic_vector (7 downto 0);
signal content: memory;     
begin
    process(clk)
    begin
        if (RISING_EDGE(clk)) then
            if (we = '1') then
                content(write_addr) <= data_in;
            end if;
            data_out <= content(read_addr);
        end if;
    end process;
end architecture;
4

5 に答える 5

3

おそらく、メモリを初期化する最良の方法は...メモリ変数に初期化句を配置することです。.MIF ファイルをロードする Quartus 固有の方法があるかもしれませんが、ファイル フォーマットを定義できるため、.mif を生成する必要がないため、おそらくより簡単で、確実に移植性が高く (ザイリンクスなどに)、より柔軟です。ファイル。

次のコードがあるとします。

type memory is array (65535 downto 0) of std_logic_vector (7 downto 0);
signal content: memory; 

あなたは単に書くことができます

type memory is array (65535 downto 0) of std_logic_vector (7 downto 0);
signal content: memory := init_my_RAM(filename => "ram_contents.txt"); 

Quartus がこの方法での初期化をサポートしていない可能性はありますが、実際のファイルの内容を無視して単純な init_my_ram 関数を記述してテストできます。

function init_my_ram (filename : string) return memory is
variable f : file;
variable m : memory;
begin
   file_open(f, filename, read_mode);
   for i in memory'range loop
      m(i) := X"55";
   end loop;
   file_close(f);
   return m;
end init_my_ram;

関数呼び出しは初期化子であり、デザインが合成されるエラボレーション時に呼び出されるため、これはすべて合成可能です。

これがコンパイルされ、Quartus が X"55" でいっぱいのメモリを生成する場合は、init_my_ram 関数で必要なファイル形式を解析する準備ができています。(バイナリ ファイルは難しく、リーダー コードはツール間であまり移植できないかもしれませんが、不可能ではありません)。

ただし、.MIF アプローチには潜在的な利点が 1 つあります。別の合成/配置配線サイクルを必要とせずに、メモリの内容だけを更新できます。

于 2013-11-03T09:57:23.820 に答える
2

初期化の最も簡単な方法は、メモ帳などの簡単なエディタで .mif を書き込むことです。以下の .mif リストは、マルチプレクサとしての ROM デコーダ用です。6 ビット アドレス 64 ビット データ。.mif には、8、16、32、64 ビットなどの任意のデータ ワード サイズを、16 進またはバイナリの両方で含めることができます。常に動作します。ファイルはプロジェクトと同じディレクトリにある必要があります。

WIDTH=64;
DEPTH=128;
ADDRESS_RADIX=HEX;
DATA_RADIX=HEX;

CONTENT BEGIN

000  :   0000000000000001;-- 0
001  :   0000000000000002;-- 1    
002  :   0000000000000004;-- 2
003  :   0000000000000008;-- 3
004  :   0000000000000010;-- 4
005  :   0000000000000020;-- 5
006  :   0000000000000040;-- 6
007  :   0000000000000080;-- 7
008  :   0000000000000100;-- 8
009  :   0000000000000200;-- 9
00A  :   0000000000000400;-- 10
00B  :   0000000000000800;-- 11
00C  :   0000000000001000;-- 12
00D  :   0000000000002000;-- 13
00E  :   0000000000004000;-- 14
00F  :   0000000000008000;-- 15
010  :   0000000000010000;-- 16
011  :   0000000000020000;-- 17
012  :   0000000000040000;-- 18
013  :   0000000000080000;-- 19
014  :   0000000000100000;-- 20
015  :   0000000000200000;-- 21
016  :   0000000000400000;-- 22
017  :   0000000000800000;-- 23
018  :   0000000001000000;-- 24
019  :   0000000002000000;-- 25
01A  :   0000000004000000;-- 26
01B  :   0000000008000000;-- 27
01C  :   0000000010000000;-- 28
01D  :   0000000020000000;-- 29
01E  :   0000000040000000;-- 30
01F  :   0000000080000000;-- 31
020  :   0000000100000000;-- 32
021  :   0000000200000000;-- 33
022  :   0000000400000000;-- 34
023  :   0000000800000000;-- 35
024  :   0000001000000000;-- 36
025  :   0000002000000000;-- 37
026  :   0000004000000000;-- 38
027  :   0000008000000000;-- 39
028  :   0000010000000000;-- 40
029  :   0000020000000000;-- 41
02A  :   0000040000000000;-- 42
02B  :   0000080000000000;-- 43
02C  :   0000100000000000;-- 44
02D  :   0000200000000000;-- 45
02E  :   0000400000000000;-- 46
02F  :   0000800000000000;-- 47
030  :   0001000000000000;-- 48
031  :   0002000000000000;-- 49
032  :   0004000000000000;-- 50
033  :   0008000000000000;-- 51
034  :   0010000000000000;-- 52
035  :   0020000000000000;-- 53
036  :   0040000000000000;-- 54
037  :   0080000000000000;-- 55
038  :   0100000000000000;-- 56
039  :   0200000000000000;-- 57
03A  :   0400000000000000;-- 58
03B  :   0800000000000000;-- 59
03C  :   1000000000000000;-- 60
03D  :   2000000000000000;-- 61
03E  :   4000000000000000;-- 62
03F  :   8000000000000000;-- 63

[40..7F]  :   0000000000000000;
END;
于 2020-06-05T14:52:06.443 に答える
1

このドキュメントで指定されているように、これはファイルからメモリを初期化する適切な方法です。

signal content: memory;
attribute ram_init_file : string;
attribute ram_init_file of content:
signal is "init.mif";
于 2013-11-03T11:14:58.960 に答える
1

ウィザードを使用して RAM モジュールの 1 つを生成したが、それにメモリ初期化ファイルを追加するのを忘れた場合は、次の手順を実行して後で追加できます。

Tools > MegaWizard Plug-In Manager > Edit an existing custom megafunction variation > {Select your file} > Next > Mem Init > Yes, use this file for the memory content data > Browse

于 2017-03-13T14:04:11.593 に答える