Московский ордена Ленина, ордена Октябрьской Революции и ордена Трудового Красного Знамени. ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им. Н. Э. БАУМАНА Факультет: Информатики и систем управления Кафедра: Проектирование и технология производства электронной аппаратуры (ИУ4) ______________________________________________________________________________ Контрольное задание Двоично-десятичный 3-х разрядный сумматор По курсу: Схемотехника ЭВС, комплексы и сети Студент: Прилепский Р.А. (фамилия, инициалы) Руководитель: дата сдачи ИУ4-103 (индекс группы) Шпиев В.А. (фамилия, инициалы) отметка о защите Москва 2012 1.Задача: Разработать двоично-десятичный 3-х разрядный сумматор. Привести ВД. 2. Принципы построения двоично-десятичного сумматора На вход схемы подаются два трехзначных числа (к примеру, 167 и 353) в двоично-десятичном виде (0001 0110 0111 и 0011 0101 0011, соответственно), а на выходе схемы должна формироваться сумма этих двух чисел (167+353=520), так же в двоично-десятичном виде (0101 0010 0000). 3 Реализация проекта при помощи графического редактора схем. Схема для суммирования двух однознаковых чисел (от 0 до 9) показана на рисунке 3.1. Схема электрическая принципиальная была реализована в графическом редакторе ISE (version 13.3). Рисунок 3.1 – Схема сумматора в графической среде САПР Для суммирования двух трёхзначных чисел схема была расширена и представлена на рисунке 3.2 . 2 Рисунок 3.2 - Схема двоично-десятичного 3-х разрядного сумматора в графической среде САПР 4 Схемотехническое описание собранной схемы. Схема работает следующим образом. На вход первого сумматора поступает два 3-х разрядных числа. На первом каскаде сумматора происходит сложение младших разрядов числа (единиц) и формирование переноса, который подается на следующий каскад и учитывается при сложении средних разрядов числа (десятков). На втором каскаде также 3 формируется сигнал переноса, который учитывается при сложении сотен. Если результирующая сумма превышает 999 то формируется сигнал Th, который символизирует тысячный разряд. К примеру, на вход схемы подаются два трехзначных числа 167 и 353 в двоично-десятичном виде (0001 0110 0111 и 0011 0101 0011, соответственно), то на выходе схемы формируется сумма этих двух чисел (167+353=520), так же в двоичнодесятичном виде (0101 0010 0000). 5 Моделирование собранной схемы. Для моделирования собранной схемы нужно создать так называемый испытательный стенд, или TestBench, суть которого в том, что он будет подавать на блок, который мы создали путём использования графического редактора или кода VHDL, определенные сигналы, позволяющие проверить его работу посредством анализа получающихся временных диаграмм. Листинг тестовой программы представлен ниже: Листинг 5.1. -- Vhdl test bench created from schematic C:\Xilinx\Xilinx_project\KZ\KZ.sch - Thu May 10 23:34:14 2012 --- Notes: -- 1) This testbench template has been automatically generated using types -- std_logic and std_logic_vector for the ports of the unit under test. -- Xilinx recommends that these types always be used for the top-level -- I/O of a design in order to guarantee that the testbench will bind -- correctly to the timing (post-route) simulation model. -- 2) To use this template as your testbench, change the filename to any -- name of your choice with the extension .vhd, and use the "Source->Add" -- menu in Project Navigator to import the testbench. Then -- edit the user defined section below, adding code to generate the -- stimulus for your design. -LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; LIBRARY UNISIM; USE UNISIM.Vcomponents.ALL; ENTITY KZ_KZ_sch_tb IS END KZ_KZ_sch_tb; ARCHITECTURE behavioral OF KZ_KZ_sch_tb IS COMPONENT KZ PORT( A0 A1 : A2 : A3 B0 : : IN IN : IN IN STD_LOGIC; STD_LOGIC; STD_LOGIC; IN STD_LOGIC; STD_LOGIC; 4 B1 : IN STD_LOGIC; B2 : IN STD_LOGIC; B3 : IN STD_LOGIC; S1_2 : OUT STD_LOGIC; S1_1 : OUT STD_LOGIC; S1_0 : OUT STD_LOGIC; Dec : OUT STD_LOGIC; S1_3 : OUT STD_LOGIC; C0 : IN STD_LOGIC; C1 : IN STD_LOGIC; C2 : IN STD_LOGIC; D0 : IN STD_LOGIC; D1 : IN STD_LOGIC; D2 : IN STD_LOGIC; S2_2 : OUT STD_LOGIC; S2_1 : OUT STD_LOGIC; S2_0 : OUT STD_LOGIC; hun : OUT STD_LOGIC; S2_3 : OUT STD_LOGIC; C3 : IN STD_LOGIC; D3 : IN STD_LOGIC; E0 : IN STD_LOGIC; E1 : IN STD_LOGIC; E2 : IN STD_LOGIC; F0 : IN STD_LOGIC; F1 : IN STD_LOGIC; F2 : IN STD_LOGIC; S3_2 : OUT STD_LOGIC; S3_1 : OUT STD_LOGIC; S3_0 : OUT STD_LOGIC; th : OUT STD_LOGIC; S3_3 : OUT STD_LOGIC; E3 : IN STD_LOGIC; F3 : IN STD_LOGIC); END COMPONENT; SIGNAL A0 SIGNAL A1 SIGNAL A2 SIGNAL A3 : : : : STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; SIGNAL C0 SIGNAL C1 SIGNAL C2 SIGNAL C3 : : : : STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; SIGNAL E0 SIGNAL E1 SIGNAL E2 SIGNAL E3 : : : : STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; SIGNAL B0 : SIGNAL B1 : STD_LOGIC; STD_LOGIC; 5 SIGNAL B2 : SIGNAL B3 : STD_LOGIC; STD_LOGIC; SIGNAL D0 SIGNAL D1 SIGNAL D2 SIGNAL D3 : : : : STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; SIGNAL F0 SIGNAL F1 SIGNAL F2 SIGNAL F3 : : : : STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; SIGNAL S1_0 SIGNAL S1_1 SIGNAL S1_2 SIGNAL S1_3 -- SIGNAL Dec SIGNAL S2_0 SIGNAL S2_1 SIGNAL S2_2 SIGNAL S2_3 -- SIGNAL hun SIGNAL S3_0 SIGNAL S3_1 SIGNAL S3_2 SIGNAL S3_3 SIGNAL th : : : : : : : : : : : : : : : STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; BEGIN UUT: KZ PORT MAP( A0 => A0, A1 => A1, A2 => A2, B0 => B0, B1 => B1, B2 => B2, S1_2 => S1_2, S1_1 => S1_1, S1_0 => S1_0, -Dec => Dec, S1_3 => S1_3, A3 => A3, B3 => B3, C0 => C0, C1 => C1, C2 => C2, D0 => D0, D1 => D1, D2 => D2, 6 S2_2 => S2_2, S2_1 => S2_1, S2_0 => S2_0, hun => hun, S2_3 => S2_3, C3 => C3, D3 => D3, E0 => E0, E1 => E1, E2 => E2, F0 => F0, F1 => F1, F2 => F2, S3_2 => S3_2, S3_1 => S3_1, S3_0 => S3_0, th => th, S3_3 => S3_3, E3 => E3, F3 => F3 -- ); -- *** Test Bench - User Defined Section *** tb : PROCESS BEGIN -- 0+0=0 -- Первое трёхзначное слогаемое -- 000 A0<='0'; A1<='0'; A2<='0'; A3<='0'; C0<='0'; C1<='0'; C2<='0'; C3<='0'; E0<='0'; E1<='0'; E2<='0'; E3<='0'; -- Второе трёхзначное слогаемое --000 B0<='0'; B1<='0'; B2<='0'; B3<='0'; D0<='0'; D1<='0'; D2<='0'; 7 D3<='0'; F0<='0'; F1<='0'; F2<='0'; F3<='0'; wait for 10 ns; -- 9+9=18 -- Первое трёхзначное слогаемое --009 A0<='1'; A1<='0'; A2<='0'; A3<='1'; C0<='0'; C1<='0'; C2<='0'; C3<='0'; E0<='0'; E1<='0'; E2<='0'; E3<='0'; -- Второе трёхзначное слогаемое --009 B0<='1'; B1<='0'; B2<='0'; B3<='1'; D0<='0'; D1<='0'; D2<='0'; D3<='0'; F0<='0'; F1<='0'; F2<='0'; F3<='0'; wait for 10 ns; -- 21+43=64 -- Первое трёхзначное слогаемое --021 A0<='1'; A1<='0'; A2<='0'; A3<='0'; 8 C0<='0'; C1<='1'; C2<='0'; C3<='0'; E0<='0'; E1<='0'; E2<='0'; E3<='0'; -- Второе трёхзначное слогаемое --043 B0<='1'; B1<='1'; B2<='0'; B3<='0'; D0<='0'; D1<='0'; D2<='1'; D3<='0'; F0<='0'; F1<='0'; F2<='0'; F3<='0'; wait for 10 ns; -- 167+353=520 -- Первое трёхзначное слогаемое -- 167 A0<='1'; A1<='1'; A2<='1'; A3<='0'; C0<='0'; C1<='1'; C2<='1'; C3<='0'; E0<='1'; E1<='0'; E2<='0'; E3<='0'; -- Второе трёхзначное слогаемое --353 B0<='1'; B1<='1'; B2<='0'; 9 B3<='0'; D0<='1'; D1<='0'; D2<='1'; D3<='0'; F0<='1'; F1<='1'; F2<='0'; F3<='0'; wait for 10 ns; -- 999+999=1998 -- Первое трёхзначное слогаемое -- 999 A0<='1'; A1<='0'; A2<='0'; A3<='1'; C0<='1'; C1<='0'; C2<='0'; C3<='1'; E0<='1'; E1<='0'; E2<='0'; E3<='1'; -- Второе трёхзначное слогаемое -- 999 B0<='1'; B1<='0'; B2<='0'; B3<='1'; D0<='1'; D1<='0'; D2<='0'; D3<='1'; F0<='1'; F1<='0'; F2<='0'; F3<='1'; WAIT; -- will wait forever END PROCESS; -- *** End Test Bench - User Defined Section *** END; 10 Теперь в окне Simulations выбираем значение Behavorial. Выбираем наш файл main_scheme_tb в окне Hierarchy и в окне Procsesses дважды щелкаем по надписи Behavioral Check Syntax и после по Simulate Behavorial Model. В результате этих действий загрузится среда ISim. В результате моделирования получили временную диаграмму, как на рисунке 5.1, из которой ясно видно работу нашего проекта. Рисунок 5.1 – Временная диаграмма работы собранного сумматора (общий вид) Исходя из файла тестовых воздействий в первый момент времени на сумматора подаются числа 0 и 0 (А=0000 С=0000 E=0000 и В=0000 D=0000 F=0000) на выходе получается число 0000 (S1=0000 S2=0000 S3=0000 и Th=0). 11 В следующий момент времени на сумматора подаются числа 9 и 9 (А=1001 С=0000 E=0000 и В=1001 D=0000 F=0000) на выходе получается число 18 (S1=1001 S2=0001 S3=0000 и Th=0, т.е. 18). Моделирование данной комбинации показано на рисунке 5.2. Рисунок 5.2 – Временная диаграмма работы собранного сумматора (9+9=18) 12 В следующий момент времени на сумматора подаются числа 21 и 43 (А=0001 С=0010 E=0000 и В=0011 D=0100 F=0000) на выходе получается число 64 (S1=0100 S2=0110 S3=0000 и Th=0, т.е. 64). Моделирование данной комбинации показано на рисунке 5.3. Рисунок 5.3 – Временная диаграмма работы собранного сумматора (21+43=64) В следующий момент времени на сумматора подаются числа 167 и 353 (А=0111 С=0100 E=0001 и В=0011 D=0101 F=0011) на выходе получается число 520 (S1=0000 S2=0010 S3=0101 и Th=0, т.е. 520). Моделирование данной комбинации показано на рисунке 5.4. 13 Рисунок 5.4 – Временная диаграмма работы собранного сумматора (167+353=520) В следующий момент времени на сумматора подаются максимально возможные входные числа 999 и 999 (А=1001 С=1001 E=1001 и В=1001 D=1001 F=1001) на выходе получается число 1998 (S1=1000 S2=1001 S3=1001 и Th=1, т.е. 1998). Моделирование данной комбинации показано на рисунке 5.5. 14 Рисунок 5.5 – Временная диаграмма работы собранного сумматора (999+999=1998) Выводы Из временной диаграммы, полученной в результате моделирования схемы main_scheme можно сделать вывод, что собранная схема двоичнодесятичного сумматора работает корректно. 15