2016-04-30 93 views
2

Quartusのconv_std_logic_vector関数に問題があります。私は整数変数をstd_logic_vectorに変換する関数を使用しています。VHDL:conv_std_logic_vectorパラメータのエラー

エラー(10344):counter_Wbits.vhd(32)でVHDL式エラー:私は以下のコードをコンパイルするとき、のQuartusは、次のエラーメッセージを示す式は、3つの要素を有しているが、4つの要素を有していなければなりません。

私はインターネット上でこの機能を検索し、人々は常に2つのパラメータを使用していますが、何が起こっていますか?

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
USE IEEE.std_logic_unsigned.ALL; 
use IEEE.std_logic_arith.ALL; 

ENTITY counter_Wbits IS 
    GENERIC(W : NATURAL := 4); 
    PORT (portae : IN BIT;-- data input 
     portas : IN BIT;-- data input 
     clk : IN BIT; -- clock 
     clrn: IN BIT; -- clear 
     ena : IN BIT; -- enable 
     q : BUFFER STD_LOGIC_VECTOR(W-1 DOWNTO 0));-- data output 
END counter_Wbits; 

ARCHITECTURE arch_1 OF counter_Wbits IS 
BEGIN 
    PROCESS(clk,clrn) 
    variable cont : integer range 0 to 15; 
    BEGIN 
    IF (clrn='0') THEN 
     q <= (OTHERS => '0'); 
    ELSIF (clk'EVENT AND clk='1') THEN 
     IF (ena='1') THEN 
     IF(portae='1') THEN 
      cont := cont+1; 
     ELSIF (portas='1') THEN 
      cont := cont-1; 
     END IF; 
     END IF; 
    END IF; 
    q <= conv_std_logic_vector(cont, W-1); -- LINE 32 
    END PROCESS; 
END arch_1; 
+0

W = 4 W-1 = 3。あなたは3ビットで(範囲0から15まで)フィットすることはできません。これはエラーメッセージが最初に述べたものです。 (このエンティティをジェネリックの他の値でインスタンス化すると、それも壊れてしまうので注意してください) –

+0

ありがとうございました。それは今働いている! –

+1

私は、 'std_logic_arith'を使用しているSOの例の数に絶えず驚いています。 'numeric_std'ライブラリは10年以上にわたって利用されており、私たちの内部のコーディング標準は2002年以来それを必要としています。私が2002年以来考えているすべてのシンセサイザはそれをサポートしています。誰がこのことを教えていますか? – PlayDough

答えて

2

機能conv_std_logic_vectorの最後のパラメータは、この関数から返さstd_logic_vectorの長さを規定します。ここでW-1を指定すると、関数が3ビットのベクトルを返すことを要求します。しかし、ターゲット信号qは、W-1 downto 0から番号が付けられた4ビットを有する。それはエラーメッセージが不平を言うことです。

最後のパラメータとしてWを渡して、これを修正できます。

q <= conv_std_logic_vector(cont, q'length); 

この方法では、関数の結果は常に正しい長さを持つことになります。代わりにq'lengthを使用して、ターゲット信号の長さを指定するには良い方法は、あります。

第1引数の可能な範囲が第2引数のビット数で表現できるものより大きい場合は問題ありません。もちろん、切り捨てが発生します。


もう、Synopsys社からの非標準std_logic_arithstd_logic_unsignedパッケージを使用しないでください。後で同じエンティティで符号付き番号と符号なし番号を使用する必要があるときに問題が発生します。代わりに、標準ieee.numeric_stdパッケージを使用します。

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
use IEEE.numeric_std.all; -- CHANGED THIS 

ENTITY counter_Wbits IS 
    GENERIC(W : NATURAL := 4); 
    PORT (portae : IN BIT;-- data input 
     portas : IN BIT;-- data input 
     clk : IN BIT; -- clock 
     clrn: IN BIT; -- clear 
     ena : IN BIT; -- enable 
     q : BUFFER STD_LOGIC_VECTOR(W-1 DOWNTO 0));-- data output 
END counter_Wbits; 

ARCHITECTURE arch_1 OF counter_Wbits IS 
BEGIN 
    PROCESS(clk,clrn) 
    variable cont : integer range 0 to 31; 
    BEGIN 
    IF (clrn='0') THEN 
     q <= (OTHERS => '0'); 
    ELSIF (clk'EVENT AND clk='1') THEN 
     IF (ena='1') THEN 
     IF(portae='1') THEN 
      cont := cont+1; 
     ELSIF (portas='1') THEN 
      cont := cont-1; 
     END IF; 
     END IF; 
    END IF; 
    q <= std_logic_vector(to_unsigned(cont, q'length)); -- CHANGED THIS 
    END PROCESS; 
END arch_1; 

integerからstd_logic_vectorへの変換は、現在2つのステップが必要です。最初は、q'lengthunsignedに変換する必要があります。to_unsignedunsignedstd_logic要素のベクトルですが、それぞれの関数がこの「ビット列」を符号なしの数字として脅かしています。 2番目(外側)のステップは、std_logic_vectorへの型変換です。

関連する問題