У меня возникли проблемы с функцией conv_std_logic_vector
в Quartus. Я использую функцию для преобразования целочисленной переменной в std_logic_vector
. Когда я компилировать код ниже, Кварты показывают следующее сообщение об ошибке:VHDL: ошибка параметра conv_std_logic_vector
Error (10344): ошибка выражения VHDL на counter_Wbits.vhd (32): выражение имеет 3 элемента, но должны иметь 4 элемента.
Я искал эту функцию в Интернете, и люди всегда используют 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;
W = 4, поэтому W-1 = 3. Вы не можете поместиться (диапазон от 0 до 15) в 3 бита, что в точности означает сообщение об ошибке в первую очередь. (Обратите внимание, что если вы создаете экземпляр этого объекта с любым другим значением родового, он будет сломан. Исправьте это тоже) –
Спасибо, человек, я думал, что это была ошибка параметра! Теперь работает! –
Я постоянно удивляюсь количеству примеров на SO, которые используют 'std_logic_arith'. 'Библиотека numeric_std' доступна уже более десятилетия, и наш стандарт внутреннего кодирования требует ее с 2002 года. Каждый синтезатор, о котором я могу думать с 2002 года, поддерживал его. Кто учит этому? – PlayDough