2011-12-03 5 views
0

부호가있는 accumulator을 구현하려고합니다. 코어 겐을 자일링스로 사용하고 있습니다. 내 이해에 따르면 누적 기는 출력에 입력을 라우팅하는 일반 레지스터의 기능을 수행하지만 그 점에 대한 설명을 원했습니다.VHDL 누산기 구현

Accumulator IPcore (.xco) 모듈을 프로젝트에 추가했으며 기본적으로 구성 요소 선언과 포트 맵을 포함하는 주 파일이 있습니다. 나는 한 단계의 과정도 가지고있다. 모든 것이 컴파일되고 보드에서 결과를 볼 수 있지만 진행 상황을 이해하지 못합니다.

1000을 입력하면 LED의 8 비트 출력은 11111000입니다. 1111의 또 다른 입력은 나를 11110111라고합니다. 나는 여기에 Accm.vho 파일이라는 주된 vhd 파일을위한 코드를 붙이고있다.

---------------------------------------------------------------------------------- 

---------------------------------------------------------------------------------- 
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

누군가이 프로그램에서 무슨 일이 일어나는지 설명해 주시면 감사하겠습니다. 감사!

답변

3

"축적 기"는 많은 것을 의미 할 수 있습니다. 하드웨어 자일링스 라이브러리에서, 사용자가 인스턴스화 한 컴포넌트는 레지스터 앞에 더하기 연산자입니다. 가산기는 누산기 레지스터의 현재 값에 입력 항을 ​​더합니다. 누적 계산기는 입력보다 넓기 때문에 출력을 오버플로하지 않고 많은 입력 항을 ​​누적 (합산) 할 수 있습니다.

회로가 시작되면 누산기에 0이 포함됩니다. 1000에 입력하면 (-8) 0에 추가되면 출력에 11111000 (-8 부호 확장)이됩니다. 그런 다음 1111 (-1)을 추가하면 출력은 11110111 (-9 부호 확장)이됩니다.

"누적"이 완료되면 SCLR을 어썰트하여 누적 레지스터를 0으로 초기화합니다 (또는 논리에 맞게 SSET 또는 SINIT 사용).

이 모든 정보는 자일링스 라이브러리 설명서 (corgen 대화 상자의 "datasheet"버튼을 클릭하십시오)에서 다루어야합니다.

+0

도움 주셔서 감사합니다. – dawnoflife

0

사실, 지금 생각합니다. 서명 된 입력이있는 Adder처럼 작동합니다. 나는 이것에 대해 정확하다고 생각하지만 어떤 설명도 감사 할 것입니다!