2017-10-31 1 views
3

こんにちはにおけるテキストファイルの内容によってコードセグメントが交換してください回避策。、</p> <p>を私の質問を読んでくれてありがとうは私がやろうとしていることは可能であるならば、私は知らない、またはそれは愚かで、簡単にがある場合はVHDL

私は、FIRフィルタの束を持っています、それらのすべてが異なる係数を持っています。だから私は事は、私は、テキストファイルからファイルに自分自身をすべての私の係数をコピーする必要があり、この方法を実行している...そして、それは私が必要な場合は特に長くて退屈だ

 package coeff_list is 
      Type Coeff_type is array (0 to (((FIR_length - 1)/2))) of STD_LOGIC_VECTOR(17 downto 0);  
      CONSTANT Coeff_50_100 : Coeff_type := ("list of coefficients"); 
      CONSTANT Coeff_100_150 : Coeff_type := ("other list of coefficients"); 
      ---- and many other lists similarly declared 
     end package coeff_list; 

のような宣言とパッケージファイルを作成しました後でそれらを変更する。

私の質問は...コマンドやテキストファイルを取ってVHDLコードのブロックとして扱うものはありますか?

私はtestbenchでファイルを読み込む方法を知っていますが、シミュレーション中にパラメータを読み込むのは簡単ですが、私の係数を最初からプリロードしたいと思います。

私はその事をグーグルで試してみましたが、関連するものは何も見つかりませんでした。おそらく正しい質問をしませんでした。とにかく、私はここにいる。助けてくれてありがとう、私は質問が理にかなってほしい。

+0

... [または特殊なバイナリ形式を使用しないでVHDL/modelsimでバイナリデータを読み取るにはどうすればいいですか?](https://stackoverflow.com/questions/14173652/how-can-i-read-binary-data-in -vhdl-modelsim-whithout-using-special-binary-format)...等 – JHBonarius

+0

* [vhdl]不純な関数textio *で検索すると、この質問ではない1つの候補が表示され、答えはtextioを示しません。 (不正な関数を使用しないファイルから定数に値を提供する方法や、不正な関数を使用してVHDLに同じ型の別のオブジェクトの値を指定する方法はありません)。上記のコメントに記載された重複候補も参照も、プロセスステートメントの実行中にオブジェクトの値を導出する、不純な関数を使用することを提案しません。 – user1155120

+0

私が探していたものは、テストベンチで使われたコードではうまく動作しなかったことを明示的に指摘して以来、このケースでは "テキストファイルを読み込みVHDLで"どのように役立つか分かりません。おそらく、不純な機能の使用は誰にとっても明らかです。私にとってはそうではありませんでした。したがって、実際に質問を読んで、別の問題の答えへのリンクを貼り付けるのではなく、実際の説明を提供するuser1155120には多くの感謝があります。 – Floflow

答えて

3

あなたはホストファイルシステム内のファイルからの読み取りにTextIOを使用して、不純な機能と配列型のCoeff_typeのあなたの定数の値を提供することができます。名前のファイルについて

library ieee; 
use ieee.std_logic_1164.all; 

package coeff_list is 
    constant FIR_length: natural := 17; -- ADDED demo purposes 

    Type Coeff_type is array (0 to (((FIR_length - 1)/2))) of 
              STD_LOGIC_VECTOR(17 downto 0); 

    --ADDED: 
    impure function InitRomFromFile (RomFileNAme: in string) 
      return Coeff_type; 

    -- CONSTANT Coeff_50_100 : Coeff_type := ("list of coefficients"); 

    constant Coeff_50_100: Coeff_type := InitRomFromFile("file_path_name1"); 

    -- CONSTANT Coeff_100_150 : Coeff_type := ("other list of coefficients"); 

    -- constant Coeff_100_150: Coeff_type := ("file_path_name2"); 

    ---- and many other lists similarly declared 

end package coeff_list; 

package body coeff_list is 

    impure function InitRomFromFile (RomFileName: in string) -- ADDED 
      return Coeff_type is 
     use std.TextIO.all; 
     FILE romfile: text open read_mode is romfileName; 
     variable RomFileLine: line; 
     variable rom:   Coeff_type; 
     variable rom_value:  bit_vector(17 downto 0); 
    begin 
     for i in 0 to (FIR_Length - 1)/2 loop 
      if ENDFILE(romfile) then -- can get ordered shorter list 
       rom(i) := (others => '0'); 
      else 
       readline(romfile, RomFileLine); 
       read(RomFileLine, rom_value); 
       rom(i) := to_stdlogicvector(rom_value); 
      end if; 
     end loop; 
     return rom; 
    end function; 
end package body; 

がで発見されましたimpuew機能InitRomFromFileに文字列RomFileName:

100000000000000000 
000000000111111111 
001111111111111000 
010101010101010101 
110011001100110011 
001110011100111001 

あなたはと証明することができます

係数は0から配列順にファイルからロードされ、供給された値の数ではない場合れる留意
coeff_list.vhdl:70:9:@0ms:(report note): Coeff_50_100 contains 
coeff_list.vhdl:72:13:@0ms:(report note):  100000000000000000 
coeff_list.vhdl:72:13:@0ms:(report note):  000000000111111111 
coeff_list.vhdl:72:13:@0ms:(report note):  001111111111111000 
coeff_list.vhdl:72:13:@0ms:(report note):  010101010101010101 
coeff_list.vhdl:72:13:@0ms:(report note):  110011001100110011 
coeff_list.vhdl:72:13:@0ms:(report note):  001110011100111001 
coeff_list.vhdl:72:13:@0ms:(report note):  000000000000000000 
coeff_list.vhdl:72:13:@0ms:(report note):  000000000000000000 
coeff_list.vhdl:72:13:@0ms:(report note):  000000000000000000 

:分析した場合、生成精緻化及びシミュレート

library ieee; 
use ieee.std_logic_1164.all; 
use work.coeff_list.all; 

entity foo is 
end entity; 

architecture fum of foo is 
    -- if not VHDL-2008: 
    function to_string (inp: std_logic_vector) return string is 
     variable image_str: string (1 to inp'length); 
     alias input_str: std_logic_vector (1 to inp'length) is inp; 
    begin 
     for i in input_str'range loop 
      image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i))); 
     end loop; 
     return image_str; 
    end function; 
begin 
    process 
    begin 
     report "Coeff_50_100 contains"; 
     for i in Coeff_50_100'RANGE loop 
      report HT & to_string(Coeff_50_100(i)); 
     end loop; 
     wait; 
    end process; 
end architecture; 

ENDFILE(romfile)がtrueを返すかどうかを評価することで、デフォルト値を十分に満たすことができます。

また、係数を数値リテラルとして読み込み、関数のターゲットタイプの要素タイプに変換することもできます。

+0

ありがとう、あなたのコードをはるかに快適にします。 FPGAでコードを実装しようとすると、係数も実装されるか、これはシミュレーション目的でのみ機能するのでしょうか? – Floflow

+0

詳細は定数の値が割り当てられています。ほとんどの合成ツールは、定数の配列を精緻化するためにTextIOをサポートしています。あなたの合成ベンダーのツールドキュメントがその権限です。トピックは、ROMと同様にRAMを含むメモリの初期化です。 – user1155120

関連する問題

 関連する問題