2017-04-02 23 views
1

次のコードは4:1マルチプレクサです。 dis信号が '1'の場合、出力はすべての出力ピンで0になります。 disが高い場合、selにかかわらず、 を置換する必要がなく、出力は0でなければならないという簡潔な方法がありますか?VHDL:条件付き信号割り当ての簡略化

条件付き割り当てがあいまいなままになると、意図しないラッチの生成やその他の望ましくない副作用が発生する可能性があることに注意してください。

architecture dataflow of mux8_4 is 
begin 
    q <=d0 when sel = "00" and dis = '0' else 
     d1 when sel = "01" and dis = '0' else 
     d2 when sel = "10" and dis = '0' else 
     d3 when sel = "11" and dis = '0' else 
     "00000000" when sel = "00" and dis = '1' else 
     "00000000" when sel = "01" and dis = '1' else 
     "00000000" when sel = "10" and dis = '1' else 
     "00000000" when sel = "11" and dis = '1'; 
end architecture dataflow; 

私の試み(私はしかし、悪い 練習をするすべての可能な文の省略を理解するには)

architecture dataflow of mux8_4 is 
begin 
    q <= "00000000" when dis = '1' else 
     d0 when sel = "00" and dis = '0' else 
     d1 when sel = "01" and dis = '0' else 
     d2 when sel = "10" and dis = '0' else 
     d3 when sel = "11" and dis = '0'; 
end architecture dataflow; 

答えて

6

も選択されている信号割付:

architecture foo of mux8_4 is 
    subtype choice_type is std_logic_vector (2 downto 0); 
begin 
    with choice_type'(dis & sel) select 
     q <= d0   when "000", 
      d1   when "001", 
      d2   when "010", 
      d3   when "011", 
      "00000000" when others; 
end architecture; 

ケース式ローカルに静的なサブタイプを持つタイプ・マークを持つ修飾された式である可能性があります。

IEEE Std 1076-1993を参照してください。9.5.2選択されたシグナルの割り当て、8.8ケースステートメントまたはIEEE Std 1076-2008 11.6同時シグナル割り当てステートメント、10.5.4選択シグナル割り当てステートメント、10.9ケースステートメント。

この(およびあなたの)同時シグナル割り当てステートメントには、等価な順次シグナル割り当てステートメントを含む同等のプロセスがあります。条件付きと選択された両方の信号代入ステートメントは、-2008の連続ステートメントとして許可されます。選択された信号割り当てには、同等のcase文があります。

弱値「H」および「L」が強い値「1」および「0」にそれぞれマッピングされる合成のために、disおよびselectの2進値のみを提供することができます。シミュレーションの場合、変換関数を使用して、弱い値を持つ可能性がある場合、disとselがバイナリ値を表すようにすることができます。

あなたはもう少しコンパクトにマルチプレクサを記述する配列値としてご4つのマルチプレクサデータ入力を表現することができた場合:

architecture fum of mux8_4 is 
    type mux4 is array (0 to 3) of std_logic_vector(7 downto 0); 
    use ieee.numeric_std.all; 
    signal mux:  mux4; 
begin 
    mux <= (d0, d1, d2, d3); 
    q <= mux(to_integer(unsigned(sel))) when dis = '0' else (others => '0'); 

end architecture; 

インデックス名は型宣言があるので、ローカルに静的な名前を持つ配列オブジェクトが必要です型mux4の集約値が割り当てられた配列オブジェクト(mux)を宣言する際に使用されます。

その後、条件付きシグナル割り当てでdis = '0'のときインデックスとしてselの自然数に変換されたインデックスを使用できます。else値はall '0'です。

これらの両方のアーキテクチャが分析されます。エンティティ宣言とテストベンチをMinimal, Complete and Veriable exampleに提供していれば、それらを精巧にシミュレートし、機能を実証できました。 (どちらもエンティティ宣言を追加して分析します)。

あなたのselシグナルが制約付き整数サブタイプであった場合、インデックス付きの名前インデックスはよりコンパクトで読みやすくなります。パッケージnumeric_stdにあるto_integer変換関数は、バイナリ値を表す弱いレベルをstrongにマップし、selがメタ値要素値(「0」にマップされる)を含む場合に警告を生成します。

関連する問題