[解決済み] VHDL: conv_std_logic_vector パラメータエラー
質問
について、いくつかの問題があります。
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_arith
と
std_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
.
関連
-
[解決済み] VHDL: conv_std_logic_vector パラメータエラー
-
[解決済み] Inno Setup の /SL5、/SPAWNWND、/NOTIFYWND、/DEBUGWND パラメータの意味は何ですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] setTimeout()コールバックにパラメータを渡すにはどうすればよいですか?
-
[解決済み] 引数とパラメータの違いは何ですか?
-
[解決済み] JavaScriptの関数をパラメータとして渡す
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み] nginxでproxy_passを経由してクエリ文字列パラメータを転送するには?
-
[解決済み] コンストラクタの引数は何個が多すぎる?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン