Parameters VHDL:conv_std_logic_矢量参数错误

Parameters VHDL:conv_std_logic_矢量参数错误,parameters,vhdl,quartus,Parameters,Vhdl,Quartus,Quartus中的conv\u std\u logic\u vector函数有一些问题。我正在使用该函数将整数变量转换为std\u logic\u vector。当我编译下面的代码时,Quartus显示以下错误消息: 错误(10344):计数器上的VHDL表达式错误。vhd(32):表达式有3个元素,但必须有4个元素 我在网上搜索过这个函数,人们总是使用两个参数,发生了什么 LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic

Quartus中的
conv\u std\u logic\u vector
函数有一些问题。我正在使用该函数将整数变量转换为
std\u logic\u vector
。当我编译下面的代码时,Quartus显示以下错误消息:

错误(10344):计数器上的VHDL表达式错误。vhd(32):表达式有3个元素,但必须有4个元素

我在网上搜索过这个函数,人们总是使用两个参数,发生了什么

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;
IEEE库;
使用IEEE.std_logic_1164.ALL;
使用IEEE.std_logic_unsigned.ALL;
使用IEEE.std_logic_arith.ALL;
实体计数器
通用型(W:天然型:=4);
端口(端口:位;--数据输入
端口:以位为单位;--数据输入
时钟:以位为单位;--时钟
clrn:位;--清除
ena:位;--启用
q:缓冲区标准逻辑向量(W-1到0));--数据输出
终端计数器;
计数器的架构拱门1
开始
进程(clk、clrn)
变量cont:整数范围0到15;
开始
如果(clrn='0'),则
q‘0’;
ELSIF(clk'事件和clk='1'),然后
如果(ena='1'),则
如果(portai='1'),则
续:=续+1;
ELSIF(portas='1')然后
cont:=cont-1;
如果结束;
如果结束;
如果结束;

q函数
conv_std_logic_vector
的最后一个参数定义从该函数返回的
std_logic_vector
的长度。在此处指定
W-1
,请求函数返回一个3位向量。但是,目标信号
q
有4位,编号从
W-1向下到0
。这就是错误消息所抱怨的

您可以通过只传递
W
作为最后一个参数来解决这个问题。更好的方法是,指定目标信号的长度,而不是使用
q'length

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

整数
标准逻辑向量
的转换现在需要两个步骤。首先,您必须将其转换为
的第二个参数中指定的
长度
q'length
无符号
,一个
无符号
也是
标准逻辑
元素的向量,但相应的函数会威胁到作为无符号数的“位序列”。第二个(外部)步骤是到
std_logic_vector

W=4所以W-1=3的类型转换。您不能将(范围0到15)放在3位中,这正是错误消息最初所说的。(请注意,如果您使用泛型的任何其他值实例化此实体,它将被破坏。也修复它)谢谢,伙计,我认为这是一个参数错误!现在开始工作了!我经常对上的大量示例感到惊讶,因此使用
std\u logic\u arith
numeric_std
库已经提供了十多年,我们的内部编码标准从2002年起就要求它。自2002年以来,我能想到的每一个合成器都支持它。谁在教这些东西?
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;