1

私が持っているもの

可能な文字が「1」と「0」である1行のファイルがあるテストベンチを作成しようとしています。それらをすべて読み、DUT の入力として 1 つずつ使用する必要があります。

そのため、私の TB では、ファイルを読み取ってその値を DUT に渡すために、次のようなプロセスを定義しました。

stim_proc: process

 file input_file: TEXT is in "DatosEntrada.dat";

 variable rdline : LINE;
 variable line_content : string ( 1 to 4);
 variable readed_char : character;

 variable j : integer := 0;

begin       

 while not endfile(input_file) loop

   readline(input_file, rdline);

   --read(rdline, line_content);

   for j in 1 to rdline'length-1 loop

     readed_char := line_content(j);

     if (readed_char = '1') then
       input <= '1';
     else
       input <= '0'; 
     end if;

     wait for clk_period;

   end loop;

 end loop;

end process;

何が起こっていると思いますか

最初の実行でファイルの最初の (そして唯一の) 行を読んでいますreadline。その後、このループは再び実行されません。

次に、ファイルからのデータは内部にある必要がありますrdline。だから私はそれを処理しなければなりません。それを行うために、rdline長さを超えてループしようとしましたが、このループは実行されません。

for j in 1 to rdline'length-1 loop

そのため、ループするにはこの行を読み取る必要があると考え、そのデータをstring変数に移動しようとしました。問題は、文字列のようなベクトル var には定義されたサイズが必要であり、ファイルの行サイズがわからないことです

私は何を試しましたか

毎回4文字をrdline文字列に読み込み、処理してから繰り返すなど、さまざまな方法でそれを達成しようとしました。しかし、私はそれを機能させることができませんでした。

VHDL を使用したファイルの読み取りについて、Google で非常に多くの例を見つけましたが、それらはすべてほとんど同じであり、列や予想される整数などの行形式が定義されており、1 行の不明なテキストしかありません。

rdline何らかの方法で varから読み取ることで実現できると思いますが、実現できません。コーディングを手伝ってもらえますか?

前もって感謝します

4

1 に答える 1

3

あなたの例はMCVEではありません。

readed_char := line_content(j);line_content がロードされていない場合、これは機能しません。それ以外の場合、値を読み取ろうとする試みは基本的に健全です。

行末は読み取り LINE バッファーに含まれていません。rdline の最後の文字を読み取らない理由はありません。行の終わりは、水平タブ以外の 1 つ以上のフォーマット エフェクターによって通知され、行の内容だけが表示されます。

クロック周期だけでなく、クロックエッジと何らかの関係があるというこの推論もあります。次の例はそれを示しています。を使用してエッジからのオフセットを指定することもできますwait for time_value

ループ文でループ定数を宣言しています。j宣言した変数はj、ループが使用するものとは異なります。ループ ステートメントはj、外側の宣言領域 (プロセス ステートメント内の変数宣言) を非表示にします。

コードは、文字列バッファー内の '1' 以外の文字を '0' として扱います。私はそれを変更しませんでした、それを示してください。影響があることを認識しておく必要があります。

LINE は、読み取りファイルの行の長さに応じた長さの割り当てられた文字列です。readline を呼び出すたびに、rdline が指す文字列が更新されます。メモリ リークは発生しません。前のバッファ rdline が指していた解放済みバッファです。'RIGHT 属性を使用して長さを読み取るか、この場合のように単にすべての文字を消費することができます。

VHDL ツールの実装では、行の長さに制限がある場合があります。文字列の最大長 (POSITIVE'RIGHT) 以外に標準で定義されているものはありません。

MCVE:

library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;

entity foo is
end entity;

architecture fum of foo is
    signal input:           std_logic ;
    signal clk:             std_logic := '0';
    constant clk_period:    time := 10 ns;
begin

stim_proc: 
    process
        file input_file: TEXT is in "DatosEntrada.dat";
            variable rdline:    LINE;
            -- variable line_content : string ( 1 to 4);
            -- variable readed_char : character;
            -- variable j:         integer := 0;
    begin       
        while not endfile(input_file) loop
            readline(input_file, rdline);
            --read(rdline, line_content);
            -- for j in 1 to rdline'length - 1 loop -- EOL not in rdline
            for j in rdline'range loop
                -- readed_char := line_content(j);
                -- if readed_char = '1' then
                if rdline(j) = '1' then   -- changed
                    input <= '1';
                else
                    input <= '0'; 
                end if;
                -- wait for clk_period;  -- sync to edge instead
                wait until falling_edge(clk); -- input related to clk edge
            end loop;
        end loop;
        wait;     -- added prevents needless loops
    end process;

CLOCK:
    process
    begin
        wait for clk_period/2;
        clk <= not clk;
        if now > 32 * clk_period then
            wait;
        end if;
    end process;

end architecture;

また、以下を含む DatosEntrada.dat の場合:

11011110001HELLO11230000

それは以下を生成します:

foo.png

「1」以外のすべての文字が「0」として解釈されていることがわかります。

于 2016-02-04T20:21:33.997 に答える