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