Внедрение Аккумулятора в VHDL - PullRequest
0 голосов
/ 03 декабря 2011

Я пытаюсь реализовать подписанный аккумулятор с использованием Core Gen в Xilinx. Согласно моему пониманию, аккумулятор выполняет функцию обычного регистра, который просто направляет вход на выход, но я хотел пояснить это.

Я добавил модуль Accumulator IPcore (.xco) в проект, и у меня есть основной файл, который в основном содержит объявление компонента и карту портов. У меня тоже пошаговый процесс. Все компилируется, и я вижу результат на доске, но не совсем понимаю, что происходит ...

При вводе 1000 8-битный вывод на светодиодах равен 11111000. Другой ввод 1111 дает мне 11110111. Я прилагаю код здесь для основного VHD-файла с именем 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. enter image description here

Буду признателен, если кто-нибудь сможет объяснить мне, что происходит в этой программе. Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

«Аккумулятор» может означать много вещей. В аппаратной библиотеке Xilinx созданный вами компонент представляет собой сумматор перед регистром. Сумматор добавляет текущее значение регистра аккумулятора с входным термином. Регистр накопителя шире входного, поэтому вы можете накапливать (складывать) много входных терминов, не выходя за пределы выходных данных.

Когда ваша схема запускается, аккумулятор содержит ноль. Вы вводите 1000 (-8), который при добавлении к нулю становится 11111000 (знак -8 расширен) на выходе. Затем вы добавляете 1111 (-1), и на выходе получается 11110111 (знак -9 расширен).

Как только вы закончите "накапливать", установите SCLR, чтобы сбросить регистр аккумулятора в ноль (или используйте SSET или SINIT, в зависимости от вашей логики).

Все это должно охватываться документацией для библиотеки Xilinx (попробуйте нажать кнопку «Таблица данных» в диалоговом окне corgen).

0 голосов
/ 04 декабря 2011

Вообще-то, я думаю, я понял это сейчас. Он просто действует как Adder с подписанными входами. Я думаю, что я прав в этом, но был бы признателен за любые разъяснения!

...