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_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;

integerstd_logic_vector 的转换现在需要 2 个步骤。首先,您必须将其转换为长度为 q'lengthunsigned,如 to_unsigned 的第二个参数中指定的 unsigned 也是 std_logic 的向量元素,但各自的功能威胁这个 "bit sequence" 作为无符号数。第二个(外部)步骤是类型转换为 std_logic_vector.