5

VHDL の #define、#ifdef、#ifndef に相当するものは何ですか?

#define としてジェネリクスを使用し、それに応じて設計を変更したい。簡単な例として、ジェネリック文字列を定義し、それを使用してクロックが単一か差動かを判断します。

generic (
  something : boolean := FALSE;
  CLK_MODE : string := "SINGLE_ENDED"
);

さて、ジェネリックに従ってロジックを変更する方法は?もちろん、単純な if ステートメントで 2 つの可能な論理記述を記述できますが、両方が合成されます (ただし、実際に使用されるのは 1 つだけです)。

また、ジェネリックに合わせてポートを変更することは可能ですか?CLK の例では、差動クロックには 2 つのポートが必要ですが、シングルエンド クロックには 1 つしか必要ありません。ジェネリックに従って2番目のポートを有効または無効にする方法は?

4

2 に答える 2

8

条件に応じて異なるハードウェア回路を合成する 1 つの方法は、genericwithif-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>
);
于 2013-10-24T15:53:30.827 に答える
3

時計

内部 HDL でシングルエンドのクロック信号以外を使用することは避けたいと思います。

最上位で、差動ペア バッファー (Xilinx ランドの IBUFDS) をインスタンス化して、内部クロック信号に変換し、その信号を全体で使用します。

ポート

ジェネリックに基づいてポート ピンの数を変更する方法はありません。できることは、デフォルトをオプションの入力に割り当てることです。つまり、エンティティをインスタンス化するときにそれを接続する必要はありません。ジェネリックを使用して、シグナルを使用するかどうかを決定できます。

generic (
  something : boolean := FALSE

);
port (
   some_normal_port : std_logic;
   some_optional_port : std_logic := 'U';
....

その後

if something generate
   some logic using the optional port
else
   some logic not using the optional port
end generate;
于 2013-10-25T08:39:15.213 に答える