Аккумулятор VHDL — ошибки Infix

Я пытаюсь создать аккумулятор для использования в NCO, но получаю странные ошибки. Я новичок в VHDL, поэтому любая помощь приветствуется, вот мой код:

library IEEE;
use IEEE.STD_LOGIC_1164.all;    -- for std_logic and std_logic_vector
use IEEE.NUMERIC_STD.all;       -- for unsigned type

---------------------------------------------------------------------
-- accumulator entity declaration
---------------------------------------------------------------------       

entity accumulator is

    port(CLK, Reset : in std_logic;
         S  : in std_logic_vector(11 downto 0);
           N : out std_logic_vector(7 downto 0));
end accumulator;

---------------------------------------------------------------------
-- accumulator architecture                                        
---------------------------------------------------------------------   

architecture accumulator_arch of accumulator is

begin   

process (CLK)
      variable ACC : unsigned(11 downto 0) := "000000000000";
      variable STEP : unsigned(11 downto 0) := "000000000000";
    begin
        -- use an "if" statement to synchronise to rising clock edge
        STEP := unsigned(S);
        if (Reset = '1') then
          ACC := "000000000000";

        elsif   rising_edge(clk) then

            ACC := ACC + S;
            --add step size to ACC
        end if;

        N <= std_logic_vector(ACC(11 downto 4));

end process;

end accumulator_arch;

Я получаю следующие ошибки:

** Error: C:/Modeltech_pe_edu_10.4/Projects/NCO.vhd(34): No feasible entries for infix operator "+".
** Error: C:/Modeltech_pe_edu_10.4/Projects/NCO.vhd(34): Bad right hand side (infix expression) in variable assignment.
** Error: C:/Modeltech_pe_edu_10.4/Projects/NCO.vhd(42): VHDL Compiler exiting

Я не понимаю, почему я получаю ошибки, так как я добавляю две переменные без знака.

Спасибо


person GBannerman    schedule 04.03.2015    source источник


Ответы (1)


Вы добавляете ACC (без знака) с S (std_logic_vector). Вы, вероятно, хотели вместо этого использовать STEP (unsigned).

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

Я думаю, что в этом случае вам нужен синхронный сброс, поскольку я ожидаю, что сброс будет управляться верхним модулем, а не глобальным сбросом. Вы делаете сброс синхронным, перемещая его внутри блокаrising_edge:

if rising_edge(clk) then
    if (Reset = '1') then
        ACC := (others => '0');
    else
        ACC := ACC + STEP;
    end if;
end if;
person Jonathan Drolet    schedule 04.03.2015
comment
Спасибо, это было действительно полезно, не могу поверить, что не заметил свою ошибку! - person GBannerman; 04.03.2015