№
|
am
|
kam
|
as
|
kas
|
Xamas
|
Yamas
|
Famas
|
Tamas
|
1
|
a0
|
0000
|
a0
|
0000
|
x̅0
|
-
|
0
|
a0x̅0
|
2
|
a1
|
1100
|
|
|
x̅1x2
|
y0
|
|
a1x̅1x2
|
3
|
a9
|
1001
|
|
|
x̅5x̅6
|
y0
|
|
a9x̅5x̅6
|
4
|
a10
|
1010
|
|
|
x̅6
|
y0
|
|
a10x̅6
|
5
|
a11
|
0001
|
|
|
1
|
y0
|
|
a11
|
6
|
a0
|
0000
|
a1
|
1100
|
x0
|
y1,y2
|
D3,D2
|
a0x0
|
7
|
a1
|
1100
|
a2
|
0010
|
x̅1x̅2
|
y3
|
D1
|
a1x̅1x̅2
|
8
|
a2
|
0010
|
a3
|
0011
|
x3
|
y4
|
D1,D0
|
a2x3
|
9
|
a3
|
0011
|
a4
|
0101
|
1
|
y6,y7,y8
|
D2,D0
|
a3
|
10
|
a4
|
0101
|
a5
|
0100
|
1
|
y3
|
D2
|
a4
|
11
|
a8
|
1000
|
|
|
x̅4
|
y3
|
|
a8x̅4
|
12
|
a5
|
0100
|
a6
|
0110
|
1
|
y9
|
D2,D1
|
a5
|
13
|
a6
|
0110
|
a7
|
0111
|
x3
|
y4
|
D2,D1,D0
|
a6x3
|
14
|
a6
|
0110
|
a8
|
1000
|
x̅3
|
y6,y10
|
D3
|
a6x̅3
|
15
|
a7
|
0111
|
|
|
1
|
y6,y10
|
|
a7
|
16
|
a8
|
1000
|
a9
|
1001
|
x4
|
y11
|
D3,D0
|
a8x4
|
17
|
a9
|
1001
|
a10
|
1010
|
x5
|
y12
|
D3,D1
|
a9x5
|
18
|
a1
|
a11
|
0001
|
x1
|
y5
|
D0
|
a1x1
|
19
|
a2
|
0010
|
|
|
x̅3
|
y5
|
|
a2x̅3
|
20
|
a9
|
1001
|
|
|
x̅5x6
|
y13
|
|
a9x̅5x6
|
21
|
a10
|
1010
|
|
|
x6
|
y13
|
|
a10x6
|
После этого производится кодирование состояний:
ka0 -0000;1 -1100;2
-0010;3 -0011;4 -0101;5 -0100;6
-0110;7 -0111;8 -1000;9 -1001;10
-1010;11 -0001;
Кодом 0000 кодируется состояние, в котором
больше всего переходов, затем последовательно кодируем состояния с наибольшим
количеством переходов из незакодированных, кодами с минимальным количеством
единиц.
4.4 Проектирование функций выходов и управление
элементами памяти
y0= a1x̅1x2
v a9x̅5x̅6
v
a10x̅6
v a111 = y2 = a0x0
y3 = a1x̅1x̅2
v a8x̅4 v
a44 = a2x3 v a6x3 = (a2
v a6) x35 = a1x1 v a2x̅36=
a3 v a6x̅3
v a7
y7= y8= a39 = a5
y10 = a6x̅3
v a7
y11= a8x4
y12= a9x5
y13= a9x̅5x6
v a10x6
D0=a1x1 v a2x̅3va9x̅5x6v
a10x6v a8x4v a6x3v
a3 v a2x3= a1x1 v a2
v a3v a6x3v a8x4va9x̅5x6v
a10x6
D1=a1x̅1x̅2
v a2x3 v a5 v a9x5 v a6x3
D2= a0x0 v a3
v a5 v a4 v a8x̅4
v a6x3
D3=a0x0v a6x̅3
v a7 v a8x4 v a9x5
В режиме моделирования
взаимодействия УА и ОА операционное устройство представляется в виде набора
компонентов, взаимодействующих между собой по определенному алгоритму.
Рассмотрим это взаимодействие на примере обработки одного синхроимпульса:
Срабатывают компоненты ПС и ПЛУ, которые
являются синхронизируемыми, т.е. переключаются в следующее состояние только под
воздействием синхроимпульса; в результате, на выходе ПС появляется код,
сформированный на предыдущем такте компонентом КСD, а на выходе ПЛУ фиксируются
компоненты вектора X (вектор флагов условий), соответствующие X2 и X3;
Срабатывают комбинационные схемы, а именно:
Дешифратор Decoder- формирует следующее
состояние автомата;
КСY - на основании вектора X и состояния A
формирует вектор Y, который определяет набор микроопераций, выполнение которых
требуется на данном шаге выполнения;
Вектор Y обрабатывается ОА, который инициирует
выполнение тех МО, для которых компонента вектора Y равна 1, после выполнения
всех МО обновляется вектор X (точнее его компоненты X1-X6, X0 не вычисляется,
т.к. он равен 1 на протяжении всего процесса моделирования);
КСD - на основании вектора X и состояния A
формирует код D, который определяет следующее состояние автомата.
Примечание:
Для исключения влияния последовательности
выполнения МО, перед срабатыванием ОА регистры AM и BM запоминаются в буферные
регистр R с которым и производятся действия, затем их значения
восстанавливаются в исходные регистры.
Вектор X используемый компонентами КСD и КСY
отличается от вектора X на выходе ОА тем, что к нему добавляется компонента X0
и компоненты из ПЛУ (X2 и X3);
5 Описание программной
реализации
.1 Требования к оборудованию и ОС
Для функционирования программы необходим IBM -
совместимый ПК класса Pentium (с тактовой частотой от 1000 МГц) и выше,
видеорежим - VGA (минимум 16 бит), оптимальное разрешение экрана 1024х768 точек
(или больше), с установленной ОС Windows 2000 - 8.
.2 Использованная среда разработки и язык
программирования
При написании программы использовалась
интегрированная среда разработки приложений VisualStudio, язык реализации - C#.
.3 Описание структуры программы
Программа состоит из методов:
//Автоматическое
выполнениеbtAuto_Click(object sender, EventArgs e)
//Выполнение по
тактамbtStep_Click(object sender, EventArgs e)
//Очистка
формыbtClear_Click(object sender, EventArgs e)
//Операционный автомат[]
OA(byte[] Y)
//Дополнительный регистр для
выполнения нескольких операций с одним операндом за один тактSetDopReg(UInt16
Per)
//Память на D-триггерах[]
StateMemory(bool Sync, byte D0, byte D1, byte D2, byte D3)
//Память логических условий[]
LogicMemoryCond(bool Sync, bool[] X)
//ДешифраторDecoder(byte[] DTr)
//Комбинационная схема векторов
D[] KSD(byte Ai, bool[] Xx)
//Комбинационная схема векторов
Y[] KSY(byte Ai, bool[] Xi)
//Реализация
счетчикаCounter(refushort Count)
//Уровень операционного
устройстваOAandYA()
//Уровень
микропрограммыMicroprogram()
Подробное описание этих методов представлено в
Приложении 1.
6. Описание пользовательского интерфейса и
инструкция по инсталляции и запуску программы
Для запуска программы необходим только exe-файл
(Project.exe).
Для ввода исходных данных служат две таблицы,
отображающих разрядные сетки чисел А(делимое) и В(делитель). Знак вводится
самым первым символом (0 - “+” или 1 - “-”). Справа от поля ввода показываются
значения A, B в десятичном коде. Для изменения значения разряда необходимо
щелкнуть по нему левой кнопкой мыши.
Для выполнения программы в пошаговом режиме
необходимо выполнять программу по кнопке «Шаг». Для автоматического выполнения
МП нужно нажать кнопку «Автоматическое выполнение».
Режим моделирования на уровне микропрограммы или
на уровне операционного устройства зависит выбранной вкладки на панели.
На закладке "Микропрограмма" расположена
ГСА. В режиме моделирования на уровне микропрограммы на ГСА галочкой
показывается состояние на котором находится автомат.
На закладке "Взаимодействие УА и ОА"
расположена структурная схема УА с отображением всех векторов, поступающих на
вход схемы, использующихся внутри схемы и получаемых на ее выходе.
Также в программе присутствует кнопка «Сброс»,
которая обнуляет значения всех регистров и позволяет запустить МП с другими
входными данными.
Рисунок 1. Окно программы
Приложение 1
Листинг программы
//Автоматическое
выполнениеbtAuto_Click(object sender, EventArgs e)
{= true;= true;(!EndY)
{(rbOAandYA.Checked)
{();
}
{();
}
}_Ai = 0;(State_Ai);
}
//Выполнение по
тактамbtStep_Click(object sender, EventArgs e)
{= true;= true;(!EndY)
{(rbOAandYA.Checked)
{();
}
{();
}
}
}
//Очистка
формыbtClear_Click(object sender, EventArgs e)
{= 0;= false;= 0;= 0;= 0;[0] =
0;[1] = 0;[2] = 0;[3] = 0;
_X3 = false;
_X2 = false; = 0;=
"";= "";_Ai = 0;.Text = "";.Text =
"";.Text = "";= false;[0, 0].Value = 0;(RegC, 0,
tbOutC);(lvVarA, 0);(lvVarB, 0);
}
//Операционный автомат[]
OA(byte[] Y)
{(int i = 0; i < 14; i++)
{(Y[i] != 0)
{(i)
{0:_END();;1:();;2:();;3:();;4:();;5:();;6:();;7:();;8:();;9:();;10:();;11:();;12:();;13:();;
}[0] = X0();[1] = X1();[2] =
X2();[3] = X3();[4] = X4();[5] = X5();[6] = X6();X;
}
#region Логические условияX0()
{(isStart);;
}X1()
{
//A(14:0)=0((A & 0x7FFF) ==
0);
}X2()
{
//C=0 ((C & 0xF) == 0);
}X3()
{
//C(16)=1 ((C &
(UInt32)(0x10000)) == (UInt32)(0x10000));
}X4()
{(Count == 0) returntrue;;
}X5()
{
//B(0)((B & 0x1) == 1);
}X6()
{
//A(15) xor
B(16)(((A>>15)) != (B>>16));
}
#endregion
#region МикрооперацииY1()
{
//C:=A(14:0)(A);=
(UInt32)((Registr & 0x7FFF));(RegC, C, tbOutC);
}Y2()
{
//А(14:0):=B(14:0)= (UInt16)((A
& 0x8000) + (B & 0x7FFF));(lvVarA, A);
}Y3()
{
//C:=C+11. A̅(14:0)+1=
(UInt32)(C + (((UInt16)(~A) | 0x18000) + 1)); (RegC, C, tbOutC);
}Y4()
{
//C:=C+A(14:0)= (UInt32)(C + (A
& 0x7FFF));(RegC, C, tbOutC);
}Y7()
{= 0;
}
Y6()
{
//C:=L1(C.0) = C <<
1;(RegC, C, tbOutC);
}Y5()
{= true;= true;[0, 0].Value =
1;
}Y8()
{
//B(15:0):=0= B &
0x10000;(lvVarB, B);
}Y10()
{
//Cч = Сч-1(ref Count);(Count);
}Y11()
{
//С:=B(15:0)= (UInt32)(B &
0xFFFF);(RegC, C, tbOutC);
}Y9()
{
//B(15:0):=L1(B(15:0).C̅(16))= (UInt32)((B
& 0x10000) + ((B << 1) + ((~C >> 16) & 0x1) &
0xFFFF));(lvVarB, B);
}Y12()
{
//С(16:1) := С(16:1) + 1= C +
2;(RegC, C, tbOutC);
}Y13()
{
//C(16) = 1;= (UInt32)(C |
0x10000);(RegC, C, tbOutC);
}
Y0_END()
{= true;
}
#endregion
//Допол. регистр для выполнения
нескольких операций с одним операндом за один тактSetDopReg(UInt16 Per)
{= Per;
}
//Память на D-триггерах[]
StateMemory(bool Sync, byte D0, byte D1, byte D2, byte D3)
{(Sync)
{[0] = D0;[1] = D1;[2] = D2;[3]
= D3;
}DTr;
}
//Память логических условий[]
LogicMemoryCond(bool Sync, bool[] X)
{[] Xi = newbool[7];(Sync)
{[0] = true;
_X3 = X[3];
_X2 = X[2];
}Xi;
}
//ДешифраторDecoder(byte[] DTr)
{State_Ai = (byte)(DTr[0] +
DTr[1] * 2 + DTr[2] * 4 + DTr[3] * 8);
}
//Комбинационная схема векторов
D[] KSD(byte Ai, bool[] Xx)
{[] NotX = newbyte[7];[] X =
newbyte[7];[] A = newbyte[12];_X3_ = 0;Not_X3_ = 0;_X2_ = 0;Not_X2_ = 0;(int i
= 0; i < 7; i++)
{(Xx[i]) X[i] = 1;X[i] = 0;
}(int i = 0; i < 7; i++)
{(Xx[i]) NotX[i] = 0;NotX[i] =
1;
}(Ai)
{0:[0] = 1;;1:[11] = 1;;2:[2] =
1;;3:[3] = 1;;4:[5] = 1;;5:[4] = 1;;6:[6] = 1;;7:[7] = 1;;8:[8] = 1;;9:[9] =
1;;10:[10] = 1;;12:[1] = 1;;
}[0] = (byte)((A[1] & X[1])
| (A[2] & Not_X3_) | (A[2] & _X3_) | (A[9] & NotX[5] & X[6]) |
(A[10] & X[6]) | (A[8] & X[4]) | (A[6] & _X3_) | (A[3]));[1] =
(byte)((A[1] & NotX[1] & Not_X2_) | (A[2] & _X3_) | (A[5]) | (A[9]
& X[5]) | (A[6] & _X3_));[2] = (byte)((A[0] & X[0]) | (A[3]) |
(A[4]) | (A[5]) | (A[8] & NotX[4]) | (A[6] & _X3_));[3] = (byte)((A[0]
& X[0]) | ((A[6] & Not_X3_)) | (A[7]) | (A[8] & X[4]) | (A[9] &
X[5]));DTr;
}
//Комбинационная схема векторов
Y[] KSY(byte Ai, bool[] Xi)
{[] NotX = newbyte[7];[] X =
newbyte[7];[] A = newbyte[12];_X3_ = 0;Not_X3_ = 0;(Ai)
{0:[0] = 1;;1:[11] = 1;;2:[2] =
1;;3:[3] = 1;;4:[5] = 1;;5:[4] = 1;;6:[6] = 1;;7:[7] = 1;;8:[8] = 1;;9:[9] =
1;;10:[10] = 1;;12:[1] = 1;;
}(int i = 0; i < 7; i++)
{(Xx[i]) X[i] = 1;X[i] = 0;
}(int i = 0; i < 7; i++)
{(Xx[i]) NotX[i] = 0;NotX[i] =
1;
}[0] = (byte)((A[1] &
NotX[1] & X[2]) | (A[9] & NotX[5] & NotX[6]) | (A[10] &
NotX[6]) | (A[11]));[1] = (byte)(A[0] & X[0]);[2] = Y[1];[3] = (byte)((A[1]
& NotX[1] & NotX[2]) | (A[4]) | (A[8] & NotX[4]));[4] =
(byte)((A[2] & _X3_) | (A[6] & _X3_));[5] = (byte)((A[1] & X[1]) |
(A[2] & Not_X3_));[6] = (byte)((A[6] & Not_X3_) | (A[7]) | (A[3]));[7]
= A[3];[8] = A[3];[9] = A[5];[10] = (byte)((A[6] & Not_X3_) | (A[7]));[11]
= (byte)((A[8] & X[4]));[12] = (byte)((A[9] & X[5]));[13] =
(byte)((A[9] & NotX[5] & X[6]) | (A[10] & X[6]));Y;
}
//Реализация
счетчикаCounter(refushort Count)
{(Count == 0) Count =
15;Count--;
}
//Уровень операционного
устройстваOAandYA()
{= StateMemory(Sync, DTr[0],
DTr[1], DTr[2], DTr[3]);(DTr[0], DTr[1], DTr[2], DTr[3]);=
LogicMemoryCond(Sync, X);_Ai = Decoder(DTr);(State_Ai);= KSY(State_Ai, X);(Y);=
OA(Y);(X);= KSD(State_Ai, X);(DTr[0], DTr[1], DTr[2], DTr[3]);
}
//Уровень
микропрограммыMicroprogram()
{(State_Ai)
{0: //A0 (X0())
{();();_Ai = 12;
}
{_Ai = 0;
};1: //A11 _END();_Ai = 0; ;2:
//A2 (X3())
{();_Ai = 3;
}
{();_Ai = 1;
};3: //A3 ();();();_Ai = 5;;4:
//A5 ();_Ai = 6; ;5: //A4();_Ai = 4; ;6: //A6(X3())
{();_Ai = 7;
}
{_Ai = 7;
};7: //A7();();_Ai = 8;;8:
//A8(X4())
{();_Ai = 9;
}
{();_Ai = 4;
};9: //A9(X5())
{();_Ai = 10;
}
{_Ai = 10;
};10: //A10(X6())
{();_Ai = 1;
}
{_Ai = 1;
};12: //A1(X1())
{();_Ai = 1;
}
{(X2())
{_Ai = 1;
}
{();_Ai = 2;
};
}(State_Ai);
}
//При клике на регистр
AlvVarA_ColumnClick(object sender, ColumnClickEventArgs e)
{(lvVarA.Items[0].SubItems[e.Column].Text
== "0").Items[0].SubItems[e.Column].Text =
"1";.Items[0].SubItems[e.Column].Text = "0";();
}
//Ввод данных с
формыCollectString()
{= "";=
"";perem = "";perem2 = "";(int i = 1; i <
+lvVarA.Items[0].SubItems.Count; i++)
{+=
lvVarA.Items[0].SubItems[i].Text;
}(lvVarA.Items[0].SubItems[0].Text
== "1")
{= "-";
}(int i = 1; i < +lvVarB.Items[0].SubItems.Count;
i++)
{+=
lvVarB.Items[0].SubItems[i].Text;
}(lvVarB.Items[0].SubItems[0].Text
== "1")
{= "-";
}(perem, perem2);
}
//При клике на регистр
BlvVarB_ColumnClick(object sender, ColumnClickEventArgs e)
{(lvVarB.Items[0].SubItems[e.Column].Text
== "0").Items[0].SubItems[e.Column].Text =
"1";.Items[0].SubItems[e.Column].Text = "0";();
}
//Получаем десятичные значения
A и BSetVars(string param, string param2)
{rab = 0;res = 0;=
Convert.ToUInt16(firstVar, 2);(int col = 0; col < 15; col++)
{+= Math.Pow(2, 0 - col-1) *
Double.Parse(firstVar[col].ToString());
}= Convert.ToUInt16(firstVar,
2);(param == "-") A += 32768;= Math.Round(res, 5);.Text = param +
res.ToString("0.#####");= 0;(int col = 0; col <16; col++)
{+= Math.Pow(2, 0 - col-1) *
Double.Parse(secondVar[col].ToString());
}= Convert.ToUInt32(secondVar,
2);= Math.Round(res, 6);.Text = param2 +
res.ToString("0.######");(param2 == "-") B += 65536;
}
//Вывод в регистр счетчика на
формуRegCh(ushort C)
{Rab = 0;= C;(Rab % 2 == 1)
RegCH[3, 0].Value = 1;RegCH[3, 0].Value = 0;= (ushort)(Rab / 2);(Rab % 2 == 1)
RegCH[2, 0].Value = 1;RegCH[2, 0].Value = 0;= (ushort)(Rab / 2);(Rab % 2 == 1)
RegCH[1, 0].Value = 1;RegCH[1, 0].Value = 0;= (ushort)(Rab / 2);(Rab % 2 == 1)
RegCH[0, 0].Value = 1;RegCH[0, 0].Value = 0;
}
//Вывод в регистр
АSetA(ListView L, UInt32 Ch)
{(int i = 15; i >= 0; i--)
{(Ch % 2 == 0)
L.Items[0].SubItems[i].Text = "0";L.Items[0].SubItems[i].Text =
"1";= Ch / 2;
}
//Вывод в регистр
BSetB(ListView L, UInt32 Ch)
{(int i = 16; i >= 0; i--)
{(Ch % 2 == 0)
L.Items[0].SubItems[i].Text = "0";L.Items[0].SubItems[i].Text =
"1";= Ch / 2;
}
//Вывод результата в регистр
результата СSetsResult(ListView L, UInt32 Ch, TextBox T)
{res = 0;valX = Ch;(Ch != 0)
{(int i = 16; i >= 0; i--)
{(Ch % 2 == 0)
L.Items[0].SubItems[i].Text = "0";L.Items[0].SubItems[i].Text =
"1";= (UInt32)(Ch / 2);
}(int col = 1; col <=16;
col++)
{+= Math.Pow(2, 0 - col) *
Double.Parse(L.Items[0].SubItems[col].Text);
}= Math.Round(res, 6);.Text =
res.ToString("0");(L.Items[0].SubItems[0].Text == "1").Text
= T.Text.Insert(0, "-");
}
//Вывод A на
формуstateChanged(UInt16 a_in)
{.Checked = false;.Checked =
false;.Checked = false;.Checked = false;.Checked = false;.Checked =
false;.Checked = false;.Checked = false;.Checked = false;.Checked =
false;.Checked = false;.Checked = false;.Checked = false;.Checked =
false;.Checked = false;.Checked = false;.Checked = false;.Checked =
false;.Checked = false;.Checked = false;.Checked = false;.Checked = false;.Checked
= false;.Checked = false;.Checked = false;(a_in)
{0:.Checked = true;.Checked =
true;.Checked = true;;1:.Checked = true;.Checked = true;;2:.Checked =
true;.Checked = true;;3:.Checked = true;.Checked = true;;4:.Checked =
true;.Checked = true;;5:.Checked = true;.Checked = true;;6:.Checked =
true;.Checked = true;;7:.Checked = true;.Checked = true;;8:.Checked =
true;.Checked = true;;9:.Checked = true;.Checked = true;;10:.Checked =
true;.Checked = true;;12:.Checked = true;.Checked = true;;
}
// Вывод X на формуshowX(bool[]
X)
{(int i = 0; i < X.Length;
i++)
{(i)
{0: chkBxOUx0_mem.Checked =
X[i];;1: chkBxOUx1_mem.Checked = X[i];;2: chkBxOUx2_mem.Checked = _X2;;3:
chkBxOUx3_mem.Checked = _X3;;4: chkBxOUx4_mem.Checked = X[i];;5:
chkBxOUx5_mem.Checked = X[i];;6: chkBxOUx6_mem.Checked = X[i];;
}
//Вывод Q на формуshowQ(int Q0,
int Q1, int Q2, int Q3)
{.Checked = (Q0 != 0);.Checked
= (Q1 != 0);.Checked = (Q2 != 0);.Checked = (Q3 != 0);
}
//Вывод D на формуshowD(int D0,
int D1, int D2, int D3)
{.Checked = (D0 != 0);.Checked
= (D1 != 0);.Checked = (D2 != 0);.Checked = (D3 != 0);
}
//Вывод Y на формуshowY(byte[]
Y)
{(int i = 0; i < Y.Length;
i++)
{(i)
{1: chkBxOUy1.Checked = (Y[i]
!= 0);;2: chkBxOUy2.Checked = (Y[i] != 0);;3: chkBxOUy3.Checked = (Y[i] !=
0);;4: chkBxOUy4.Checked = (Y[i] != 0);;5: chkBxOUy5.Checked = (Y[i] != 0);;6:
chkBxOUy6.Checked = (Y[i] != 0);;7: chkBxOUy7.Checked = (Y[i] != 0);;8:
chkBxOUy8.Checked = (Y[i] != 0);;9: chkBxOUy9.Checked = (Y[i] != 0);;10:
chkBxOUy10.Checked = (Y[i] != 0);;11: chkBxOUy11.Checked = (Y[i] != 0);;12:
chkBxOUy12.Checked = (Y[i] != 0);;13: chkBxOUy13.Checked = (Y[i] != 0);;
}