条件に応じて異なるハードウェア回路を合成する 1 つの方法は、generic
withif-generate
ステートメントを使用することです。以下の例では、ジェネリックARITHMETIC_OPERATION_IS_ADD
が真の場合、加算器が生成されます。false の場合、減算器が生成されます。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity conditional_hardware is
generic (
ARITHMETIC_OPERATION_IS_ADD: boolean := true
);
port (
a, b: in unsigned(7 downto 0);
y: out unsigned(7 downto 0)
);
end;
architecture example of conditional_hardware is
begin
adder: if ARITHMETIC_OPERATION_IS_ADD generate
y <= a + b;
end generate;
subtractor: if not ARITHMETIC_OPERATION_IS_ADD generate
y <= a - b;
end generate;
end;
注: 本当に必要な場合は、C++ と同じように機能する VHDL プリプロセッサがあります。たとえば、http://vhdlpp.sourceforge.net/READMEを見てください。
再利用可能な VHDL の基礎を包括的に紹介する優れた入門書として、VLSI Technology のホワイトペーパーCoding Tips and Techniques for Synthesizeable, Reusable VHDLを強くお勧めします。
最後に LVDS を使用してからしばらく経っているため、以下は古くなっている可能性があります。出力の場合、2 つの出力ピンに相補的な値を割り当てることができます。
diff_out_p <= my_signal;
diff_out_n <= not my_signal;
次に、プロジェクト設定ファイルで、それらを差動ペアに割り当て、出力規格を LVDS または使用するものに設定します。
入力については、私のツール マニュアルでは、プリミティブをインスタンス化することを推奨しています。このプリミティブには、2 つの入力と 1 つの出力があります。入力を差動ペアに接続し、VHDL コードで出力を使用する必要があります (<data_out>
以下の例)。
library altera;
use altera.altera_primitives_components.all;
lvds_input_buffer : ALT_INBUF_DIFF
generic map (
IO_STANDARD => "LVDS",
LOCATION => "IOBANK_1A",
ENABLE_BUS_HOLD => "off",
WEAK_PULL_UP_RESISTOR => "off"
) port map (
i => <data_in_pos>,
ibar => <data_in_neg>,
o => <data_out>
);