2017-05-18 23 views
1

私のFPGAソフトウェアには、要素またはシステム設計の開発にドラッグアンドドロップ機能があります。これは、ユーザーがコードに移動して変更することなく、変更可能なパラメータを設定できる「汎用」コンポーネントで最も効果的です。そのために、1つの入力と複数の出力を持つジェネリック・デマルチプレクサを作成することにしました。このデザインでは、ユーザーが出力ポートの数と入出力ポートのビット幅を定義できるようにする必要があります(どちらも同じ幅です)。また、設計では、選択された出力ポートの数(関数で処理した部分)の数に応じて出力選択ポートのビット幅を決定する必要があります。私の制限のため、出力ポートの数は2〜256の出力になります。それはデザインの出力の可変数をコード化することが可能ですか、それはパイプの夢です。私は多くの固定出力デマルチプレクサのコードを書いていることに注意してください。一般的なDEMUX(1入力、複数出力)をVHDLでコーディングすることはできますか?

+0

このような質問をする通常の方法は、あなたが試したことの例と、何が間違っているのかの説明を含めることです。 –

答えて

1

私があなたが探しているものを完全に理解しているかどうかはわかりませんが、私は正しく答えようとします。

まずはあなたのツールがVHDL-2008をサポートしているかどうかによって異なります。多くのカスタマイズ可能な機能はVHDL-1993では利用できません。

あなたは、これはおそらく動作することができない場合:

あなたはyour_package.vhdl

​​3210

パッケージタイプを定義するための最初の必要性そして、あなたは次のようにあなたのエンティティを定義することができます。

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.NUMERIC_STD.ALL; 
USE WORK.your_package.ALL; 

ENTITY demux IS 
    GENERIC (PORT_WIDTH : integer := 8; -- define your data width 
      NB_OUTPUT : integer := 50); -- define the number of outputs needed 

    PORT (input  : IN std_logic_vector(PORT_WIDTH - 1 DOWNTO 0); 
      output  : OUT demux_output(0 TO NB_OUTPUT - 1)(PORT_WIDTH - 1 DOWNTO 0); 
      sel   : IN std_logic_vector(7 DOWNTO 0)); 

END ENTITY; 

ARCHITECTURE RTL OF demux IS 

SIGNAL sel_int : integer := 0; 

BEGIN 

sel_int <= to_integer(unsigned(sel)); 

PROCESS (sel_int, input) 
BEGIN 
    output <= (OTHERS => (OTHERS => '0')); 
    FOR i IN 0 TO (NB_OUTPUT - 1) LOOP 
     IF (i = sel_int) THEN 
      output(i) <= input; 
     END IF; 
    END LOOP; 
END PROCESS; 

END ARCHITECTURE; 

そこでは、ポートの幅(PORT_WIDTH)と出力ポートの数(NB_OUTPUT)を宣言するだけです。

あなたのツールがVHDL-2008に準拠していない場合は、拘束されていないデータ幅をタイプdemux_outputで宣言することはできません。そのため、グローバル定数を定義する必要がありますが、これはおそらくあなたが探している "カスタマイズ可能な部分"を失うでしょう。

+1

ツールにVHDL2008がサポートされている場合は、パッケージを使用する代わりに汎用タイプを使用できます。 –

+0

真実ですが、私はそれが "セクシー"ではないことを知ります:p –

+0

最後に、コードを実際に読んで、あなたが提案したことを完全に理解する時間を得ました。あなたはほぼ正しいと思っています。この例では、実際の出力ポートではなく、配列内の場所に入力が送られるように指定しています。私の目標は、入力を特定の出力に接続し、データをその出力にラッチさせることでした。私は配列を使うことを考えましたが、私が探していたものではないと判断したので、配列にアクセスして独自の出力にルーティングする別のエンティティを開発する必要がありました。出力の数を一般的な機能にすることはできないようです。 –

0

A.Kとscary_jeffには、応答に感謝します。 VHDL-2008に準拠しているかどうかを私のツールで確認します。ちょうどあなたが知っているように、私はVHDLについて非常に新しく、素早く学びますが、私ができるだけシンプルにしようとするより複雑な設計に慣れるまではそれほど時間がかかりません。私はそれに従いますが、私には新しいものです。

出力:OUT demux_output(0 TO NB_OUTPUT - 1)(PORT_WIDTH - 1 DOWNTO 0);

私はそれが何を言っているのか理解していますが、私が行ったすべての研究において、どれも能力やそのような例を示していませんでした。もう一つの行;

出力< =(その他(>その他(OTHERS => '0')));

もう一度、キーワード「others」のドキュメントを見たことがないので、私には意味がありません。私が使用できる「良い」VHDLリソースについて説明したり、私に知らせてもらえますか?そうすれば、初心者タイプの質問をするのではなく、より複雑な問題について助けを求めることができます。もう一度、ありがとう。

関連する問題