使用 VHDL 设计 MAC 单元(dsp 处理器)

Design of MAC unit (dsp processors) using VHDL

我的项目是使用可逆逻辑设计 32 位 MAC(乘法和累加)单元。对于该项目,我使用可逆逻辑设计了 32 位乘法器和 64 位加法器。现在,在下一步中,我想设计一个 64 位累加器,它从加法器中获取值并将其存储并与其中存在的先前值相加。我不知道如何设计 Accumlator。 请帮助完成我的项目。

只需几行代码即可实现一个基本的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 输入,累加值将清零。累加器的值始终显示在块的输出上,DOUT.

根据您要与之交互的内容,您可能需要考虑以下内容 changes/modifications:

  • 也许 DIN 应该是 signedunsigned 类型而不是 std_logic_vector。我实际上推荐这个,但这取决于你在设计的其他地方如何表达你的价值观。
  • DOUT 也可以是 signedunsigned 值而不是 std_logic_vector - 这取决于您的要求。
  • 在这种情况下,如果累加值过高,累加值寄存器acc_value将翻转。也许您想在发生这种情况时生成错误条件,或者执行检查以确保您在 acc_value 的最大值处饱和。
  • acc_value 不必与 DIN 宽度相同——它可以是宽度的两倍(或任何您的要求)。它越宽,在翻转条件发生之前可以积累的越多。