# #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;