Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lek2013 / lek4

.doc
Скачиваний:
86
Добавлен:
31.05.2015
Размер:
643.07 Кб
Скачать

Лекция 4

Сумматоры

Сумматор – цифровая схема позволяющая складывать два двоичных числа. Различают полусумматор и полный сумматор. В полном сумматоре есть вход переноса из младшего разряда и выход переноса для переноса в старший разряд. В полусумматоре присутствует только выход переноса.

Пример суммирования:

Схема полусумматора:

Полусумматор подходит для сложения битов нижних разрядов двух многобитовых слов. Для сложения битов в середине слова следует использовать полный сумматор.

Схема полного сумматора:

Как видно из таблиц истинности получить полусумматор из полного сумматора можно подав на вход переноса логический ноль.

Описание полного одноразрядного сумматора на VHDL:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity add2 is

Port ( c1,a,b: in STD_LOGIC;

c2,s2 : out STD_LOGIC);

end add2;

architecture Beh of add2 is

signal t:std_logic;

begin

c2<=(a1 and c1) or (b and c1) or (a1 and b);

t<=a xor b; s2<=c1 xor t;

end Beh;

Чтобы получить N-разрядный сумматор надо объединить N полных одноразрядных сумматоров. Схема 4-х разрядного сумматора:

Описание 4-х разрядного сумматора на VHDL

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity main is

Port ( A,B : in STD_LOGIC_VECTOR (3 downto 0);

Sum : out STD_LOGIC_VECTOR (3 downto 0);

c2 : out STD_LOGIC;

c1 : in STD_LOGIC);

end main;

architecture Behav of main is

COMPONENT add2

PORT( c1,a,b : IN std_logic;

c2,s2 : OUT std_logic);

END COMPONENT;

signal s0,s1,s2: STD_LOGIC;

begin

u0: add2 PORT MAP(c1 =>c1,a =>A(0),b =>B(0),c2 =>s0,s2 =>Sum(0));

u1: add2 PORT MAP(c1 =>s0,a =>A(1),b =>B(1),c2 =>s1,s2 =>Sum(1));

u2: add2 PORT MAP(c1 =>s1,a =>A(2),b =>B(2),c2 =>s2,s2 =>Sum(2));

u3: add2 PORT MAP(c1 =>s2,a =>A(3),b =>B(3),c2 =>c2,s2 =>Sum(3));

end Behav;

Параметризованные модули и оператор generate

Часто требуется описать цифровую схему не фиксированной, а произвольной разрядности, состоящую из повторяющихся регулярных частей. Регулярные схемы также называю систолическими.

Разрядность может достигать нескольких сотен единиц, поэтому VHDL имеет специальную языковую конструкцию подключения в цепочку частей систолической схемы.

Оператор generate позволят задать повторяющуюся часть в виде цикла for, а нерегулярные части подключить используя оператор if. Параметр модуля задается при помощи слова generic перед описанием портов модуля.

Пример описания сумматора произвольной разрядности:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity main is

generic( N:integer:=4);

Port ( A,B : in STD_LOGIC_VECTOR (N-1 downto 0);

Sum : out STD_LOGIC_VECTOR (N-1 downto 0);

c2 : out STD_LOGIC;

c1 : in STD_LOGIC);

end main;

architecture Behavioral of main is

COMPONENT add2

PORT( c1,a,b : IN std_logic;

c2,s2 : OUT std_logic);

END COMPONENT;

signal s:STD_LOGIC_VECTOR(N-2 downto 0);

begin

g0:for i in N-1 downto 0 generate

g1:if(i=N-1) generate

bitN:add2 port map (c1 =>s(N-2),a =>A(N-1),b =>B(N-1),c2 =>c2,s2 =>Sum(N-1));

end generate g1;

g2:if(i>0 and i<N-1) generate

biti:add2 port map (c1 =>s(i-1),a =>A(i),b =>B(i),c2 =>S(i),s2 =>Sum(i));

end generate g2;

g3:if(i=0) generate

bit0:add2 port map (c1 =>c1,a =>A(0),b =>B(0),c2 =>S(0),s2 =>Sum(0));

end generate g3;

end generate g0;

end Behavioral;

АЛУ

Тракт данных типового процессора включает набор регистров и арифметико-логическое устройство. В современных процессорах операнды загружаются в регистры общего назначения из памяти, после чего через промежуточные регистры поступают в АЛУ. Результат работы АЛУ снова записывается в регистр.

Схема тракта данных процессора:

Схема одноразрядного АЛУ

Это АЛУ может вычислять одно из 4-х действий:

1)A И В, 2) А ИЛИ В,3) инверсия И, 4) A+B

Выбор действия осуществляется подачей управляющих сигналов на входы F0F1.

F0=0 F1=0 => A И В

F0=0 F1=1 => A ИЛИ В

F0=1 F1=0 => инверсия В

F0=1 F1=1 => A + В

Операнды со входа A B считываются при подаче логической единицы на входы разрешения ENA ENB. При подаче единицы на вход INVA значение операнда A инвертируется.

Описание данной схемы на VHDL:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity alu1bit is

Port ( F : in STD_LOGIC_VECTOR (1 downto 0);

A,B,c1: in STD_LOGIC;

ENA,ENB,INVA:in STD_LOGIC;

c2,Y : out STD_LOGIC);

end alu1bit;

architecture Behavioral of alu1bit is

COMPONENT add2

PORT( c1,a,b : IN std_logic;

c2,s2 : OUT std_logic);

END COMPONENT;

signal abOr,abAnd,bNot,abSum:std_logic;

signal ea,eb: std_logic;

begin

ea<=INVA xor (A and ENA);

eb<=B and ENB;

abOr<=ea or eb;

abAnd<=ea and eb;

bNot<=not eb;

add2_i:add2 port map(c1=>c1,a=>ea,b=>eb,c2=>c2,s2=>abSum);

y<=abAnd when F="00" else

abOr when F="10" else

bNot when F="01" else

abSum;

end Behavioral;

Если требуется выполнить вычитание то одни член разности надо инвертировать, выполнить сложении и к результату прибавить единицу. На вышеприведенном АЛУ это можно сделать за несколько тактов синхронизации.

Пример

B=5; A=2; B-A=? Вычитаемое следует представить в

B=101; A=010;

Инверсия А= 101 - обратный код

Дополнительный код = 110= инверсия А+1

101+

110 = 1011

Старший разряд отбрасываем результат = 011=3

10

Соседние файлы в папке Lek2013