непрерывное усреднение с использованием VHDL

У меня вопрос, связанный с программированием VHDL. Я хочу рассчитать непрерывное среднее значение. Мой пример кода:

process (clk, reset)
begin
    if (reset = '1') then 
        state<=idle;
        out-val=0;
    elsif(rising_edge(clk)) then
        case state is

            when idle =>
                if req='1' then 
                    state= out-1;
                end if;

            when out-1 =>
                if done='1' then
                    out-val<=data-in (11 downto 0);
                    state <= done-st;
                endif;

            when done-st =>
                ack <='1';
                state <= idle;

            when others =>
                state <= idle;
        end case;
    end if;
end process;

На каждом положительном фронте часов значение «out-val» изменяется. Я хочу постоянно брать среднее значение "out-val". Я хочу постоянно получать среднее значение из 32 значений. Есть ли способ, с помощью которого я могу постоянно принимать в среднем 32 значения, пока часы не будут запущены. Пожалуйста, дайте мне знать, как я могу это сделать. Вы также можете изменить приведенный выше код.

Огромное спасибо,


person user3008991    schedule 19.11.2013    source источник
comment
Вы должны использовать символы подчеркивания вместо тире. Похоже, вы занимаетесь математикой в ​​своей машине состояний. когда out-1 сбивает с толку.   -  person Russell    schedule 19.11.2013
comment
О да. На самом деле я использовал подчеркивание в своем исходном коде. Я не знаю, почему я написал здесь «-1». Извините за путаницу.   -  person user3008991    schedule 19.11.2013


Ответы (2)


Держите промежуточную сумму из 32 значений. Вы можете сохранить промежуточный итог, имея сигнал, который имеет общее количество. В каждом такте вам нужно добавить самое новое значение и вычесть самое старое значение. Это означает, что вам нужно создать большой регистр сдвига или FIFO, чтобы отслеживать предыдущие 32 значения, чтобы вы могли удалить их по порядку.

Затем, чтобы получить среднее значение, просто выполните сдвиг вправо, чтобы разделить на 32.

person Russell    schedule 19.11.2013
comment
Должен ли я создавать отдельный процесс для этого? - person user3008991; 19.11.2013
comment
Я бы порекомендовал это. Держите логику конечного автомата отдельно от вашего среднего значения. - person Russell; 19.11.2013
comment
@ user3008991 какой ответ? - person Russell; 20.11.2013

Создайте КИХ-фильтр с 32 отводами, коэффициенты которого равны 1/32[1, 1,..... 1]

person ytukel    schedule 10.05.2017
comment
Да, я сделал. Так? - person ytukel; 10.05.2017