Преобразование std_logic_vector в целое число в процессе для проверки значений?

То, что я пытаюсь сделать, довольно просто, просто генерирую импульс от основного счетчика. Мой код показан ниже. Мой вопрос: есть ли эффективный способ сравнения std_logic_vector и целого числа? Мне нужно только сравнить их в этом единственном экземпляре в процессе. Кроме того, можете ли вы выполнить арифметику для 4-битного сигнала, как показано в моем коде? Вам нужна конкретная библиотека?

signal Top16: std_logic; -- 1 clk spike at 16x baud rate    
signal Div16: std_logic_vector(3 downto 0);

DIVISOR: natural := 120 -- Can be 120 or 60, depending on user preference.    
------------------------------------------------------------------------

    process (RST, LCLK_MULT_BUFG)
    begin
        if RST='1' then
            Top16 <= '0';  --1 bit signal
            Div16 <= x"0";  -- 4 bit signal
        elsif rising_edge(LCLK_MULT_BUFG) then
            Top16 <= '0';
                if Div16 = Divisor then  -----> signal to integer comparison?
                    Div16 <= 0;
                    Top16 <= '1';  
                else
                    Div16 <= Div16 + 1;   -----arithmetic on std_logic_vector??
                end if;
        end if;

ИЗМЕНИТЬ:

Количество битов в Div16 std_logic_vector будет варьироваться в зависимости от выбранного размера Divisor (показано ниже). Как это правильно оформить? Какие библиотеки понадобятся?

DIVISOR: natural := 120 -- Can be 120 or 60, depending on user preference.
constant COUNTER_BITS : natural := integer(ceil(log2(real(DIVISOR))));
signal Div16: std_logic_vector(COUNTER_BITS);  

person VKkaps    schedule 20.08.2015    source источник


Ответы (2)


По возможности избегайте нестандартной библиотеки std_logic_unsigned. Было бы лучше использовать numeric_std и объявить Div16 как unsigned.

signal Div16: unsigned(3 downto 0);

Тогда ваше сравнение и арифметика должны просто работать. И, конечно, это синтезируемо.

Ваш бонусный вопрос также должен быть синтезируемым, хотя DIVISOR должен быть CONSTANT, чтобы его можно было оценить во время компиляции, и я думаю, вы имели в виду

signal Div16: unsigned(COUNTER_BITS - 1 downto 0);  
person user_1818839    schedule 20.08.2015
comment
Является ли этот сигнал полностью синтезируемым? Также добавлено редактирование выше для другой проблемы с конверсией, был бы очень признателен, если бы вы тоже могли проверить это! - person VKkaps; 20.08.2015
comment
я все еще получаю эти 2 ошибки, когда пытаюсь сделать то, что вы говорите: ОШИБКА: HDLCompiler: 69 - Строка 62: ‹ceil› не объявлен. ОШИБКА: HDLCompiler: 622 - строка 62: почти целое; тип выражения преобразования типа не может быть определен однозначно - person VKkaps; 20.08.2015
comment
Поскольку ceil() был в вашем коде, я предположил, что вы его уже нашли. Он находится в библиотеке ieee.math_real, поэтому просто используйте это: use ieee.math_real.all; с другими предложениями use. Если вы не хотите использовать math_real, написать функцию ceil несложно. Вторая ошибка как раз следствие того, что ceil не найден. - person user_1818839; 20.08.2015

Для арифметики вы можете использовать std_logic_unsigned. Эта библиотека содержит следующие функции:

function "+"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR;
function "+"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;

Для сравнения вы можете просто оставить это как есть, если вы используете std_logic_unsigned. Эта библиотека содержит следующие функции:

function "="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
function "="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;

Вы также можете определить Div16 как unsigned, а затем использовать numeric_std. Эта библиотека содержит следующие функции для сравнения:

function "=" ( L: NATURAL; R: UNSIGNED) return BOOLEAN;
function "=" ( L: UNSIGNED; R: NATURAL) return BOOLEAN;

И для дополнения:

function "+" ( L: UNSIGNED; R: NATURAL) return UNSIGNED;
function "+" ( L: NATURAL; R: UNSIGNED) return UNSIGNED;
person 0xMB    schedule 20.08.2015