Parameters VHDL:conv_std_logic_矢量参数错误
Quartus中的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
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;