我的项目是使用可逆逻辑设计的32位MAC(乘法和累加)单元。对于该项目,我使用可逆逻辑设计了32位多路复用器和64位加法器。现在,在下一步中,我想设计一个64位累加器,它从加法器中获取值并存储它,并添加其中存在的先前值。我不知道如何设计Accumlator。 请帮助完成我的项目。
答案 0 :(得分:2)
基本的VHDL累加器只能在几行代码中实现。 您决定如何实施它,以及任何其他必要的功能将取决于您的具体要求。
例如:
这是一个无符号累加器示例,可以让您了解需要实现的内容(基于此source):
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity accumulator is
port (
DIN: in std_logic_vector(3 downto 0);
CLK: in std_logic;
RST: in std_logic;
DOUT: out std_logic_vector(3 downto 0)
);
end entity accumulator;
architecture behave of accumulator is
signal acc_value : std_logic_vector(3 downto 0);
begin
process(CLK)
begin
if rising_edge(CLK) then
if RST='1' then
acc_value <= (others => '0'); -- reset accumulated value to 0
else
acc_value <= std_logic_vector( unsigned(acc_value) + unsigned(DIN) );
end if;
end if;
end process;
-- Assign output
DOUT <= acc_value;
end behave;
描述此设计在单词中的作用:在上升沿的每个时钟周期,数据输入DIN
被解释为无符号值,并添加到当前累积值acc_value
。如果声明RST
输入,而不是累加DIN
输入,则累计值将被清除为0.累加器的值始终显示在块的输出{{1} }。
根据您与之交互的内容,您可能需要考虑以下更改/修改:
DOUT
应该是DIN
或signed
类型,而不是unsigned
。我实际上推荐这个,但这取决于你在设计的其他地方如何表示你的价值观。std_logic_vector
也可以是DOUT
或signed
值,而不是unsigned
- 这取决于您的要求。std_logic_vector
将翻转。可能您希望在发生这种情况时生成错误条件,或者执行检查以确保您以acc_value
的最大值饱和。acc_value
的宽度不能与acc_value
相同 - 它可以是宽度的两倍(或者您的要求是什么)。它越宽,在翻滚条件发生之前就可以累积得越多。