1. ホーム
  2. parameters

[解決済み] VHDL: conv_std_logic_vector パラメータエラー

2022-02-18 04:45:57

質問

について、いくつかの問題があります。 conv_std_logic_vector 関数があります。私はこの関数を使って、整数変数を std_logic_vector . 以下のコードをコンパイルすると、Quartusは以下のエラーメッセージを表示します。

エラー(10344)。VHDL expression error at counter_Wbits.vhd(32): expression has 3 elements, but must have 4 elements.

インターネットでこの関数を検索してみると、みんないつも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;

解決方法は?

関数の最後のパラメータ conv_std_logic_vector の長さを定義します。 std_logic_vector この関数から この関数から W-1 ここで、この関数が3ビットのベクトルを返すように要求しています。しかし、ターゲット信号 q は4ビットで、その番号は W-1 downto 0 . これがエラーメッセージの文句です。

これを解決するには、単に W を最後のパラメータとして指定します。よりよい方法は、ターゲット信号の長さを指定する代わりに q'length :

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

こうすることで、関数の結果は常に正しい長さになります。

なお、第1引数の取り得る範囲が、第2引数のビット数で表現できる範囲より大きくても問題はない。もちろん、切り捨ては発生します。


非標準の 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つのステップが必要です。まず最初に、それを unsigned 長さの q'length の第2引数で指定されるように to_unsigned An unsigned のベクトルでもあります。 std_logic しかし、それぞれの関数は、このquot;ビット列を符号なし数として威嚇します。第二段階(外側)では、型変換を行い std_logic_vector .