Невозможно сравнить = в VHDL с типами std_logic_vector

Я пытался обойти это и потерпел неудачу. Как ни странно, точно такой же код в другом файле моего проекта выглядит нормально, и я использую те же библиотеки. Что не так?

Строка кода (и генерация внутри нее)

generate_decounter_ppl: for i in 0 to ppl - 1 generate
block_decounter_load(i) <= (ppl_stage_count = conv_std_logic_vector((i),log2(ppl)));

Ошибка:

Line 175: found '0' definitions of operator "=", cannot determine exact overloaded matching definition for "="

Контекст:

ppl : integer := 18;    

ppl_stage_count : in std_logic_vector(log2(ppl)-1 downto 0);

signal block_decounter_load : std_logic_vector(ppl -1 downto 0); 


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

person Nektarios    schedule 14.11.2011    source источник
comment
use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ваша самая большая проблема. Это нестандартные пакеты. Вместо этого используйте ieee.numeric_std.all.   -  person wjl    schedule 21.02.2014


Ответы (1)


Что именно ты пытаешься сделать?

Насколько я могу судить, похоже, вы путаете VHDL с Verilog или C и, возможно, пытаетесь сделать что-то вроде следующего:

block_decounter_load(i) <= '1' when (ppl_stage_count = conv_std_logic_vector((i),log2(ppl))) else '0';

В VHDL вы не можете неявно изменять типы как часть присваивания. Вы пытаетесь преобразовать логический результат в std_logic в своем коде. Вы должны сделать это явно с помощью условного назначения сигнала (предложение «когда» в моем примере выше), оператора if внутри процесса или каким-либо другим способом.

person Charles Steinkuehler    schedule 14.11.2011
comment
Чарльз, я не подумал об этом. Следующее действительно работает: block_decounter_load(i) ‹= '1' when ((ppl_stage_count = conv_std_logic_vector((i),log2(ppl)))) else '0'; - person Nektarios; 14.11.2011
comment
У меня была точно такая же проблема, и это решение точно по деньгам - спасибо. - person davidA; 21.10.2013