Я вопрос о сазе и VHDL 2008 я объект, определенном таким образом:VHDL 2008 и саз
entity multiplier_v2 is
generic( WIDTH_WORD : integer := 32;
WIDTH_RSA : integer := 2048;
LENGTH_ADDRESS : integer := 6);
port (
reset : in std_logic;
clk : in std_logic;
start : in std_logic;
input_1 : in std_logic_vector(WIDTH_WORD - 1 downto 0);
input_2 : in std_logic_vector(WIDTH_WORD - 1 downto 0);
module : in std_logic_vector(WIDTH_WORD - 1 downto 0);
output : out std_logic_vector(WIDTH_WORD - 1 downto 0);
ack_data : out std_logic;
data_valid : out std_logic;
new_module : in std_logic;
Внутри модуля я сигнал объявленным таким образом, :
signal counter_ack : std_logic_vector(LENGTH_ADDRESS - 1 downto 0);
Я использую этот сигнал в случае заявления:
case counter_ack is
when (others => '1') =>
ack_data <= '0';
when others =>
counter_ack <= counter_ack + 1;
end case;
Теперь, я уверен, что VHDL-2008 опция включена в моем синтеза инструмент, но у меня есть следующее сообщение об ошибке в отношении той части моего кода:
2049990 ERROR - E:/My_Designs/Пользовательский модуль/Montgomery_Multiplier/Алмазные/SRC/multiplier_v2.vhd (456,6-461,15) (VHDL-1544), должен иметь локальный статический подтип
Я читал, что эту ошибку следует исправить в VHDL-2008. Есть идеи ?
Я не уверен, что это законно в VHDL-2008 (даже если какой-либо инструмент может его принять), поскольку диапазон не ограничен. IMO, вам было бы лучше с «if counter_ack = 2 ** counter_ack'length-1 then ack_data <= '0'; else counter_ack <= counter_ack + 1; end if; –
@JonathanDrolet Спасибо за помощь. я знаю, что это законно или нет. Я видел, что на многих форумах это предлагаемое решение. Я могу использовать оператор if, но он отличается от синтеза из случая (у меня есть несколько случаев, подобных этому в моем источнике код) .Тогда я действительно не понимаю, где проблема. Когда я размещаю компонент в моей кодовой системе VHDL, синтезатор знает размер сигналов. Это не безусловный. Тогда почему с «If» следует быть в порядке, а с «случаем» нет? Возможно, моя ошибка - думать как программист С. – haster8558
VHDL строго типизирован (C не является) и был разработан, чтобы уловить столько ошибок во время компиляции, насколько это возможно. совершенно ясно, как следует интерпретировать код, VHDL попросит вас явно написать его на всякий случай. тип литья существует в C, но не в VHDL. VHDL-2008 смягчил педантичность, но никогда не удалит его. Моя строка кода if сравнивает std_logic_vector (я предположил, что вы использовали ieee.numeric_std_unsigned) с целым числом, что является законным, так как существует перегруженный оператор сравнения. –