Синхронный счетчик в VHDL со сравнением соответствия и нагрузки - PullRequest
0 голосов
/ 24 сентября 2018

Я создал следующий счетчик с функцией сравнения совпадений:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity Counter is
    generic (
        N : natural := 24
    );

    port (
        -- Input counter clock
        clk                 : in std_logic := '0';
        -- Enable the counter
        enable              : in std_logic := '0';
        -- Preload value loaded when clk is rising and load is 1
        load_value          : in std_logic_vector((N-1) downto 0) := (others => '0');
        -- Set to 1 to load a value
        load                : in std_logic := '0';
        -- Compare match input is compared with the counter value
        compare_match_value : in std_logic_vector((N-1) downto 0) := (others => '0');
        -- Is 1 when compare_match_value = counter_value
        compare_match       : out std_logic := '0';
        output_value        : out std_logic_vector((N-1) downto 0) := (others => '0') 
    );
end Counter;

architecture Behavioral of Counter is
    signal counter_value      : unsigned((N - 1) downto 0) := to_unsigned(0, N);
begin
    output_value <= std_logic_vector(counter_value);

    process (clk) is 
    begin 
        if rising_edge(clk) then
            if enable = '1' then
                if load = '1' then
                    counter_value <= unsigned(load_value);
                else 
                    counter_value <= counter_value + 1;
                end if;
            else 
                if load = '1' then 
                    counter_value <= unsigned(load_value);
                end if;
            end if;
        end if;
    end process;

    process (counter_value) is
    begin 
        if unsigned(compare_match_value) = counter_value then 
            compare_match <= '1';
        else
            compare_match <= '0';
        end if;
    end process;
end Behavioral;

Поведение моего счетчика должно быть полностью синхронным с входным сигналом clk .Отключение счетчика всегда возможно, и значение удерживается на текущем значении счетчика.Значение нагрузки может быть назначено с помощью нагрузки и сигнала load_value .Когда сигнал нагрузки высокий и обнаружен нарастающий фронт, значение счетчика обновляется до load_value .

Еще одна функция - это блок сравнения, который выводит высокий сигнал на выходе compare_match .Симуляция работает, как и ожидалось, но у меня есть несколько вопросов при синтезе этого дизайна на spartan 3 fpga.

  1. Считается ли это хорошим дизайном моего счетчика, потому что я все еще не очень опытен в VHDL.
  2. Есть ли неопределенные состояния при использовании блока сравнения в дальнейшей логике в моем проекте?Как я вижу, Compare_match рассчитывается всякий раз, когда обновляется counter_value .
  3. При использовании большого числа для N, есть ли что-то особенное в задержке, которую я должен учитывать?

1 Ответ

0 голосов
/ 25 сентября 2018

В общем, мне кажется, неплохое описание.Тем не менее, я хотел бы указать на некоторые незначительные вещи (которые могут дать некоторые ответы на ваш 1-й вопрос).

1) Поскольку, как я вижу, сейчас ваш счетчик не содержит сброса (ни асинхронного, ни синхронного),В общем, вы не можете предсказать начальную точку своего подсчета (даже если, вероятно, это будут все 0 при запуске).На мой взгляд, было бы аккуратнее, если бы у вас был сигнал сброса.Я также заметил, что загрузка активируется независимо от того, включен счетчик или нет.У меня нет комментариев по этому поводу, так как это может быть спецификацией для вашего дизайна.Возможно, вы можете сжать код, переместив часть «if load» за пределы «if enable» (т.е. изменив порядок на сравнения).Чтобы улучшить удобочитаемость (особенно когда дизайн будет более сложным), я советую вам обозначить процесс.Это поможет вам определить различные части дизайна.Вы можете пропустить большую часть дополнительной типизации, если вы используете VHDL-режим emacs.Он имеет встроенные шаблоны, которые позаботятся о «скучной» части, связанной с кодированием.Я также вижу, что у вас есть значения по умолчанию для ваших входных портов.На мой взгляд, это не очень хорошая практика;они будут проигнорированы синтезатором, что приведет к IP, который может вести себя не так, как вы ожидаете.В общем случае не делайте предположений (в части тех, которые указаны) по внешним сигналам.Наконец, у меня есть комментарий о части сравнения.Это касается как вопросов 1), так и 2)

1-2). В процессе сравнения вы только что указали counter_value в списке чувствительности.Это означает, что процесс будет активирован только при изменении counter_value.Поскольку вы сравниваете его с сигналом (compare_match_value), который является входом для блока (следовательно, он может изменять значения), было бы лучше иметь его также в списке чувствительности.В противном случае сравнение не будет применено (т. Е. Процесс не будет активирован), когда вы измените compare_match_value.Инструменты Linting и синтезатор могут жаловаться на это (указав предупреждение как неполный список чувствительности).На самом деле, хорошей практикой является перечисление всех сигналов, которые могут измениться в списке для комбинаторных процессов.

Что касается самого сравнения, то, как вы его описали, абсолютно нормально, и у вас не будет непокрытых состояний.По сути, вы указали все возможные условия, поэтому никаких сюрпризов там нет.

3) Что касается вашего третьего вопроса, поскольку вы ориентируетесь на ПЛИС, вы можете «расслабиться» по этому поводу.FPGA имеют специальную структуру для быстрых арифметических операций и (если вы не используете их все), синтезатор будет использовать их для закрытия времени.Также в ASIC синтезатор, вероятно, выберет подходящую арифметическую структуру для закрытия времени.Если вы хотите быть в безопасности, вы можете добавить регистр на выходе блока сравнения.Это предотвратит создание длинного комбинаторного пути, особенно если ваш IP должен быть интегрирован с другими блоками.Конечно, этот дополнительный регистр добавил бы задержку в 1 такт, но это улучшит ваши общие временные характеристики.

Я надеюсь, что эти предложения могут быть полезны для вас и покроют (хотя бы частично) ваши сомнения.Продолжайте кодировать:)

...