Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив2 / курсач docx80 / 30_kursach_diskr.docx
Скачиваний:
43
Добавлен:
07.08.2013
Размер:
467.36 Кб
Скачать

Структурная схема оа

Одним из основных элементов структурной схемы ОА является набор сигналов. Условно сигналы делят на 2 группы, то есть управляющие сигналы и оповещающие сигналы.

Под управляющим сигналами понимаются микрооперации надо регистрами и сумматорами и счетчиками, такие как сдвиг, сложение, начало/конец операции.

Оповещающий сигнал это логическое условие, для выбора набора управляющих сигналов. Оповещающих сигналов, как правило по количеству меньше чем управляющих.

Управляющий сигнал

Микрооперация

Оповещающие сигналы

Логическое условие

Y1

Smm=0,Tg=0 Rg1m=Ma

Rg1p=Pa Rg2m=Mb Rg2p=Pb Сч=N-2

X1

Rg1M=0

Y2

Smp= Smp+Rg2p

X2

Rg2M=0

Y3

Smm=Smm+Rg1m,Тг=0

X3

Cч=0

Y4

Smm,Rg2mсдвиг вправо Сч=Сч-1

X4

Тг=0

Y5

Smm=Smm-Rg1m,Тг=1

X5

Rg2m[n-1]=0

Y6

Smm=Smm cдвиг влево

X6

Rg2m[n]=0

Y7

SmP=Smp-1(k)

X7

SMM(2)SMM(3)=1

Y8

Smp=Smp+1(k)

X8

SMM(1)SMM(2)=1

Y9

Smm=Smm cдвиг вправо

X9

RG1P(1)RG2P(1)=1

Y10

Smm=0

X10

SMP(1)RG1P(1)=1

Y11

Smp=+∞

X11

SMM(1)=1

Y12

Вывод SMM,SMP

X12

SMM(1)=1SMM(2)=1

Y13

Smm=Smm+Rg1m

X13

SMM(1)=0SMM(2)=0

Y14

Smm=Smm-Rg1m

Y15

Smm= Rg1m. Rg1m=0

Y16

Smm=Smm-Rg2m

Y17

Smm=Smm Rg1m= Rg1m cдвиг влево

Y18

Rg1m(N)=1

Y19

Rg1m(N)=0

Y20

Smm= Rg1m

Y21

Smp=Smp+Rg2p

Таблица 1 – Управляющие и Оповещающие сигналы.

Далее приведена схема ОА.

Рисунок 6 – Схема ОА.

Листинг программы

Ниже приведен листинг программы. Программа моделирующая устройство на ПК написана на языке С++. Это дает некоторое преимущественно в побитовой обработке данных введенных пользователем.

Рисунок 7 – Работа программы в режиме умножения

Рисунок 8 – Работа программы в режиме деления

program Zachot;

{$APPTYPE CONSOLE}

{%File 'treble.in'}

{%File 'treble.out'}

uses

SysUtils;

var

okrp,okr,smm,smp,rg1m,rg2m,rg1p,rg2p:string;

sch,i,a,s:integer;

p,straz,j,f,x:byte;

procedure vyvod;

begin

if x=1 then

writeln(smm,' ',smp)

else

writeln(rg2m,' ',smp);

end;

{function max(s1,s2:string):string;

var

h:string;

t,y,c:integer;

begin

h:=s1;

delete(h,1,2);

val(h,t,c);

h:=s2;

delete(h,1,2);

val(h,y,c);

if t>y then

max:=s1

else

max:=s2;

end;}

function convob(s:string;h:integer):string;

var

n,o:integer;

begin

o:=h;

n:=0;

if s=smp then

n:=1;

repeat

if s[h]='1' then

s[h]:='0'

else

s[h]:='1';

dec(h);

until h=0;

if n<>1 then

begin

s[1]:='1';

if (o=a+1) or (o=a) then

s[2]:='1';

end;

convob:=s;

end;

procedure provn0(s:string);

var

bufs:string;

bufi:integer;

begin

bufs:=s;

delete(bufs,1,2);

val(bufs,bufi,i);

if bufi=0 then

begin

if ((x=0) and (s=rg1m)) then

begin

smm:='infinity';

smp:='';

end;

vyvod;

f:=1;

end;

end;

function sum(s1,s2:string;h:integer):string;

var

bufs:string;

i,k,d:integer;

begin

d:=0;

k:=0;

for i:=h+1 downto 1 do

begin

if (s1[i]='0') and (s2[i]='0') then

d:=d+0;

if ((s1[i]='0') and (s2[i]='1')) or ((s1[i]='1') and (s2[i]='0')) then

d:=d+1;

if (s1[i]='1') and (s2[i]='1') then

begin

d:=d+0;

k:=1;

end;

k:=(d div 2)+k;

d:=(d mod 2);

str(d,bufs);

s1[i]:=bufs[1];

d:=k;

k:=0;

end;

sum:=s1;

end;

function convd(s1:string;u:integer):string;

var

r:string;

begin

s1:=convob(s1,u);

if u=(a+1) then

r:=sum(s1,okr,u);

if u=s then

r:=sum(s1,okrp,u);

if u=a then

r:=sum(s1,okr,u);

convd:=r;

end;

procedure provsmp;

var

l:integer;

begin

if (((rg1p[1]='1') and (rg2p[1]='1')) or ((rg1p[1]='0') and (rg2p[1]='0'))) then

if ((smp[1]='1') and (rg1p[1]='1')) then

begin//на "-0"

if sum(smp,convd(okrp,s),s-1)[1]='0' then

for l:=1 to a+1 do

smm[l]:='0';

end

else

if (((smp[1]='1') and (rg1p[1]='0')) or ((smp[1]='0') and (rg1p[1]='1'))) then

begin

if rg1p[1]<>'0' then

for l:=1 to a+1 do

smm[l]:='0'

else

begin

smm:='infinity';

smp:='';

end;

end;

end;

begin

assign(input,'treble.in');

assign(output,'treble.out');

reset(input);

rewrite(output);

readln(x);

readln(rg1m);

readln(rg1p);

readln(rg2m);

readln(rg2p);

smm:='';

smp:='';

okr:='';

okrp:='';

j:=0;

f:=0;

p:=0;

a:=length(rg1m);{число n}

s:=length(rg1p);{число k}

for i:=1 to a+1 do

begin

smm:=smm+'0';

okr:=okr+'0';

end;

if x=0 then

begin

delete(smm,a+1,1);

delete(okr,a+1,1);

end;

okr[length(okr)]:='1';

for i:=1 to s do

begin

okrp:=okrp+'0';

smp:=smp+'0';

end;

okrp[s]:='1';

if x=1 then

begin

if rg1m[1]='1' then//при выборе операции умножения

rg1m:=convob(rg1m,a);

if rg2m[1]='1' then

rg2m:=convob(rg2m,a);

sch:=a-2;{счётчик}

provn0(rg1m);

if f<>1 then

provn0(rg2m);

if rg2m[1]='1' then

j:=1;

if f<>1 then

begin

rg1m:=rg1m+'0';

smm:=rg1m;

repeat//умножение

if rg2m[a]='1' then

smm:=sum(smm,rg1m,a);//суммирование

delete(smm,a+1,1);//сдвиг smm

if ((smm[1]='0') and (smm[2]='0')) or ((smm[1]='0') and (smm[2]='1')) then

smm:='0'+smm;

if ((smm[1]='1') and (smm[2]='1')) or ((smm[1]='1') and (smm[2]='0')) then

smm:='1'+smm;

delete(rg2m,a,1);//сдвиг rg2m

if j=1 then

rg2m:='1'+rg2m

else

rg2m:='0'+rg2m;

dec(sch);

until (sch=0);

rg1m:=convd(rg1m,a);

smm:=sum(smm,rg1m,a);

smm:=sum(smm,okr,a);

if rg1p[1]='0' then

smp:=rg1p

else

smp:=convd(rg1p,s);

if rg2p[1]='0' then

smp:=sum(smp,rg2p,s-1)

else

smp:=sum(smp,convd(rg2p,s),s-1);

if (((smm[2]='0') and (smm[3]='0')) or ((smm[2]='1') and (smm[3]='1'))) then//норм-я мантиссы

begin

delete(smm,1,1);//сдвиг smm <--<3--x

smm:=smm+'0';

end;

provsmp;

vyvod;

end;

end

else

begin//деление

if (((rg1m[1]='0') and (rg2m[1]='1')) or ((rg2m[1]='1') and (rg1m[1]='0'))) then//знак частного

j:=1;

smm:=rg1m;

if smm[1]='1' then

begin

smm[1]:='0';

smm[2]:='0';

end;

rg1m:=rg2m;

if rg2m[1]='1' then

begin

rg1m[1]:='0';

rg1m[2]:='0';

end;

for i:=1 to a do

rg2m[i]:='0';

provn0(smm);

if f<>1 then

provn0(rg1m);

if f<>1 then

begin

smm:=sum(smm,convd(rg1m,a),a-1);//0 цикл

if smm[1]='0' then

rg2m[a]:='1';

sch:=a-2;//счётчик

straz:=0;

if rg1m[3]=rg1m[4] then //0010 or 0011

straz:=1;

repeat

delete(smm,1,1);//сдвиг smm

smm:=smm+'0';

delete(rg2m,1,1);//сдвиг rg2m

rg2m:=rg2m+'0';

if (((smm[2]='0') and (smm[3]='1') and (smm[4]='1')) or ((smm[2]='1') and (smm[3]='0') and (smm[4]='0'))) then

p:=1;

if ((straz=0) and ((smm[2]='0') and (smm[3]='1') and (smm[4]='0'))) then

p:=1;

if p=1 then

begin

if smm[1]='1' then

smm:=sum(smm,rg1m,a-1)

else

smm:=sum(smm,convd(rg1m,a),a-1);

if smm[1]='0' then

rg2m[a]:='1'

else

rg2m[a]:='0';

end

else

rg2m[a]:=smm[1];

p:=0;

dec(sch);

until sch=0;

smp:=sum(rg1p,convd(rg2p,s),s);

provsmp;

if j=1 then

begin

rg2m[1]:='1';

rg2m[2]:='1';

end;

vyvod;

end;

end;

close(input);

close(output);

end.

Листинг 2 – Моделирование операции деления на ПК.

Соседние файлы в папке курсач docx80