2016-04-30 8 views
2

У меня возникли проблемы с функцией 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; 
+0

W = 4, поэтому W-1 = 3. Вы не можете поместиться (диапазон от 0 до 15) в 3 бита, что в точности означает сообщение об ошибке в первую очередь. (Обратите внимание, что если вы создаете экземпляр этого объекта с любым другим значением родового, он будет сломан. Исправьте это тоже) –

+0

Спасибо, человек, я думал, что это была ошибка параметра! Теперь работает! –

+1

Я постоянно удивляюсь количеству примеров на SO, которые используют 'std_logic_arith'. 'Библиотека numeric_std' доступна уже более десятилетия, и наш стандарт внутреннего кодирования требует ее с 2002 года. Каждый синтезатор, о котором я могу думать с 2002 года, поддерживал его. Кто учит этому? – PlayDough

ответ

2

Последний параметр функции conv_std_logic_vector определяет длину возвращаемого std_logic_vector из этой функции. Указав здесь W-1, попросите функцию вернуть 3-битный вектор. Но целевой сигнал q имеет 4 бита, пронумерованный от W-1 downto 0. Об этом жалуется сообщение об ошибке.

Вы можете исправить это, пройдя только W в качестве последнего параметра. Лучший способ, к указать длину целевого сигнала вместо используя q'length:

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

Таким образом, результат функции всегда будет иметь правильную длину.

Это не проблема как таковая, если возможный диапазон первого аргумента больше, чем то, что может быть представлено числом бит, заданным во втором аргументе. Конечно, произойдет усечение.


Пожалуйста, не используйте, нестандартные std_logic_arith и std_logic_unsigned пакеты из Synopsys больше. Проблемы возникнут, когда вам придется использовать подписанные и неподписанные числа в одном и том же сущности позже. Используйте стандартный ieee.numeric_std пакет вместо:

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; 

Переход от integer к std_logic_vector требует 2 шага в настоящее время. Сначала вам придется преобразовать его в unsigned длины q'length, как указано во втором аргументе to_unsigned. unsigned также является вектором std_logic элементов, но соответствующие функции угрожают этой «битовой последовательности» как беззнаковое число. Второй (внешний) шаг - это преобразование типа в std_logic_vector.