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

时间:2016-02-06 14:43:55

标签: vhdl

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

1 个答案:

答案 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应该是DINsigned类型,而不是unsigned。我实际上推荐这个,但这取决于你在设计的其他地方如何表示你的价值观。
  • std_logic_vector也可以是DOUTsigned值,而不是unsigned - 这取决于您的要求。
  • 在这种情况下,如果累积的值太高,累计值寄存器std_logic_vector将翻转。可能您希望在发生这种情况时生成错误条件,或者执行检查以确保您以acc_value的最大值饱和。
  • acc_value的宽度不能与acc_value相同 - 它可以是宽度的两倍(或者您的要求是什么)。它越宽,在翻滚条件发生之前就可以累积得越多。