2017-09-28 12 views
0
私がしようとしている

は、ポートで使用するタイプを宣言したが、私は問題 と思いVHDLパッケージとSTD_LOGIC_VECTOR

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.numeric_std.all; 
-- Custom types -- 
package Common is 
    type Mem_in is array (2**6 to 0) of STD_LOGIC_VECTOR (11 downto 0); 
    type DinDout is range 11 downto 0; 
end package Common ; 
-- Use Custom Type 
use work.Common.all; 

entity MUX is 

    Port (
     D  : in Mem_in; 
     Q  :   out DinDout; 
     SEL  :   in  STD_LOGIC_VECTOR (11 downto 0) 
     ); 
end MUX; 

STD_LOGIC_VECTORを使用できないのはなぜですか?私がDinDoutに変更した場合は、アーキテクチャ上の別の問題が発生します:to_integerは宣言されていません。索引付けされた名前はdindoutではありません。

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.numeric_std.all; 
-- Custom types -- 
package Common is 
    type Mem_in is array (2**6 to 0) of STD_LOGIC_VECTOR (11 downto 0); 
    type DinDout is range 11 downto 0; 
end package Common ; 

とエンティティ使用して、パッケージ共通:

-- Use Custom Type 
use work.Common.all; 

entity MUX is 

    Port (
     D  : in Mem_in; 
     Q  :   out DinDout; 
     SEL  :   in  DinDout 
     ); 
end MUX; 

architecture Arc of MUX is 
begin 
    Q <= D(to_integer(unsigned(SEL))); 
end Arc; 

どのように私は私のパッケージにSTD_LOGIC_VECTORを追加したり、これらの2つのエラーを解決することができます:to_integerが宣言されていません。索引付けされた名前は珍しいものではありませんか? (それはあなたが引用されている単一のファイルである場合)

おかげ

+0

上記のコンテキスト節のコンテキスト項目がないMUXエンティティ宣言に加えて、 'Mem_in'配列型は2 \ * \ * 6 + 1(2 \ * \ * 6 ** downto ** 0)の要素を持ちます。 SELのいくつかの値に対して制約違反を引き起こす2 \ * \ * DinDoutの長さではなく、同じ数の別個のインデックスを使用します。あなたのメモリサイズは、SELの長さに匹敵する2の累乗でなければなりません。非常に多くのビット(2 \ * \ * 6 + 1 * 12 - メモリ要素の長さまたは780)をポートに与えることは珍しいようです。このメモリ読み出しMUXは、ブロックメモリ。 – user1155120

+0

タイプDinDoutは、11downto 0の値域を持つ抽象的な数値型であり、D(to_integer(unsigned(SEL)))はインデックスの範囲が11downtoのstd_logic_vectorsの配列であるDのインデックス付き要素ですあなたの受け入れられた答えには対処していないことに注意してください* ...またはこれらの2つのエラーを解決してください:...索引付けされた名前はdindoutではありませんか*複数のエラーがあります – user1155120

答えて

2

あなたは一つのファイルに2つのライブラリ・ユニットを持っています。私は何が起こるかはわかりませんが、私はそれがすべてのユニットでコンテキストを再起動すると思います。

これは、 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.numeric_std.all; use work.Common.all;より前に繰り返す必要があることを意味します。

また、2**6 to 0はヌル範囲です。0 to 2**6または2**6 downto 0である必要があります。

+0

ここでの問題:D(to_integer(unsigned(SEL)));「インデックス付きの名前はdindoutではありません」と言います。たとえばMem_in(int(X))xが2 ** 6から0になるようにインデックスする方法は? – user169808