2017-03-28 24 views
0

vhdlでtextioパッケージを使用してイメージファイルを読み込もうとしています。 メモ帳で.jpgを開くと、私はいくつかの迷惑データを取得しますが、実際にはASCIIデータです。ここでは、これらのASCIIデータを読み込み、バイトに変換しようとしています。以下イメージファイルを読み込んでvhdlのビットに変換する方法

は私のコードです:

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

entity file_io is 

port (
    clk:    in std_logic; 
    Data:   out std_logic_vector(7 downto 0) 
); 
end entity; 

architecture behav of file_io is 

signal test_data : std_logic_vector(7 downto 0); 
use ieee.numeric_std.all; 
use std.textio.all; 
use ieee.std_logic_textio.all; 
begin 

File_reader:process(clk) 
    file f : text open read_mode is "C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"; 
    variable L: line; 
    variable var_int: integer:= 0; 
    variable var_char: character; 

begin 

if rising_edge(clk) then 
     while not endfile(f) loop 
       readline(f, L); 
     read(L, var_char); 
     var_int := character'pos(var_char); 
     test_data <= std_logic_vector(to_unsigned(var_int, test_data'length)); 
     end loop; 
    end if; 
    Data <= test_data; 
    end process; 
end architecture behav; 

テストベンチ:

LIBRARY ieee; 
use ieee.std_logic_1164.ALL; 
use std.textio.all; 

ENTITY file_io_test IS 
END file_io_test; 

ARCHITECTURE behavior OF file_io_test IS 
use work.io.all; 
    signal clk:   std_logic := '0'; 
    signal Data: std_logic_vector(7 downto 0); 

    -- Clock period definitions 
    constant clk_period : time := 10 ns; 

    BEGIN 
     -- Instantiate the Unit Under Test (UUT) 
    UUT: 
    entity work.file_io(behav) 
    port map (
      clk => clk, 
     Data => Data 
     ); 

    -- Clock process definitions(clock with 50% duty cycle is generated here. 
    clk_process :process 
     begin 
     clk <= '1'; 
     wait for clk_period/2; --for 5 ns signal is '1'. 
      clk <= '0'; 
     wait for clk_period/2; --for next 5 ns signal is '0'. 

    end process; 
    end behavior; 

私は波形の1バイトのみを取得しています。予想される結果は次のとおりです。クロックサイクルごとに新しいキャラクタがrreadされ、新しいバイトが取得される必要があります。 enter image description here

+0

IEEE Std 1076-2008 16.4パッケージTEXTIO para 4 "この言語は、行末の表現を定義していません。実装では、CHARACTERおよびSTRING型のすべての値をファイルに書き込むことができます。実装では、行区切り文字としてCHARACTERおよびSTRING型の特定の値を使用することが許可されています。これらの値をTEXTファイルから読み取ることはできません。 [スクリーンショット](https://i.stack.imgur.com/5z9oA.jpg) – user1155120

+1

誰があなたを落胆させたのか分かりませんが、質問を正しく聞いていると思います。 – JHBonarius

答えて

1

質問には基本的な欠陥があります。バイナリ値を読み取るためにtextioを使用することはできません。これはテキスト用です。

参照IEEE STD 1076年から2008年16.4パッケージTEXTIO段落3(一部)と4:

手順READLINE、WriteLineに、及びTEEは、タイプテキストファイルの行全体を読み書きTEXTIOパッケージ内で宣言。プロシージャREADLINEはファイルから次の行を読み込み、パラメータLの値としてその行を表すオブジェクトを指定するアクセス値を返します。パラメータLに呼び出しの開始時に非nullアクセス値が含まれる場合、プロシージャはその値で指定されたオブジェクトの割り当てを解除することがあります。 行の表現には、行の末尾の表現が含まれていません。 ...

この言語では、行末の表現は定義されていません。実装は、タイプCHARACTERとSTRINGのすべての可能な値がファイルに書き込まれるようにしなければならない。ただし、実装では、行区切り文字としてCHARACTERおよびSTRING型の特定の値を使用することが許可されているため、これらの値をTEXTファイルから読み取ることはできません。

そして、それはあなたのChrysanthemum.jpgで実証することができます。

Chrsanthemum read failure

VHDLで(あなたの必要性に合致する)一度、生の文字1を読み出すことが可能です。

参照IEEE STD 1076年から2008年5.5ファイルの種類: 5.5.jpg 5.5 cont.jpg

だから我々がしなければならないすべては、ファイルの種類を宣言し、私たちが暗黙的に定義され、これらの手順を取得することです。

我々はtextioによって引き起こされるラインの問題のいずれかの終了せず、生の読み取りを起動するためにそれらを使用することができます。私たちの読み取り中のラインショーアップを区切ることができるよりも

library ieee; 
use ieee.std_logic_1164.all; 

entity file_io is 
    port (
     clk: in std_logic; 
     Data: out std_logic_vector(7 downto 0); 
     done: out boolean 
); 
end entity; 

architecture foo of file_io is 
    use ieee.numeric_std.all; 
begin 

File_reader: 
    process (clk) 
     -- "C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"; 
     constant filename: string := "Chrysanthemum.jpg"; -- local to sim 
     variable char_val: character; 
     variable status: FILE_OPEN_STATUS; 
     variable openfile: boolean; -- FALSE by default 
     type f is file of character; 
     file ffile: f; 
     variable char_count: natural := 0; 
    begin 
     if rising_edge (clk) then 
      if not openfile then 
       file_open (status, ffile, filename, READ_MODE); 
       if status /= OPEN_OK then 
        report "FILE_OPEN_STATUS = " & 
          FILE_OPEN_STATUS'IMAGE(status) 
        severity FAILURE; 
       end if; 
       report "FILE_OPEN_STATUS = " & FILE_OPEN_STATUS'IMAGE(status); 
       openfile := TRUE; 
      else 
       if not endfile(ffile) then 
        read(ffile, char_val); 
        -- report "char_val = " & character'image(char_val); 
        char_count := char_count + 1; 
        Data <= std_logic_vector (
          to_unsigned(character'pos(char_val), 
          Data'length)); 
       end if; 
       if endfile(ffile) then -- can occur after last character 
        report "ENDFILE, read " & 
          integer'image(char_count) & "characters"; 
        done <= TRUE; 
        FILE_CLOSE(ffile); 
       end if; 
      end if; 
     end if; 
    end process; 
end architecture foo; 

library ieee; 
use ieee.std_logic_1164.all; 

entity file_io_test is 
end file_io_test; 

architecture behavior of file_io_test is 
    signal clk:   std_logic := '0'; 
    signal data:  std_logic_vector(7 downto 0); 
    signal done:  boolean; 
    constant clk_period: time := 10 ns; 
begin 
uut: 
    entity work.file_io(foo) 
     port map (
      clk => clk, 
      data => data, 
      done => done 
     ); 

clk_process: 
    process 
    begin 
     if not done then 
      clk <= '1'; 
      wait for clk_period/2; 
       clk <= '0'; 
      wait for clk_period/2; 
     else 
      wait; 
     end if; 
    end process; 
end architecture behavior; 

今、私たちは、すべての文字を持つことができます。

file_io_test_char_raw.png

パッケージstd.textioは、どのコンテキストアイテムでも表示されないことに注意してください。

1

あなたはあなたのプロセスのrising_edge一部の内部に配置されwhileループを持っている: enter image description here

下の私が読んしようとしているイメージがある:以下

は波形です。何が起こるのは、最初のクロックエッジが発生すると、whileループがファイルの最後まで繰り返して、入力イメージの最後のバイトを与えます。

whileループステートメントを削除すると、問題が解決するはずです。

+0

この回答は包括的ではなく、変更を示すものではありません。また、問題のために有用でもありません。バイナリ値の読み込みにはtextioを使用しないでください。これは、readlineがテキストファイルの行末を解釈しようとしているために発生します。 – user1155120

関連する問題