Автор работы: Пользователь скрыл имя, 12 Ноября 2012 в 10:14, лабораторная работа
Целью данной лабораторной работы является моделирование микропрограммы выполнения операций арифметического сложения и вычитания чисел в двоичной системе счисления, заданных в прямых кодах.
МИНОБР НАУКИ РОССИИ
Федеральное государственное
бюджетное образовательное
«Юго-Западный государственный университет»
Кафедра вычислительной техники
Лабораторная работа №1, по дисциплине
«Теория вычислительных процессов»
МОДЕЛИРОВАНИЕ МИКРОПРОГРАММ ВЫПОЛНЕНИЯ
АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ В ДВОИЧНОЙ СИСТЕМЕ
СЧИСЛЕНИЯ
Выполнила:
Проверил:
Курск 2012
1.Задание на лабораторную работу
Задание: Целью данной лабораторной работы является моделирование микропрограммы выполнения операций арифметического сложения и вычитания чисел в двоичной системе счисления, заданных в прямых кодах.
Номер варианта |
Разрядность операндов |
Разрядность сумматора |
5 |
16 |
4 |
НАЧАЛО
Рг А:=ШZ
Рг В:=ШZ
ТгР := 0
Ст := 0
Y1
Y2
Y3
X1
1
0
операция
сложения
РгВ[0] :=ùРгВ[0]
Y4
X2
1
0
РгА[0]=0
РгA:=ùРгA
РгA:=РгA + 1
1
Y5
Y6
2. Содержательный
алгоритм выполнения
X3
1
0
РгB[0]=0
РгB:=ùРгB
РгB:=РгB + 1
РгС[ст]:=РгА[ст]+РгВ[ст]+ТгР
Ст := Ст+1
1
0
X5
1
0
РгC[0]=0
РгC:=ùРгC
РгC:=РгC + 1
ШZ:=РгС
Ст > 4
Конец
Y7
Y8
Y9
Y10
X4
Y11
Y12
Y13
RgC
ТгР
Ст
RgA
RgB
SM
DMUX
MUX
MUX
0
15
0
0
15
0
15
15
0
15
0
15
0
3
0
3
0
3
0
3
0
3
0
3
0
0
0
15
15
15
перенос
16
16
y1
y2
y
3
y3
A
A
A
y9
A
Z
Z
y4
y6
y7
y5
y8
y10
y11
y12
y13
3. Структура операционного
автомата выполнения
4. Список микрокоманд и условий
y1: RgA:=ШZ;
y2: RgB:= ШZ
y3: ТгР:=0; Ст:=0;
y4: RgB[0]:=ù RgB[0];
y5: RgA:=ù RgA
y6: RgA:= RgA + 1
y7: RgB:=ù RgB
y8: RgB:= RgB + 1
y9: RgC[ст];= RgA[ст] -RgB[ст]-ТгР;
y10:Ст:=Ст+1;
y11: RgC:=ù RgC
y12: RgC:=РгC + 1
y13: ШZ:=RgC;
x1: определение операции;
x2: RgA [0]=0;
x3: RgB[0]=0;
x4:Ст>1.
x5: RgC[0]=0.
5.Разработанная программа на алгоритмическом языке высокого уровня, моделирующая полученную микропрограмму
#include<iostream>
#include<conio.h>
#include<math.h>
#include<stdio.h>
#include<ctype.h>
using namespace std;
//ф-ция перевода в двоичный код
bool sum(bool a, bool b, bool c)
{
bool f;
if(a==b)f=0;
else f=1;
if(f==c)f=0;
else f=1;
return f;
}
//ф-ция переноса
bool counter(bool a, bool b, bool c){
bool f=0;
if(a+b+c>1)
f=1;
return f;
}
//перевод в дк и обратно
void trans (bool a[16]){
int i=15;
while (a[i]==false)--i;//--i;
// дальше нужно инвертировать число
--i;
for( ; i >=0 ; --i)
if(a[i]==true) a[i]=false;
else a[i]=true;
}
//вывод массива числа
void out (bool a[16]){
for(int i=0; i<16; ++i)
cout << a[i] ;
cout << endl;
}
int main(){
setlocale(LC_ALL,"Rus");
bool var = 1;
while(var!=0){
cout << endl << " Введите значения А и В" << endl;
short int A , a, B, b;
cin >> A;
cin >> B;
a=abs(A);
b=abs(B);
if(!isdigit(a)==false || !isdigit(b)==false){
cout << " вы ввели не целочисленное значение" << endl;
getch();
return 0;
}
cout << " Выберите операцию: + или - " << endl;
char op;
cin >> op;
if (op !='+' && op !='-' ){
cout << " Введена некорректная операция" <<cout;
continue ;
}
if(op=='-')B=-B;
int c=pow(2.0,15.0);
if(a+b>c && a+b<-c){
cout << "Введенные значения не удовлетворяют условиям" << endl;
getch ();
return 0;
}
// перевод чисел к основанию 2
bool _a[16]={0} , _b[16]={0} , _c[16]={0};
for(int i=15; i>0; --i){
_a[i]=a%2;
_b[i]=b%2;
a=a/2;
b=b/2;
}
cout << endl << "Двоичное представление числа в пк " << A << ": ";
if (A<0)cout << "1" ;
else cout << "0" ;
for(int i=1; i<16; ++i)
cout << _a[i] ;
cout << endl << "Двоичное представление числа в пк " << B << ": ";
if (B<0)cout << "1" ;
else cout << "0" ;
for(int i=1; i<16; ++i)
cout << _b[i] ;
// проверяем знак числа для перевода в дк
if(A<0){// то переводим в дк
trans(_a);
cout << endl << endl << "Двоичное представление числа в дк " << A << ": ";
out(_a);
}
if(B<0){// то переводим в дк
trans(_b);
cout << endl << endl << "Двоичное представление числа в дк " << B << ": ";
out(_b);
}
//сложение чисел
int tetra=3,
cnt=0,// сколько тетрад мы прошли, или которую тетраду мы идем
j=16;
bool trg=0;// счетчик говорит о том, был ли перенос
do{
do{
--j;
_c[j]=sum(_a[j],_b[j],trg);
trg=counter(_a[j],_b[j],trg);
--tetra;
}while(tetra>=0);
tetra=3;
++cnt;
cout << endl <<" trg=" << trg << endl;
for(int p=j; p<16; ++p){
cout << _c[p];
}
}while (j>0);
if( A + B < 0){
trans(_c);
cout << endl << "Конечный результат в прямом коде: 1" ;
for(int i=1; i<16; ++i)
cout << _c[i] ;
}
var = 0;
cout << endl << " Начать заново 1, остановить 0 " << endl;
cin >> var;
}
getch();
return 0;
}
6. Тестовые примеры
для различных соотношений
15 + 15 = 30 (111102)
15 + (-8) = 7 (1112)
-9 – (-9) = 0
-5 + 3 = -2 ( 102 )
7. Выводы по работе
В данной лабораторной работе была смоделирована микропрограмма выполнения операций арифметического сложения и вычитания чисел в двоичной системе счисления, заданных в прямых кодах.