ヤンの答えには、VHDLの構文に精通していない人には答えを出すためにここで取り上げたいいくつかの問題があります。これはYannが選択した実装の批判ではなく、構文の問題を明確にするためのものです。
まず、上記の例は完全ではありません。 component
ステートメントが記述されていますが、対応するentity
はありません。 component
の使用は宣言的な領域にのみあり、package
またはarchitecture
の外部には単独で存在することはできません。書かれているように、それはコンパイルされません。むしろ、それが変更されるべきである:
entity columns is
...
end entity columns;
第二に、一つは、対応するタイプ宣言せずに配列を宣言することができません。つまり、ヤンのポストの例:
values : array (0 to choices-1) of integer
は実行できません。タイプは、使用する前に宣言する必要があります。そして、そのタイプをコンポーネント/エンティティに見えるようにするには、component
またはentity
の前に定義する必要があります。 entity
の場合は、パッケージで定義する必要があります。例えば:
package columns_pkg is
type values_array is array(natural range <>) of integer;
end package columns_pkg;
そしてcolumns_pkg
はentity
で参照することができます。など:
library ieee;
use ieee.std_logic_1164.all;
use work.columns_pkg.all;
entity columns is
generic (
LEN : integer; -- bits of output
choices : integer; -- number of column combinations
-- distances at which bits may be 1
values : values_array(0 to choices-1)
);
...
今、これはまだかなり正しくありません。 VHDL-2008でのみ、ジェネリックは互いに依存することができます。つまり、values
の範囲はVHDL-2008のchoices
にのみ依存することができます。それ以前の言語バージョンでは、VHDL-2002以前のバージョンでは、上記のvalues
の宣言が失敗することになります。
しかし、choices
も必要ないことが判明しました。 values
が拘束されないことを
library ieee;
use ieee.std_logic_1164.all;
package columns_pkg is
type values_array is array(natural range <>) of integer;
end package columns_pkg;
library ieee;
use ieee.std_logic_1164.all;
use work.columns_pkg.all;
entity columns is
generic
(
LEN : integer; -- bits of output
values : values_array
);
port
(
-- one hot encoded distance choice
distance : in std_logic_vector(values'length-1 downto 0);
-- data which is 1 at selected distance
bits : out std_logic_vector(LEN-1 downto 0)
);
end entity columns;
architecture behavioural of columns is
begin -- architecture behavioural
bitgen: for i in bits'range generate
begin
-- purpose: calculate one individual bit
-- type : combinational
-- inputs : distance
-- outputs: bits(i)
bitcalc: process (distance) is
variable j : integer;
begin -- process bitcalc
bits(i) <= '0';
for j in values'range loop
if i mod values(j) = 0 and distance(j) = '1' then
bits(i) <= '1';
end if;
end loop; -- j
end process bitcalc;
end generate;
end architecture behavioural;
注:むしろ、1本(それをすべて一緒に持って来ると、タイプミスのカップルをクリーンアップ)を行うことができます。長さは精緻化時に決定されます。また、属性を使用して長さと範囲を決定することもできます。
また、LEN
と範囲values
の間に関係がある場合は、LEN
ジェネリックも削除される可能性があります。
そして最後に、columns
を利用するために、一つはありません:あなたは、事前に定義された数の制限されたセットとビット位置との間のmodをやっている
entity top is
end entity top;
use work.columns_pkg.all;
architecture behavioural of top is
constant columns_values : values_array(0 to 5) := (0, 5, 10, 15);
-- one hot encoded distance choice
signal distance : std_logic_vector(columns_values'length-1 downto 0);
-- data which is 1 at selected distance
signal bits : out std_logic_vector(31 downto 0);
begin
columns_inst : entity work.columns
generic map
(
LEN => bits'length,
values => columns_values
)
port map
(
distance => distance,
bits => bits
);
end architecture behavioural;
。両方とも一定です。最も高価な部分は、あなたがそれを熱くしないと入力選択を解読する可能性が高いです。 –
1つ以上の定数宣言の値を生成する関数を書くことができます。値を消費するために使用するメカニズム以外のコストを必要としない、洗練されたデザインを合成するからです。 – user1155120