1

a : in std_logic_vector(5 downto 0)アクセスアドレスを宣言したROMを構築しようとしています。私の問題は、std_logic_vector を使用して ROM 配列にアクセスする方法がわからないことです。整数へのキャストを使用する必要がありますか、それとも他に何ができますか?

私のコード:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--------------------------------------------------------------------------------
entity imem is
    GENERIC(CONSTANT N : INTEGER := 32);
    port (a : in std_logic_vector(5 downto 0);
         result : out std_logic_vector(N-1 downto 0));
end imem;


architecture behavior of imem is
    signal addres : integer;
    type memory is array (0 to 64) of std_logic_vector(N-1 downto 0) ;
    constant myrom : memory := (
         2 => x"11111111" , --255
         3 => x"11010101" , 
         4 => x"01101000" , 
         6 => x"10011011" , 
         8 => x"01101101" , 
         9 => x"00110111" , 
         others => x"00000000" ) ;

begin 
    addres <= signed(a);
    result <= memory(addres);

end behavior;

示されているこのコードでは、次のエラーが発生します。

imem.vhd:25:21: can't match type conversion with type integer  
imem.vhd:25:21: (location of type conversion)
imem.vhd:26:21: conversion not allowed between not closely related types  
imem.vhd:26:21: can't match type conversion with type array type "std_logic_vector"
imem.vhd:26:21: (location of type conversion)
ghdl: compilation error  
4

2 に答える 2

2

それが符号なしのアドレス値であると仮定するとa、最初に符号なしにキャストし、次に整数にキャストする必要があります。は入力するのではなく、resultアクセスする必要があることに注意してください。コードは次のようになります。myrommemory

addres <= to_integer(unsigned(a));
result <= myrom(addres);

addresまた、中間シグナルをスキップして次のことを行うこともできます。

result <= myrom(to_integer(unsigned(a)));

6 ビット入力は 0 .. 63 のみをカバーでき、0 .. 64 はカバーできないため、型も必要以上に長くなります。型を宣言するより良い方法はmemory、次のように属性を使用することです。amemory'lengtha

type memory is array (0 to 2 ** a'length - 1) of std_logic_vector(N-1 downto 0);
于 2014-08-22T16:02:43.673 に答える
1

ghdl のセマンティクスは、デフォルトで厳密な -1993 であり、モートンの回答の変更に影響を与えます

為に:

type memory is array (0 to 2 ** a'length - 1) of 
        std_logic_vector(N-1 downto 0);

我々が得る:

ghdl -a imem.vhdl
imem.vhdl:15:29:警告: ユニバーサル整数バウンドは数値リテラルまたは属性でなければなりません

ghdlの作成者である Tristan Gingold は、2006 年の言語変更仕様につながるイシュー レポートを作成しました。これにより、当時の最新 (-2002 年) の実装に対して、式を含む範囲を 1 つのバインドとして整数範囲に変換できるものとして扱うことが明示的に許可されました。 bound はユニバーサル整数 (リテラル) です。LCS は、標準の以前のバージョンに準拠する実装で変換を行う許可を与えませんでした。Tristan のghdlは厳密にはここの本によるものであり、デフォルトでは -1993 に準拠しており、エラーが発生します。

エラーに対処するには 2 つの方法があります。分析中にghdlのコマンドラインオプションを使用して、範囲を整数型に変換できる標準のバージョンを指定するか、範囲を直接指定します。

ghdl --help-options から、次のことがわかります。

--std=87/93/00/02/08 vhdl 87/93/00/02/08 標準を選択

このコマンド ライン フラグは、ghdl -a --std=02 imem.vhdl のように渡すことができます。

また、範囲型は次のように直接宣言できます。

type memory is array (natural range 0 to 2 ** a'length - 1) of 
            std_logic_vector(N-1 downto 0);

タイプメモリを分析する両方の方法が機能します。

そして、これらすべての教訓は、VHDL が厳密に型付けされた言語であるということです。

ノート


  1. -2008 への準拠は、 ghdlの現在のバージョンでは完全には実装されていません。)
  2. とにかく変換​​をサポートするために標準を解釈するための歴史的なサポートがあります。LCS はあいまいさを克服します。
  3. IEEE Std 1076-1993 3.2.1.1 インデックスの制約と離散範囲のパラ 2 および IEEE Std-1076-2008 5.3.2.2 インデックスの制約と離散範囲のパラ 2 を参照してください。

  1. Tristan はその後、--std=オプションを変更して -2000 準拠を排除し、デフォルトの標準を 93cに変更しました。これにより、一連の標準緩和が導入され、VHDL ツール ベンダーの業界慣行により厳密に一致するようになりました。最新バージョンのghdlのユーザーは、 --std=93厳密な標準準拠のために使用できます。この問題はもともと、DAC が後援する VASG (VHDL 分析および標準化グループ) が、-1987 年以降に標準の解釈を発行することを許可されていないことにかかっていました。特定のリビジョンに完全に準拠する VHDL 標準の単一の実装は存在しないと言っても過言ではありません。
于 2014-08-22T21:07:14.740 に答える