Арифметические операторы в программировании на HDL

Xilinx®

XST User Guide (10.1), 2008

Об арифметических операторах

XST поддерживает следующие арифметические операторы:

Сумматоры, вычитатели, схемы сравнения и умножители поддерживаются для знаковых и беззнаковых операторов.

Для более подробной информации по знаковым и беззнаковым операторам поддерживаемым в VHDL, смотрите "Регистры в программировании на HDL".

Кроме того, XST исполняет разделение ресурса для сумматоров, вычитателей, сумматоров/вычитателей и умножителей.

Log-файл арифметических операторов

Log – файл XST сообщает о типе и размере распознанных сумматоров,вычитателей, сумматоров/вычитателей в течение шага Macro Recognition.

Synthesizing Unit .
Related source file is arithmetic_operations_1.vhd.
Found 8-bit adder for signal .
Summary:
inferred 1 Adder/Subtracter(s).
Unit synthesized.
=============================
HDL Synthesis Report
Macro Statistics
# Adders/Subtractors : 1
8-bit adder : 1

Ограничения, касающиеся арифметических операторов

Примеры программирования арифметических операторов

Скачать обновления можно с ftp://ftp.xilinx.com/pub/documentation/misc/examples_v9.zip.

Для примера арифметических операторов смотрите пример содержащийся в следующих секциях:

Сумматоры, вычитатели, сумматоры/вычитатели в программировании на HDL

Эта секция рассматривает cумматоры, вычитатели, сумматоры/вычитатели в программировании на HDL, и включает в себя следующие пункты:

О cумматорах, вычитателях, сумматорах/вычитателях

Virtex-4, Virtex-5, и семейство Spartan-3A D позволяют сумматорам /вычитателям быть исполненными на ресурсах DSP48. XST поддерживает один уровень выводов регистров в DSP48 блоках. Если Перенос в или выбор операции сложения/вычитания зарегистрированы, XST погружает эти регистры также в блоки DSP48.

XST может исполнить сумматор/вычитатель в блоке DSP48, если его выполнение требует только единственный ресурс DSP48. Если макрокоманда суммирования/вычитания не соответствует в единственном DSP48, XST осуществляет полный макрос, используя логику сектора.

Выполнение макрокоманды на блоках DSP48 управляется "Коэффициентом утилизации DSP (DSP_UTILIZATION_RATIO)" с заданным по умолчанию значением auto. В режиме auto, если сумматор/вычитатель - часть более сложной макрокоманды такой как фильтра, XST автоматически располагается на блоке DSP. Иначе, XST осуществляет сумматоры/вычитатели, использующий LUTs. Установите значение "Использования DSP48 (USE_DSP48)" в yes вынуждает XST выдвигать эти макрокоманды в DSP48. При размещении сумматора/вычитателя на блоке DSP, XST проверяет, чтобы видеть, является ли это связанным с другими цепями DSP. Если так, XST пробует использовать в своих интересах быстрые связи DSP, и соединяет этот сумматор/вычитатель с цепью DSP, используя эти быстрые связи.

При осуществлении сумматоров/вычитателей на блоках DSP48, XST исполняет автоматическое управление ресурса DSP48.

Для обеспечения лучшего исполнения, XST по умолчанию пробует выводить и осуществлять максимум макро-конфигурации, включая так много регистров в DSP48 насколько возможно. Используйте, "Хранение (KEEP)" ограничение, чтобы формировать макрокоманду определенным способом. Например, чтобы исключить первое состояние регистра из DSP48, место "Хранение (KEEP)" ограничения на выводы этих регистров.

Log-файл cумматоров, вычитателей, сумматоров/вычитателей

Synthesizing Unit .
Related source file is "v_adders_4.v".
Found 8-bit adder carry in/out for signal <$addsub0000>.
Summary:
inferred 1 Adder/Subtractor(s).
Unit synthesized.
======================================================================
HDL Synthesis Report
Macro Statistics
# Adders/Subtractors : 1
8-bit adder carry in/out : 1
======================================================================

Ограничения, касающиеся cумматоров, вычитателей, сумматоров/вычитателей

Примеры программирования cумматоров, вычитателей, сумматоров/вычитателей

Скачать обновления можно с ftp://ftp.xilinx.com/pub/documentation/misc/examples_v9.zip.

Беззнаковый 8-битный сумматор

Эта секция рассматривает беззнаковый 8-битный сумматор, и включает в себя следующие пункты:
Рисунок 2-37: Схема беззнакового 8-битного сумматора

Рисунок 2-37: Схема беззнакового 8-битного сумматора

Таблица 2-44: Описание выводов логического сдвигателя на 3
Выводы Описание
A, B Операнды суммирования
SUM Результат суммирования

Пример программирования на VHDL беззнакового 8-битного сумматора

--
-- Unsigned 8-bit Adder
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity adders_1 is
port(A,B : in std_logic_vector(7 downto 0);
SUM : out std_logic_vector(7 downto 0));
end adders_1;
architecture archi of adders_1 is
begin
SUM <= A + B;
end archi;

Беззнаковый 8-битный сумматор с входным переносом

Эта секция рассматривает Беззнаковый 8-битный сумматор с входным переносом, и включает в себя следующие пункты:
Рисунок 2-38: Схема беззнакового 8-битного сумматора с входным переносом

Рисунок 2-38: Схема беззнакового 8-битного сумматора с входным переносом

Таблица 2-46: Описание выводов беззнакового 8-битного сумматора с входным переносом
Выводы Описание
A, B Операнды суммирования
CI Вход переноса
SUM Результат суммирования

Пример программирования на VHDL беззнакового 8-битного сумматора с входным переносом

--
-- Unsigned 8-bit Adder with Carry In
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity adders_2 is
port(A,B : in std_logic_vector(7 downto 0);
CI : in std_logic;
SUM : out std_logic_vector(7 downto 0));
end adders_2;
architecture archi of adders_2 is
begin
SUM <= A + B + CI;
end archi;

Пример программирования на Verilog беззнакового 8-битного сумматора с входным переносом

//
// Unsigned 8-bit Adder with Carry In
//
module v_adders_2(A, B, CI, SUM);
input [7:0] A;
input [7:0] B;
input CI;
output [7:0] SUM;
assign SUM = A + B + CI;
endmodule

Беззнаковый 8-битный сумматор с выходным переносом

Эта секция рассматривает Беззнаковый 8-битный сумматор с выходным переносом, и включает в себя следующие пункты:
Перед тем, как написать а + (плюс) операция с выходным переносом на VHDL, считывается арифметический пакет, который вы планируете использовать. Например, std_logic_unsigned не позволяет писать + (плюс) при следующей форме использования выходного переноса:
Res(9-bit) = A(8-bit) + B(8-bit)

Причина размера результата операции плюс в этом пакете равно размеру длиннейшего аргумента (8 бит).

Одно решение к примеру состоит в том, чтобы регулировать размер операндов А и В к использованию на 9 битов связь.
Res <= ("0" & A) + ("0" & B);

В этом случае, XST признает, что этот сумматор на 9 бит может быть осуществлен как сумматор на 8 бит свыходным переносом.

Другое решение:
Рисунок 2-39: Схема беззнакового 8-битного сумматора с выходным переносом

Рисунок 2-39: Схема беззнакового 8-битного сумматора с выходным переносом

Таблица 2-47: Описание выводов беззнакового 8-битного сумматора с выходным переносом
Выводы Описание
A, B Операнды суммирования
SUM Результат суммирования
Выходной перенос

Пример программирования на VHDL беззнакового 8-битного сумматора с выходным переносом

--
-- Unsigned 8-bit Adder with Carry Out
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity adders_3 is
port(A,B : in std_logic_vector(7 downto 0);
SUM : out std_logic_vector(7 downto 0);
CO : out std_logic);
end adders_3;
architecture archi of adders_3 is
signal tmp: std_logic_vector(8 downto 0);
begin
tmp <= conv_std_logic_vector((conv_integer(A) + conv_integer(B)),9);
SUM <= tmp(7 downto 0);
CO <= tmp(8);
end archi;

Предыдущий пример использует два арифметических пакета: std_logic_arith

Содержит целое число к std_logic конверсионной функции (conv_std_logic_vector) std_logic_unsigned

Содержит беззнаковую операцию + (плюс)

Пример программирования на Verilog беззнакового 8-битного сумматора с выходным переносом

//
// Unsigned 8-bit Adder with Carry Out
//
module v_adders_3(A, B, SUM, CO);
input [7:0] A;
input [7:0] B;
output [7:0] SUM;
output CO;
wire [8:0] tmp;
assign tmp = A + B;
assign SUM = tmp [7:0];
assign CO = tmp [8];
endmodule