Как написать код vhdl для 4-битного сумматора/вычитателя

# #vhdl #quartus

Вопрос:

этот код задан как код для 16-битного сумматора. Я хочу изменить это на 4 бита, а также на вычитатель. Прямо сейчас я немного зациклился на том, что делают некоторые из этих строк кода. Я предполагаю, что 15DOWNTO0-это то,что превращает x в x0, x1,x2.. до x15. Я в замешательстве, хотя, потому что в сумме сигналов он становится 16DOWNTO0, поэтому мне было интересно, почему его 16 вместо 15. Я также не понимаю, что представляет собой переполнение. Наконец, что (’0’amp;X) означает/делает? Я понимаю, что задал много вопросов, так что заранее спасибо!

 LIBRARY ieee;
USE ieee.std logic 1164.all;
USE ieee.std logic unsigned.all;
ENTITY adder16 IS
PORT ( Cin : IN STD LOGIC;
X, Y : IN STD LOGIC VECTOR(15 DOWNTO 0);
S : OUT STD LOGIC VECTOR(15 DOWNTO 0);
Cout, Overflow : OUT STD LOGIC );
END adder16 ;
ARCHITECTURE Behavior OF adder16 IS
SIGNAL Sum : STD LOGIC VECTOR(16 DOWNTO 0);
BEGIN
Sum < = (’0’amp;X)   (’0’amp;Y)   Cin;
S < = Sum(15DOWNTO0);
Cout < = Sum(16);
Overflow < = Sum(16) XOR X(15) XOR Y(15) XOR Sum(15);
END Behavior;
 

Комментарии:

1. Может быть, вы могли бы описать трудности, с которыми вы сталкиваетесь?

2. @user16145658 Прямо сейчас я немного зациклился на том, что делают некоторые из этих строк кода. Я предполагаю, что 15DOWNTO0-это то,что превращает x в x0, x1,x2.. до x15. Я в замешательстве, хотя, потому что в сумме сигналов он становится 16DOWNTO0, поэтому мне было интересно, почему его 16 вместо 15. Я также не понимаю, что представляет собой переполнение. Наконец, что означает (’0’и X) / делает? Я понимаю, что задал много вопросов, так что заранее спасибо

3. No. X, Y : IN STD LOGIC VECTOR(15 DOWNTO 0); объявляет порты X и Y типа массива std_logic_vector с диапазоном индексов от 15 до 0. Существует требование, чтобы числовые литералы и идентификаторы были разделены (например, пробелом). S <= SUM(15 downto 0); присваивает срез массива СУММ элементов 15 до 0 выходному порту S. (VHDL чувствителен только к регистру символов в расширенных идентификаторах и символьных литералах). Наличие СУММЫ больше, чем S, позволяет выразить выполнение. Длина, возвращаемая двоичным оператором» «, является самой длинной из двух операндов. Переполнение может произойти в знаковой арифметике.

4. @user16145658 большое вам спасибо, это очень помогает. просто еще один вопрос, если все в порядке, что делает (’0’и X)?

5. Оператор объединения объединяет значения типов массивов с другими значениями того же типа массива или типа элемента типа массива. Здесь X-это значение ограниченного типа массива, которое соединяется слева со значением » 0 » в качестве типа элемента std_logic_vector. Тип «0» (который может быть перегружен) определяется контекстом (тип X, правильный операнд). Создание меньшего сумматора включает в себя уменьшение левых границ X, Y, S и СУММЫ и выбор новых левых границ для Cout, S и вычисление переполнения. <= представляет собой составной разделитель, состоящий из двух последовательных символов без пробела.

Ответ №1:

Если вам нужен 4-битный сумматор, вы должны изменить значения ваших векторов:

 STD_LOGIC_VECTOR(3 downto 0);
 

У вас есть в коде (15 downto 0) , потому что, считая бит от 0 до 15, он считает 16 бит. Бит переполнения будет установлен на » 1 » в случае, если последний наиболее значимый бит имеет перенос.

Ваш 4-битный сумматор должен выглядеть так:

 LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY adder4 IS
PORT ( Cin : IN STD_LOGIC;
X, Y : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
Cout, Overflow : OUT STD_LOGIC );
END adder4 ;
ARCHITECTURE Behavior OF adder4 IS
SIGNAL Sum : STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
Sum <= (’0’amp;X)   (’0’amp;Y)   Cin;
S <= Sum(3 DOWNTO 0);
Cout <= Sum(4);
Overflow <= Sum(4) XOR (X(3) XOR Y(3) XOR Sum(3));
END Behavior;
 

Вероятно, вы используете сумму сигналов в 5 бит, чтобы обнаружить переполнение в вашем наиболее значимом бите «1XXXX», как вы назначили для выполнения Sum(4). Это решение основано на вашей структуре, но вы могли бы попробовать другие еще проще.

Вы можете использовать a generic , если хотите изменить биты своего сумматора, просто изменив число в своем коде:

 ......
ENTITY adderN IS
GENERIC (N : INTEGER := 4); "Where can be 16, 4 or any number of bits"
PORT ( Cin : IN STD_LOGIC;
X, Y : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0);
Cout, Overflow : OUT STD_LOGIC);
END adderN ;
ARCHITECTURE Behavior OF adderN IS
SIGNAL Sum : STD_LOGIC_VECTOR(N-1 DOWNTO 0);
BEGIN
Sum < = (’0’amp;X)   (’0’amp;Y)   Cin;
S < = Sum(N-1 DOWNTO 0);
Cout < = Sum(N);
Overflow < = Sum(N) XOR X(N-1) XOR Y(N-1) XOR Sum(N-1);
END Behavior;