VHDL: conv_std_logic_vector 参数错误
VHDL: conv_std_logic_vector parameter error
我在使用 Quartus 中的 conv_std_logic_vector
函数时遇到一些问题。我正在使用该函数将整数变量转换为 std_logic_vector
。当我编译下面的代码时,Quartus 显示以下错误消息:
Error (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
,请求函数 returns 一个 3 位向量。但是,目标信号 q
有 4 位,从 W-1 downto 0
开始编号。这就是错误消息所抱怨的内容。
您可以通过仅将 W
作为最后一个参数传递来解决此问题。更好的方法是,指定目标信号的长度,而不是使用 q'length
:
q <= conv_std_logic_vector(cont, q'length);
这样,函数结果将始终具有正确的长度。
如果第一个参数的可能范围大于第二个参数中给定的位数所能表示的范围,则没有问题。当然会出现截断的情况。
请不要再使用 Synopsys 的非标准 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 个步骤。首先,您必须将其转换为长度为 q'length
的 unsigned
,如 to_unsigned
的第二个参数中指定的 unsigned
也是 std_logic
的向量元素,但各自的功能威胁这个 "bit sequence" 作为无符号数。第二个(外部)步骤是类型转换为 std_logic_vector
.
我在使用 Quartus 中的 conv_std_logic_vector
函数时遇到一些问题。我正在使用该函数将整数变量转换为 std_logic_vector
。当我编译下面的代码时,Quartus 显示以下错误消息:
Error (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
,请求函数 returns 一个 3 位向量。但是,目标信号 q
有 4 位,从 W-1 downto 0
开始编号。这就是错误消息所抱怨的内容。
您可以通过仅将 W
作为最后一个参数传递来解决此问题。更好的方法是,指定目标信号的长度,而不是使用 q'length
:
q <= conv_std_logic_vector(cont, q'length);
这样,函数结果将始终具有正确的长度。
如果第一个参数的可能范围大于第二个参数中给定的位数所能表示的范围,则没有问题。当然会出现截断的情况。
请不要再使用 Synopsys 的非标准 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 个步骤。首先,您必须将其转换为长度为 q'length
的 unsigned
,如 to_unsigned
的第二个参数中指定的 unsigned
也是 std_logic
的向量元素,但各自的功能威胁这个 "bit sequence" 作为无符号数。第二个(外部)步骤是类型转换为 std_logic_vector
.