我正在尝试使用Xilinx中的Core Gen实现签名累加器。根据我的理解,累加器执行正常寄存器的功能,该寄存器只是将输入路由到输出,但我想澄清一下。
我将Accumulator IPcore(.xco)模块添加到项目中,我有一个主文件,它基本上包含组件声明和端口映射。我也有一个步骤。一切都在编译,我可以在董事会上看到结果,但不太明白发生了什么......
当我输入1000
时,LED上的8位输出为11111000
。 1111
的另一个输入为我11110111
。我在这里附加了名为Accm
的主vhd文件和.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中生成的累积器的图像。
如果有人能解释我这节目中发生了什么,我会很感激。谢谢!
答案 0 :(得分:3)
“蓄能器”可能意味着许多事情。在硬件Xilinx库中,您实例化的组件是寄存器前面的加法器。加法器使用输入项添加累加器寄存器的当前值。累加器寄存器比输入宽,因此您可以累加(加在一起)许多输入项而不会使输出溢出。
当电路启动时,累加器包含零。输入1000(-8),当加到零时,输出变为11111000(-8符号扩展)。然后添加1111(-1),输出变为11110111(-9符号扩展)。
完成“累加”后,断言SCLR将累加器寄存器清零(或根据逻辑使用SSET或SINIT)。
这应该都包含在Xilinx库的文档中(尝试单击corgen对话框中的“datasheet”按钮)。
答案 1 :(得分:0)
实际上,我想我现在就明白了。这只是一个带有签名输入的Adder
。我认为我对此是正确的,但我将不胜感激任何澄清!