2017-09-13 3 views
1

私は一緒に属している(同じクロックでサンプリングされていますが)論理的に既存の部分のベクトル(つまりパラレルバスではありません)コードを変更する必要があります。ほとんどの意図や目的、配列とベクトルはかなり扱うことができるためVHDL:std_logicの配列の使用とstd_logic_vectorのサブタイプの使用

subtype my_subtype is std_logic_vector(my_width - 1 downto 0); 
signal my_signal : my_subtype; 


以前、彼らは今まで

type my_type is array (my_width - 1 downto 0) of std_logic; 
signal my_signal : my_type; 

として定義されていた、この目的のために、私はいつもこれを使用します同じですので、私の質問は:
何かのやり方に利点はありますか?優先/標準の方法がありますか?

+3

どちらも機能します。 'ieee.std_logic_1164'パッケージの中の' std_logic_vector'で宣言されたすべての演算子と機能にアクセスできるようになります。もう1つはあなた自身で作成しテストする必要があるということです。それは思いがけないものです。 –

+2

信号はパラレルバスではありませんが、それらは同じ種類のもののコレクションを表していますか?たとえば、8つのステータスLEDは、一貫した「バイト」として解釈されないかもしれませんが、少なくともすべてのステータスLEDです。例えば、書き込み許可、リセット、クロックなど、異なる種類のものについては、ベクトルの代わりにこれらをレコードに入れることができます。 –

+0

@scary_jeffステータスLEDの例と同じです。実際にはすべてのスレーブが同じSCKとCSに接続されています(これは奇妙なハードウェア) – DLnd

答えて

0

strong typingとの違いがあります。

最初のコードでは、新しいタイプを作成します。それは独立しており、他のタイプと互換性がありません。ただ、コードの次の部分を考慮してください。

entity e is end entity; 
library ieee; 
architecture a of e is 
    use ieee.std_logic_1164.all; 
    type slv1_t is array (15 downto 0) of std_logic; 
    signal slv1 : slv1_t; 
    type slv2_t is array (7 downto 0) of std_logic; 
    signal slv2 : slv2_t; 
begin 
    slv2 <= slv1(7 downto 0); 
end architecture; 

ModelSimの中でコンパイルし、このコードはエラーを与える:コードの2番目の部分については

Error: C:/HDL/TypeVsSubtype/Type.vhd(10): Cannot resolve slice name as type slv2_t.

を、基になる型はまだstd_logic_vectorです。したがって、サブタイプは互換性があります。次のコードを検討してください。

entity e is end entity; 
library ieee; 
architecture a of e is 
    use ieee.std_logic_1164.all; 
    subtype slv1_t is std_logic_vector(15 downto 0); 
    signal slv1 : slv1_t; 
    subtype slv2_t is std_logic_vector(7 downto 0); 
    signal slv2 : slv2_t; 
begin 
    slv2 <= slv1(7 downto 0); 
end architecture; 

これはコンパイルされます(エラーはありません)。