次の VHDL コードを検討してください。
constant c : std_logic_vector(7 downto 0) := (7 downto 6 => '1', others => '0');
ここで、インデックス 7 と 6 が重要です。これらは、どの要素が 1 であるべきかを示し、それから、コンパイラはどの要素が 0 であるべきかを導き出すことができます。
質問1
私の理解が正しければ、これは次のようにも書けます。
constant c : std_logic_vector(7 downto 0) := (7 downto 6 => '1') & (5 downto 0 => '0');
今、これがどのように機能するのか、インデックスがまだ重要なのか、それともそれらの違いだけなのか疑問に思っています。私が理解しているように、式(x downto y => z)
は indexs を持つ配列を作成しx downto y
、その要素はすべて等しいz
(そして同じ型を持っています)。しかし、配列が連結されている場合、これらのインデックスは重要ですか? つまり、次のいずれかを書くこともできますか。
constant c : std_logic_vector(7 downto 0) := (1 downto 0 => '1') & (5 downto 0 => '0');
constant c : std_logic_vector(7 downto 0) := (99 downto 98 => '1') & (4 downto -1 => '0');
もちろん、これらのステートメントは、特にそうであると言えます。最後の1つはあまり明確ではありませんが、私の質問は次のとおりです。それらは同じ結果になるでしょうか? それとも、何らかの種類またはエラーを引き起こしますか?
私がこれについて疑問に思っている理由は、あなたも書くことができるからです
constant c : std_logic_vector(7 downto 0) := "11" & "000000";
リテラル"11"
には範囲が指定されていないため、このリテラルの型が正確に何であるかはわかりませんが、確かにそうではありませんstd_logic_vector(7 downto 6)
。
質問2
最後に、私は違いが何であるか疑問に思っています
constant c : std_logic_vector(7 downto 0) := (7 downto 6 => '1') & (5 downto 0 => '0');
と
constant c : std_logic_vector(7 downto 0) := (7 downto 6 => '1', 5 downto 0 => '0');
つまり、後者の代わりに前者を書きたい/必要がある理由はありますか (たとえば、2 つの集計を交換すると予期しない結果が生じるため、エラーが発生しやすいようです)。それとも単に好みの問題ですか?