Внедрение аккумулятора в VHDL
-
27-10-2019 - |
Вопрос
Я пытаюсь внедрить Подписанный аккумулятор Используя Gen Gen в Xilinx. В зависимости от моего понимания аккумулятор выполняет функцию обычного регистра, который просто маршрутирует вход в выход, но я хотел разъяснить это.
Я добавил в проект модуль Accumulator IPCore (.xco), и у меня есть основной файл, который в основном содержит объявление компонента и карту порта. У меня тоже есть один шаг. Все собирает, и я вижу результат на доске, но не совсем понимаю, что происходит ...
Когда я вводу 1000
8 -битный выход на светодиодах 11111000
. Анкет Еще один вклад 1111
дает мне 11110111
. Анкет Я прикрепляю код здесь для основного VHD -файла CALL Accm
и .vho
файл.
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity Accm is
port( b: in std_logic_vector(3 downto 0);
sclr, clk, b1, b2 : in std_logic;
q : out std_logic_vector(7 downto 0)
);
end Accm;
architecture Behavioral of Accm is
-- signal declaration
type tell is (rdy,pulse,not_rdy);
signal d_n_s: tell;
signal en: std_logic;
-- component declaration
COMPONENT my_accm
PORT (
b : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
clk : IN STD_LOGIC;
sclr : IN STD_LOGIC;
q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END COMPONENT;
-- port map
begin
A1 : my_accm
PORT MAP (
b => b,
clk => en,
sclr => sclr,
q => q
);
process(clk)
begin
if clk'event and clk='1' then
case d_n_s is
when rdy => en <= '0';
if b1='1' then d_n_s <= pulse; end if;
when pulse => en <= '1';
d_n_s <= not_rdy;
when not_rdy => en <='0';
if b2='1' then d_n_s <= rdy; end if;
end case;
end if;
end process;
-- .VHO CODE
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
COMPONENT my_accm
PORT (
b : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
clk : IN STD_LOGIC;
sclr : IN STD_LOGIC;
q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END COMPONENT;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : my_accm
PORT MAP (
b => b,
clk => clk,
sclr => sclr,
q => q
);
end Behavioral;
Я также вставлю изображение аккумуалтора, сгенерированного в Coregen.
Я бы признателен, если бы кто -то мог объяснить мне, что происходит в этой программе. Спасибо!
Решение
«Аккумулятор» может означать много вещей. В аппаратной библиотеке Xilinx компонент, который вы создаете, представляет собой суммарную сумму перед регистрацией. Сборка добавляет текущее значение регистра аккумулятора с входным членом. Регистр аккумулятора шире, чем вход, так что вы можете накопить (объединять) многие входные термины без переполнения вывода.
Когда ваша схема запускается, аккумулятор содержит ноль. Вы вводите 1000 (-8), который при добавлении в ноль становится 11111000 (-8 знака расширена) на выходе. Затем вы добавляете 1111 (-1), и вывод становится 11110111 (-9 знака расширена).
После того, как вы закончите «накапливаться», утверждайте SCLR, чтобы убрать регистр аккумулятора обратно в ноль (или использовать SSET или SINIT, в зависимости от вашей логики).
Все это должно быть охвачено документацией для библиотеки Xilinx (попробуйте нажать кнопку «DataShieT» в диалоговом окне CORGEN).
Другие советы
На самом деле, я думаю, что понимаю сейчас. Это просто ведет себя как Adder
с подписанными входами. Я думаю, что я прав в этом, но буду признателен за любым разъяснениям!