VHDL целые числа, считающиеся повсюду при увеличении или уменьшении - PullRequest
0 голосов
/ 02 октября 2019

Я написал простой процесс VHDL с синхронизацией по времени, содержащий две переменные: целое число, считающее вверх (counter_up) и целое число, считающее вниз (counter_down), привязанное к выходу светодиода каждая.

Цельэта тестовая система должна просто устанавливать выходы всякий раз, когда счетчики достигают целевого значения из заданного начального значения. counter_up начинается с 10 и выводит свой светодиод на 20. counter_down начинается с 25 и выводит свой светодиод на 5. Они будут продолжать считать и превышать / понижать расход соответственно. Оба счетчика находятся в диапазоне от 0 до 31 (5 бит).

«Подсчет повсюду» происходит, когда я проверяю это на моделях с симулированными часами, как показано ниже:

simulation results

Счетчики выдают результат после 10 и 20 шагов соответственно, но, похоже, ничего не имеет смысла, и я не уверен, как бы он себя вел, если бы попыталсялюбая арифметика значений счетчика (например, с библиотекой numeric_std).

В чем причина этой проблемы и можно ли заставить их моделировать ожидаемые значения?

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;

ENTITY test IS PORT(

    clk: IN STD_LOGIC;
    led_1,led_2: OUT STD_LOGIC
    );
END;

ARCHITECTURE arch_test OF test IS

BEGIN
    PROCESS(clk)
        VARIABLE counter_up: INTEGER RANGE 0 TO 31 := 10;
        VARIABLE counter_down: INTEGER RANGE 0 TO 31 := 25;
    BEGIN
        IF clk'EVENT AND clk = '1' THEN

            counter_up := counter_up + 1;

            IF counter_up = 20 THEN
                led_1 <= '1';
            ELSE
                led_1 <= '0';
            END IF;

            counter_down := counter_down - 1;

            IF counter_down = 5 THEN
                led_2 <= '1';
            ELSE
                led_2 <= '0';
            END IF;

        END IF;
    END PROCESS;
END;

1 Ответ

2 голосов
/ 02 октября 2019

Они не совсем повсеместны, обратите внимание, что если вы инвертируете counter_up биты 1, 3 и 4, вы получите идеальную последовательность инкрементальных значений, и что-то похожее, по-видимому, происходит с counter_down. Это как если бы инструмент интерпретировал ограниченный диапазон целых чисел как перечисление, а затем решил закодировать его в этом странном паттерне, но, как сказал @Brian, это не то, что симулятор сделал бы, поэтому я предполагаю, что это скорее всего постСимуляция синтезатора.

Попробуйте использовать unsigned(4 downto 0) вместо целых чисел, вам нужно изменить начальное значение conter_up и counter_down на to_unsigned(10, 5) и to_unsigned(25, 5) соответственно.

...