Разработка среды для имитационного моделирования операционного устройства

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Оглавление

1. Исходные данные и общие требования к курсовой работе

1.1 Исходные данные

1.2 Язык программирования и графический режим

1.3 Отчетные материалы к курсовому проекту

2. Авторская оценка соответствия качества проекта предъявляемым требованиям

3. Математическая постановка задачи

3.1 Основные признаки микропрограммы

3.2 Описание структурной схемы ОУ

4. Описание процесса проектирования

4.1 Кодирование М О и ЛУ

4.2 Разметка состояний автомата

4.3 Проверка полноты переходов и построение обратной структурной таблицы автомата

4.4 Проектирование функций выходов и управление элементами памяти

5. Описание программной реализации

5.1 Требования к оборудованию и ОС

5.2 Использованная среда разработки и язык программирования

6. Описание пользовательского интерфейса и инструкция по инсталляции и запуску программы

Приложение 1. Листинг программы

1. Исходные данные и общие требования к курсовой работе

1.1 Исходные данные

таблица интерфейс инсталляция программа

Исходными данными к курсовой работе являются:

— микропрограмма выполнения арифметической операции в виде ГСА (см. Рис. 1);

— требования к реализуемым уровням и режимам моделирования объекта;

— требования к обязательным возможностям интерфейсных средств среды моделирования;

— требования к оформлению пояснительной записки и особенностям программной реализации.

Операционное устройство считается состоящим из управляющего автомата (УА) и операционного автомата (ОА).

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

Форматы разрядных сеток для представления данных определены в каждой ГСА. Для представления этих данных в модели студент должен выбрать наиболее подходящие типы данных используемого языка программирования.

В интерактивной среде моделирования реализуются два уровня моделирования ОУ:

— моделирование на уровне микропрограммы;

— моделирование на уровне взаимодействия УА и ОА;

Моделирование ОУ на уровне микропрограммы.

Ветвления в алгоритме программируются средствами условного оператора if. Модель отдельной микрокоманды представляет собой последовательный вызов соответствующих процедур, моделирующих выполнения микроопераций. Эта последовательность закладывается в разрабатываемый программный код модели.

В результате такого моделирования ОУ можно проверить правильность микропрограммы выполнения арифметической операции.

Моделирование ОУ на уровне взаимодействия УА и ОА.

Модель УА строится на основании результатов проектирования УА как автомата Мили на жесткой логике.

Модель УА формирует вектор Y управляющих сигналов, детализирующий команды для ОА до уровня микроопераций. Модель О А в результате анализа состояния вектора Y вызывает процедуры выполнения указанных вектором микроопераций и затем вычисляет вектор X значений выходных сигналов, поступающих на вход УА.

В модели этого режима запрещается закладывать в программу какую-либо последовательность вызовов процедур моделирования микроопераций. Каждая такая процедура может быть вызвана только как следствие обнаружения конкретного (например, единичного) состояния определенной компоненты вектора Y.

Модель УА должна выделять такие его компоненты, как:

— память состояний (ПС) УА на D триггерах;

— дешифратор кодов (ДК) состояний УА (это необязательный структурный компонент УА);

— комбинационные схемы (КС), формирующие вектор выходных сигналов Y, и вектор D сигналов управления состояниями разрядов ПС УА,

— память на D триггерах для запоминания некоторых компонент вектора логических условий.

Модели КС строятся на функциональном уровне, т. е. как последовательность булевых выражений, вычисляющих компоненты векторов Y и D.

В интерактивной среде на каждом из уровней моделирования реализуются два режима моделирования ОУ:

— пошаговый режим выполнения микропрограммы;

— автоматический режим выполнения микропрограммы.

В первом из режимов предполагается наличие на форме кнопки с надписью типа «Такт». Каждое нажатие такой кнопки должно вызывать продвижение по микропрограмме на 1 такт. Причем, этот такт должен соответствовать понятию такта работы ОУ при проектировании УА на основе модели цифрового управляющего автомата типа Мили.

В автоматическом режиме предполагается наличие на форме кнопки с надписью типа «Выполнить МП». При нажатии на эту кнопку микропрограмма выполняется с начала до конца без вмешательства со стороны пользователя, то есть автоматически.

Интерфейсные средства среды моделирования должны позволять:

— наблюдать на экране ГСА, размеченную состояниями автомата модели Мили;

— выбирать любой из описанных выше уровней и режимов моделирования:

— задавать начальные значения операндов операции;

— просматривать процесс выполнения микропрограммы по шагам (по тактам) с отображением на форме всех используемых в микропрограмме кодов;

— выполнять микропрограмму автоматически;

— отображать все изменения кодов переменных, участвующих в микропрограмме;

— при моделировании на уровне взаимодействия УА и ОА отображать на форме состояния векторов, задающих все входные, выходные и внутренние векторы УА в предположении, что УА спроектирован как автомат модели Мили на жесткой логике с элементами памяти на D триггерах, а так же отображать на ГСА графическую метку, задающую текущее состояние УА.

Рис. 1. ГСА

1.2 Язык программирования и графический режим

Программная часть курсового проекта выполняется с использованием среды C# или среды какого-либо иного языка программирования высокого уровня, предназначенной для создания Windows приложений. Использованный графический режим должен быть не хуже, чем TrueColor с пространственным разрешением 1024*768 пикселей.

1.3 Отчетные материалы к курсовому проекту

В качестве результата выполнения курсового проекта представляются:

— какой либо носитель информации;

— пояснительная записка.

Носитель информации должен содержать:

— исходные тексты всех разработанных программных единиц;

— комплект файлов, достаточный для запуска программы из соответствующей операционной системы (ОС) и среды разработки;

— «бумажную» и электронную версии пояснительной записки, выполненную в текстовом процессоре Word версии 2000 или выше с соблюдением требований ГОСТов на оформление технических текстов;

— файл readme с информацией об авторе, языке программирования и об ОС.

Пояснительная записка должна:

— отображать процесс проектирования программного продукта;

— содержать описание программной реализации;

— содержать инструкции пользователю с описанием интерфейсных средств.

2. Авторская оценка соответствия качества проекта предъявляемым требованиям

Программа удовлетворяет всем основным требованиям, изложенным в задании. В ней реализовано два режима работы ОУ (на уровне микропрограммы и на уровне взаимодействия УА и ОА), и отображение всей требуемой вспомогательной информации участвующей в арифметической операции.

Программирование осуществлялось в среде, соответствующей общим требованиям к курсовому проекту с использованием принципов объектно-ориентированного программирования. Модель на проведенных тестах вела себя адекватно реальному автомату.

3. Математическая постановка задачи

3.1 Основные признаки микропрограммы

Математическая постановка задачи заключалась в создании программной реализации модели УА на основе автомата Мили на жесткой логике на D-триггерах.

Микропрограмма данной курсовой работы осуществляет операцию деления без восстановления остатка.

А (15: 0) — делимое, представленное в прямом коде;

Разрядная сетка: 16 бит;

В (16: 0) — делитель, представленный в прямом коде;

Разрядная сетка: 17 бит;

С (16: 0) — частное, представленное в прямом коде;

Разрядная сетка: 17 бит;

СЧ (3: 0) — счетчик циклов;

Разрядная сетка: 4 бита;

ПП — признак переполнения.

Описание особенностей алгоритма, заданного в виде ГСА:

1. В МП предусмотрен исход «Переполнение разрядной сетки». Переполнение фиксируется, если делитель принимает значение, равное нулю. Также переполнение фиксируется, если AB. Это означает, что частное должно быть по модулю строго меньше 1. Операнды A и B так же должны быть по модулю строго меньше 1.

2. В МП предусмотрен ускоренный вариант получения частного в случае, когда делимое равно 0.

3. В МП операнды предполагаются представленными в прямом коде.

4. В МП количество повторений цикла всегда на 1 больше количества вычисляемых разрядов частного. Поэтому при завершении циклической части выполняются МО по округлению вычисленного частного.

5. В МП реализован алгоритм деления без восстановления остатка.

3.2 Описание структурной схемы ОУ

Рис. 2. Структурная схема ОУ

Операционное устройство состоит из операционного автомата (ОА) и управляющего автомата (УА). Структура О А при этом не рассматривается.

На структурной схеме (см. рис. 2) представлены следующие компоненты УА:

— память состояний (ПС) УА на D триггерах, которая предназначена для хранения состояний. Входными данными для ПС являются выходные данные КС D.

— дешифратор кодов (ДШ) состояний УА;

— комбинационные схемы (КС), формирующие вектор выходных сигналов Y, и вектор D сигналов управления состояниями разрядов ПС УА;

— память на D триггерах для запоминания некоторых компонент вектора логических условий.

Поскольку УА является автоматом Мили, необходимо было добавить память логических условий (ПЛУ) для условий, которые обозначены на ГСА метками X2, X3. Если бы это не было сделано, ОА выполнял бы МО из одной ветви алгоритма, а УА мог перейти в состояние по другой ветви. Выделять память для хранения каждого конкретного условия нужно только в том случае, если в МП за этим условием следует блок МО, который может изменить состояние данного условия.

Для X0, X1, X4, X5, X6 выделение памяти не требуется ввиду сказанного выше. Выделение памяти требуется для условий X2 и X3 т. к. на ГСА следом за блоками проверки условий X2 и X3 находятся блоки, изменяющие содержимое C. Если не запоминать значения X2, X3, может возникнуть ситуация, когда ОА выполнит изменение C, и изменится значение X2 и (или) X3, и в пределах этого же такта КС D будет работать с уже измененными X2 и X3. В результате УА перейдет в некорректное состояние.

Формирование управляющих сигналов выполняет комбинационная схема «КС Y». Формирование сигналов для перехода к следующему состоянию выполняет комбинационная схема «КС D».

КС Y и КС D в качестве входных данных, используют выходные сигналы ПС и сигналы, указывающие состояние логических условий: X0, X1, X'2, X'3, X4, X5 и X6. X'2 и X'3 — выходы ПЛУ. Они соответствуют значениям X2 и X3 на момент начала такта (до выполнения МО).

4. Описание процесса проектирования

4. 1 Кодирование М О и ЛУ

Таблица 1. Кодирование МО

МО

МК

1

Выполнено

y0

2

C: =A (14:0)

y1

3

А (14: 0):=B (14:0)

y2

4

C: =C+11. A?(14:0)+1

y3

5

C: =C+A (14:0)

y4

6

ПП: =1

y5

7

C: =L1(C. 0)

y6

8

СЧ: =0

y7

9

B (15: 0):=0

y8

10

B (15: 0):=L1(B (15:0). C?(16))

y9

11

СЧ: =СЧ-1

y10

12

С: =B (15:0)

y11

13

C (16: 1):=C (16:1)+1

y12

14

C (16): =1

y13

Таблица 2. Кодирование Л У.

ЛУ

Код ЛУ

1

Пуск

x0

2

A (14: 0)=0

x1

3

C=0

x2

4

C (16)=1

x3

5

СЧ=0

x4

6

B (0)

x5

7

A (15) + B (16)

x6

Выполнив кодирование, разметим исходную ГСА (Рис. 1).

4.2 Разметка состояний автомата

Рис. 3. Разметка состояний автомата

4.3 Проверка полноты переходов и построение обратной структурной таблицы автомата

Таблица 3. Обратная структурная таблица автомата.

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

1100

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;

ka1 -1100;

ka2 -0010;

ka3 -0011;

ka4 -0101;

ka5 -0100;

ka6 -0110;

ka7 -0111;

ka8 -1000;

ka9 -1001;

ka10 -1010;

ka11 -0001;

Кодом 0000 кодируется состояние, в котором больше всего переходов, затем последовательно кодируем состояния с наибольшим количеством переходов из незакодированных, кодами с минимальным количеством единиц.

4.4 Проектирование функций выходов и управление элементами памяти

y0= a1x?1x2 v a9x?5x?6 v a10x?6 v a11

y1 = y2 = a0x0

y3 = a1x?1x?2 v a8x?4 v a4

y4 = a2x3 v a6x3 = (a2 v a6) x3

y5 = a1x1 v a2x?3

y6= a3 v a6x?3 v a7

y7= y8= a3

y9 = 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 Описание программной реализации

5.1 Требования к оборудованию и ОС

Для функционирования программы необходим IBM — совместимый ПК класса Pentium (с тактовой частотой от 1000 МГц) и выше, видеорежим — VGA (минимум 16 бит), оптимальное разрешение экрана 1024×768 точек (или больше), с установленной ОС Windows 2000 — 8.

5.2 Использованная среда разработки и язык программирования

При написании программы использовалась интегрированная среда разработки приложений VisualStudio, язык реализации — C#.

5.3 Описание структуры программы

Программа состоит из методов:

//Автоматическое выполнение

privatevoid btAuto_Click (object sender, EventArgs e)

//Выполнение по тактам

privatevoid btStep_Click (object sender, EventArgs e)

//Очистка формы

privatevoid btClear_Click (object sender, EventArgs e)

//Операционный автомат

privatebool[] OA (byte[] Y)

//Дополнительный регистр для выполнения нескольких операций с одним операндом за один такт

publicvoid SetDopReg (UInt16 Per)

//Память на D-триггерах

publicbyte[] StateMemory (bool Sync, byte D0, byte D1, byte D2, byte D3)

//Память логических условий

publicbool[] LogicMemoryCond (bool Sync, bool[] X)

//Дешифратор

publicbyte Decoder (byte[] DTr)

//Комбинационная схема векторов D

publicbyte[] KSD (byte Ai, bool[] Xx)

//Комбинационная схема векторов Y

publicbyte[] KSY (byte Ai, bool[] Xi)

//Реализация счетчика

publicvoid Counter (refushort Count)

//Уровень операционного устройства

publicvoid OAandYA ()

//Уровень микропрограммы

publicvoid Microprogram ()

Подробное описание этих методов представлено в Приложении 1.

6. Описание пользовательского интерфейса и инструкция по инсталляции и запуску программы

Для запуска программы необходим только exe-файл (Project. exe).

Для ввода исходных данных служат две таблицы, отображающих разрядные сетки чисел А (делимое) и В (делитель). Знак вводится самым первым символом (0 — «+» или 1 — «-»). Справа от поля ввода показываются значения A, B в десятичном коде. Для изменения значения разряда необходимо щелкнуть по нему левой кнопкой мыши.

Для выполнения программы в пошаговом режиме необходимо выполнять программу по кнопке «Шаг». Для автоматического выполнения МП нужно нажать кнопку «Автоматическое выполнение».

Режим моделирования на уровне микропрограммы или на уровне операционного устройства зависит выбранной вкладки на панели.

На закладке «Микропрограмма» расположена ГСА. В режиме моделирования на уровне микропрограммы на ГСА галочкой показывается состояние на котором находится автомат.

На закладке «Взаимодействие У А и ОА» расположена структурная схема УА с отображением всех векторов, поступающих на вход схемы, использующихся внутри схемы и получаемых на ее выходе.

Также в программе присутствует кнопка «Сброс», которая обнуляет значения всех регистров и позволяет запустить МП с другими входными данными.

Рисунок 1. Окно программы

Приложение 1

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

//Автоматическое выполнение

privatevoid btAuto_Click (object sender, EventArgs e)

{

Sync = true;

isStart = true;

while (!EndY)

{

if (rbOAandYA. Checked)

{

OAandYA ();

}

else

{

Microprogram ();

}

}

State_Ai = 0;

stateChanged (State_Ai);

}

//Выполнение по тактам

privatevoid btStep_Click (object sender, EventArgs e)

{

Sync = true;

isStart = true;

if (!EndY)

{

if (rbOAandYA. Checked)

{

OAandYA ();

}

else

{

Microprogram ();

}

}

}

//Очистка формы

privatevoid btClear_Click (object sender, EventArgs e)

{

Count = 0;

PP = false;

A = 0;

B = 0;

C = 0;

DTr[0] = 0;

DTr[1] = 0;

DTr[2] = 0;

DTr[3] = 0;

_X3 = false;

_X2 = false;

Registr = 0;

firstVar = ««;

secondVar = ««;

State_Ai = 0;

tbDecA. Text = ««;

tbDecB. Text = ««;

tbOutC. Text = ««;

EndY = false;

RegPP[0, 0]. Value = 0;

SetsResult (RegC, 0, tbOutC);

SetA (lvVarA, 0);

SetB (lvVarB, 0);

}

//Операционный автомат

privatebool[] OA (byte[] Y)

{

for (int i = 0; i < 14; i++)

{

if (Y[i] ≠ 0)

{

switch (i)

{

case 0:

Y0_END ();

break;

case 1:

Y1();

break;

case 2:

Y2();

break;

case 3:

Y3();

break;

case 4:

Y4();

break;

case 5:

Y5();

break;

case 6:

Y6();

break;

case 7:

Y7();

break;

case 8:

Y8();

break;

case 9:

Y9();

break;

case 10:

Y10();

break;

case 11:

Y11();

break;

case 12:

Y12();

break;

case 13:

Y13();

break;

}

X[0] = X0();

X[1] = X1();

X[2] = X2();

X[3] = X3();

X[4] = X4();

X[5] = X5();

X[6] = X6();

return X;

}

#region Логические условия

publicbool X0()

{

if (isStart)

returntrue;

returnfalse;

}

publicbool X1()

{

//A (14: 0)=0

return ((A & 0x7FFF) == 0);

}

publicbool X2()

{

//C=0

return ((C & 0xF) == 0);

}

publicbool X3()

{

//C (16)=1

return ((C & (UInt32)(0×10 000)) == (UInt32)(0×10 000));

}

publicbool X4()

{

if (Count == 0) returntrue;

elsereturnfalse;

}

publicbool X5()

{

//B (0)

return ((B & 0×1) == 1);

}

publicbool X6()

{

//A (15) xor B (16)

return (((A> >15)) ≠ (B> >16));

}

#endregion

#region Микрооперации

publicvoid Y1()

{

//C: =A (14:0)

SetDopReg (A);

C = (UInt32)((Registr & 0x7FFF));

SetsResult (RegC, C, tbOutC);

}

publicvoid Y2()

{

//А (14: 0):=B (14:0)

A = (UInt16)((A & 0×8000) + (B & 0x7FFF));

SetA (lvVarA, A);

}

publicvoid Y3()

0x18000) + 1));

SetsResult (RegC, C, tbOutC);

publicvoid Y4()

{

//C: =C+A (14:0)

C = (UInt32)(C + (A & 0x7FFF));

SetsResult (RegC, C, tbOutC);

}

publicvoid Y7()

{

Count = 0;

}

publicvoid Y6()

{

//C: =L1(C. 0)

C = C < < 1;

SetsResult (RegC, C, tbOutC);

}

publicvoid Y5()

{

PP = true;

EndY = true;

RegPP[0, 0]. Value = 1;

}

publicvoid Y8()

{

//B (15: 0):=0

B = B & 0×10 000;

SetB (lvVarB, B);

}

publicvoid Y10()

{

//Cч = Сч-1

Counter (ref Count);

RegCh (Count);

}

publicvoid Y11()

{

//С: =B (15:0)

C = (UInt32)(B & 0xFFFF);

SetsResult (RegC, C, tbOutC);

}

publicvoid Y9()

{

//B (15: 0):=L1(B (15:0). C?(16))

B = (UInt32)((B & 0×10 000) + ((B < < 1) + ((~C > > 16) & 0×1) & 0xFFFF));

SetB (lvVarB, B);

}

publicvoid Y12()

{

//С (16: 1) := С (16: 1) + 1

C = C + 2;

SetsResult (RegC, C, tbOutC);

}

publicvoid Y13()

//C (16) = 1;

C = (UInt32)(C

publicvoid Y0_END ()

{

EndY = true;

}

#endregion

//Допол. регистр для выполнения нескольких операций с одним операндом за один такт

publicvoid SetDopReg (UInt16 Per)

{

Registr = Per;

}

//Память на D-триггерах

publicbyte[] StateMemory (bool Sync, byte D0, byte D1, byte D2, byte D3)

{

if (Sync)

{

DTr[0] = D0;

DTr[1] = D1;

DTr[2] = D2;

DTr[3] = D3;

}

return DTr;

}

//Память логических условий

publicbool[] LogicMemoryCond (bool Sync, bool[] X)

{

bool[] Xi = newbool[7];

if (Sync)

{

Xi[0] = true;

_X3 = X[3];

_X2 = X[2];

}

return Xi;

}

//Дешифратор

publicbyte Decoder (byte[] DTr)

{

return State_Ai = (byte)(DTr[0] + DTr[1] * 2 + DTr[2] * 4 + DTr[3] * 8);

}

//Комбинационная схема векторов D

publicbyte[] KSD (byte Ai, bool[] Xx)

{

byte[] NotX = newbyte[7];

byte[] X = newbyte[7];

byte[] A = newbyte[12];

byte _X3_ = 0;

byte Not_X3_ = 0;

byte _X2_ = 0;

byte Not_X2_ = 0;

for (int i = 0; i < 7; i++)

{

if (Xx[i]) X[i] = 1;

else X[i] = 0;

}

for (int i = 0; i < 7; i++)

{

if (Xx[i]) NotX[i] = 0;

else NotX[i] = 1;

}

switch (Ai)

{

case 0:

A[0] = 1;

break;

case 1:

A[11] = 1;

break;

case 2:

A[2] = 1;

break;

case 3:

A[3] = 1;

break;

case 4:

A[5] = 1;

break;

case 5:

A[4] = 1;

break;

case 6:

A[6] = 1;

break;

case 7:

A[7] = 1;

break;

case 8:

A[8] = 1;

break;

case 9:

A[9] = 1;

break;

case 10:

A[10] = 1;

break;

case 12:

A[1] = 1;

break;

}

DTr[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]));

DTr[1] = (byte)((A[1] & NotX[1] & Not_X2_) | (A[2] & _X3_) | (A[5]) | (A[9] & X[5]) | (A[6] & _X3_));

DTr[2] = (byte)((A[0] & X[0]) | (A[3]) | (A[4]) | (A[5]) | (A[8] & NotX[4]) | (A[6] & _X3_));

DTr[3] = (byte)((A[0] & X[0]) | ((A[6] & Not_X3_)) | (A[7]) | (A[8] & X[4]) | (A[9] & X[5]));

return DTr;

}

//Комбинационная схема векторов Y

publicbyte[] KSY (byte Ai, bool[] Xi)

{

byte[] NotX = newbyte[7];

byte[] X = newbyte[7];

byte[] A = newbyte[12];

byte _X3_ = 0;

byte Not_X3_ = 0;

switch (Ai)

{

case 0:

A[0] = 1;

break;

case 1:

A[11] = 1;

break;

case 2:

A[2] = 1;

break;

case 3:

A[3] = 1;

break;

case 4:

A[5] = 1;

break;

case 5:

A[4] = 1;

break;

case 6:

A[6] = 1;

break;

case 7:

A[7] = 1;

break;

case 8:

A[8] = 1;

break;

case 9:

A[9] = 1;

break;

case 10:

A[10] = 1;

break;

case 12:

A[1] = 1;

break;

}

for (int i = 0; i < 7; i++)

{

if (Xx[i]) X[i] = 1;

else X[i] = 0;

}

for (int i = 0; i < 7; i++)

{

if (Xx[i]) NotX[i] = 0;

else NotX[i] = 1;

}

Y[0] = (byte)((A[1] & NotX[1] & X[2]) | (A[9] & NotX[5] & NotX[6]) | (A[10] & NotX[6]) | (A[11]));

Y[1] = (byte)(A[0] & X[0]);

Y[2] = Y[1];

Y[3] = (byte)((A[1] & NotX[1] & NotX[2]) | (A[4]) | (A[8] & NotX[4]));

Y[4] = (byte)((A[2] & _X3_) | (A[6] & _X3_));

Y[5] = (byte)((A[1] & X[1]) | (A[2] & Not_X3_));

Y[6] = (byte)((A[6] & Not_X3_) | (A[7]) | (A[3]));

Y[7] = A[3];

Y[8] = A[3];

Y[9] = A[5];

Y[10] = (byte)((A[6] & Not_X3_) | (A[7]));

Y[11] = (byte)((A[8] & X[4]));

Y[12] = (byte)((A[9] & X[5]));

Y[13] = (byte)((A[9] & NotX[5] & X[6]) | (A[10] & X[6]));

return Y;

}

//Реализация счетчика

publicvoid Counter (refushort Count)

{

if (Count == 0) Count = 15;

else Count--;

}

//Уровень операционного устройства

publicvoid OAandYA ()

{

DTr = StateMemory (Sync, DTr[0], DTr[1], DTr[2], DTr[3]);

showQ (DTr[0], DTr[1], DTr[2], DTr[3]);

X = LogicMemoryCond (Sync, X);

State_Ai = Decoder (DTr);

stateChanged (State_Ai);

Y = KSY (State_Ai, X);

showY (Y);

X = OA (Y);

showX (X);

DTr = KSD (State_Ai, X);

showD (DTr[0], DTr[1], DTr[2], DTr[3]);

}

//Уровень микропрограммы

publicvoid Microprogram ()

{

switch (State_Ai)

{

case 0: //A0

if (X0())

{

Y1();

Y2();

State_Ai = 12;

}

else

{

State_Ai = 0;

}

break;

case 1: //A11

Y0_END ();

State_Ai = 0;

break;

case 2: //A2

if (X3())

{

Y4();

State_Ai = 3;

}

else

{

Y5();

State_Ai = 1;

}

break;

case 3: //A3

Y6();

Y7();

Y8();

State_Ai = 5;

break;

case 4: //A5

Y9();

State_Ai = 6;

break;

case 5: //A4

Y3();

State_Ai = 4;

break;

case 6: //A6

if (X3())

{

Y4();

State_Ai = 7;

}

else

{

State_Ai = 7;

}

break;

case 7: //A7

Y6();

Y10();

State_Ai = 8;

break;

case 8: //A8

if (X4())

{

Y11();

State_Ai = 9;

}

else

{

Y3();

State_Ai = 4;

}

break;

case 9: //A9

if (X5())

{

Y12();

State_Ai = 10;

}

else

{

State_Ai = 10;

}

break;

case 10: //A10

if (X6())

{

Y13();

State_Ai = 1;

}

else

{

State_Ai = 1;

}

break;

case 12: //A1

if (X1())

{

Y5();

State_Ai = 1;

}

else

{

if (X2())

{

State_Ai = 1;

}

else

{

Y3();

State_Ai = 2;

}

break;

}

stateChanged (State_Ai);

}

//При клике на регистр A

privatevoid lvVarA_ColumnClick (object sender, ColumnClickEventArgs e)

{

if (lvVarA. Items[0]. SubItems[e. Column]. Text == «0»)

lvVarA. Items[0]. SubItems[e. Column]. Text = «1»;

else

lvVarA. Items[0]. SubItems[e. Column]. Text = «0»;

CollectString ();

}

//Ввод данных с формы

privatevoid CollectString ()

{

firstVar = ««;

secondVar = ««;

string perem = ««;

string perem2 = ««;

for (int i = 1; i < +lvVarA. Items[0]. SubItems. Count; i++)

{

firstVar += lvVarA. Items[0]. SubItems[i]. Text;

}

if (lvVarA. Items[0]. SubItems[0]. Text == «1»)

{

perem = «-»;

}

for (int i = 1; i < +lvVarB. Items[0]. SubItems. Count; i++)

{

secondVar += lvVarB. Items[0]. SubItems[i]. Text;

}

if (lvVarB. Items[0]. SubItems[0]. Text == «1»)

{

perem2 = «-»;

}

SetVars (perem, perem2);

}

//При клике на регистр B

privatevoid lvVarB_ColumnClick (object sender, ColumnClickEventArgs e)

{

if (lvVarB. Items[0]. SubItems[e. Column]. Text == «0»)

lvVarB. Items[0]. SubItems[e. Column]. Text = «1»;

else

lvVarB. Items[0]. SubItems[e. Column]. Text = «0»;

CollectString ();

}

//Получаем десятичные значения A и B

privatevoid SetVars (string param, string param2)

{

int rab = 0;

double res = 0;

rab = Convert. ToUInt16(firstVar, 2);

for (int col = 0; col < 15; col++)

{

res += Math. Pow (2, 0 — col-1) * Double. Parse (firstVar[col]. ToString ());

}

A = Convert. ToUInt16(firstVar, 2);

if (param == «-») A += 32 768;

res = Math. Round (res, 5);

tbDecA. Text = param + res. ToString («0. #####»);

res = 0;

for (int col = 0; col < 16; col++)

{

res += Math. Pow (2, 0 — col-1) * Double. Parse (secondVar[col]. ToString ());

}

B = Convert. ToUInt32(secondVar, 2);

res = Math. Round (res, 6);

tbDecB. Text = param2 + res. ToString («0. ######»);

if (param2 == «-») B += 65 536;

}

//Вывод в регистр счетчика на форму

publicvoid RegCh (ushort C)

{

ushort Rab = 0;

Rab = C;

if (Rab % 2 == 1) RegCH[3, 0]. Value = 1;

else RegCH[3, 0]. Value = 0;

Rab = (ushort)(Rab / 2);

if (Rab % 2 == 1) RegCH[2, 0]. Value = 1;

else RegCH[2, 0]. Value = 0;

Rab = (ushort)(Rab / 2);

if (Rab % 2 == 1) RegCH[1, 0]. Value = 1;

else RegCH[1, 0]. Value = 0;

Rab = (ushort)(Rab / 2);

if (Rab % 2 == 1) RegCH[0, 0]. Value = 1;

else RegCH[0, 0]. Value = 0;

}

//Вывод в регистр А

privatevoid SetA (ListView L, UInt32 Ch)

{

for (int i = 15; i >= 0; i--)

{

if (Ch % 2 == 0) L. Items[0]. SubItems[i]. Text = «0»;

else L. Items[0]. SubItems[i]. Text = «1»;

Ch = Ch / 2;

}

//Вывод в регистр B

privatevoid SetB (ListView L, UInt32 Ch)

{

for (int i = 16; i >= 0; i--)

{

if (Ch % 2 == 0) L. Items[0]. SubItems[i]. Text = «0»;

else L. Items[0]. SubItems[i]. Text = «1»;

Ch = Ch / 2;

}

//Вывод результата в регистр результата С

privatevoid SetsResult (ListView L, UInt32 Ch, TextBox T)

{

double res = 0;

UInt32 valX = Ch;

if (Ch ≠ 0)

{

for (int i = 16; i >= 0; i--)

{

if (Ch % 2 == 0) L. Items[0]. SubItems[i]. Text = «0»;

else L. Items[0]. SubItems[i]. Text = «1»;

Ch = (UInt32)(Ch / 2);

}

for (int col = 1; col < =16; col++)

{

res += Math. Pow (2, 0 — col) * Double. Parse (L. Items[0]. SubItems[col]. Text);

}

res = Math. Round (res, 6);

T. Text = res. ToString («0»);

if (L. Items[0]. SubItems[0]. Text == «1»)

T. Text = T. Text. Insert (0, «-»);

}

//Вывод A на форму

privatevoid stateChanged (UInt16 a_in)

{

chkBxMPa0. Checked = false;

chkBxMPa1. Checked = false;

chkBxMPa2. Checked = false;

chkBxMPa3. Checked = false;

chkBxMPa4. Checked = false;

chkBxMPa5. Checked = false;

chkBxMPa6. Checked = false;

chkBxMPa7. Checked = false;

chkBxMPa8. Checked = false;

chkBxMPa9. Checked = false;

chkBxMPa10. Checked = false;

chkBxMPa11. Checked = false;

chkBxMPaend. Checked = false;

chkBxOUa0. Checked = false;

chkBxOUa1. Checked = false;

chkBxOUa2. Checked = false;

chkBxOUa3. Checked = false;

chkBxOUa4. Checked = false;

chkBxOUa5. Checked = false;

chkBxOUa6. Checked = false;

chkBxOUa7. Checked = false;

chkBxOUa8. Checked = false;

chkBxOUa9. Checked = false;

chkBxOUa10. Checked = false;

chkBxOUa11. Checked = false;

switch (a_in)

{

case 0:

chkBxMPa0. Checked = true;

chkBxOUa0. Checked = true;

chkBxMPaend. Checked = true;

break;

case 1:

chkBxMPa11. Checked = true;

chkBxOUa11. Checked = true;

break;

case 2:

chkBxMPa2. Checked = true;

chkBxOUa2. Checked = true;

break;

case 3:

chkBxMPa3. Checked = true;

chkBxOUa3. Checked = true;

break;

case 4:

chkBxMPa5. Checked = true;

chkBxOUa5. Checked = true;

break;

case 5:

chkBxMPa4. Checked = true;

chkBxOUa4. Checked = true;

break;

case 6:

chkBxMPa6. Checked = true;

chkBxOUa6. Checked = true;

break;

case 7:

chkBxMPa7. Checked = true;

chkBxOUa7. Checked = true;

break;

case 8:

chkBxMPa8. Checked = true;

chkBxOUa8. Checked = true;

break;

case 9:

chkBxMPa9. Checked = true;

chkBxOUa9. Checked = true;

break;

case 10:

chkBxMPa10. Checked = true;

chkBxOUa10. Checked = true;

break;

case 12:

chkBxMPa1. Checked = true;

chkBxOUa1. Checked = true;

break;

}

// Вывод X на форму

privatevoid showX (bool[] X)

{

for (int i = 0; i < X. Length; i++)

{

switch (i)

{

case 0: chkBxOUx0_mem. Checked = X[i];

break;

case 1: chkBxOUx1_mem. Checked = X[i];

break;

case 2: chkBxOUx2_mem. Checked = _X2;

break;

case 3: chkBxOUx3_mem. Checked = _X3;

break;

case 4: chkBxOUx4_mem. Checked = X[i];

break;

case 5: chkBxOUx5_mem. Checked = X[i];

break;

case 6: chkBxOUx6_mem. Checked = X[i];

break;

}

//Вывод Q на форму

privatevoid showQ (int Q0, int Q1, int Q2, int Q3)

{

chkBxOUQ0. Checked = (Q0 ≠ 0);

chkBxOUQ1. Checked = (Q1 ≠ 0);

chkBxOUQ2. Checked = (Q2 ≠ 0);

chkBxOUQ3. Checked = (Q3 ≠ 0);

}

//Вывод D на форму

privatevoid showD (int D0, int D1, int D2, int D3)

{

chkBxOUD0. Checked = (D0 ≠ 0);

chkBxOUD1. Checked = (D1 ≠ 0);

chkBxOUD2. Checked = (D2 ≠ 0);

chkBxOUD3. Checked = (D3 ≠ 0);

}

//Вывод Y на форму

privatevoid showY (byte[] Y)

{

for (int i = 0; i < Y. Length; i++)

{

switch (i)

{

case 1: chkBxOUy1. Checked = (Y[i] ≠ 0);

break;

case 2: chkBxOUy2. Checked = (Y[i] ≠ 0);

break;

case 3: chkBxOUy3. Checked = (Y[i] ≠ 0);

break;

case 4: chkBxOUy4. Checked = (Y[i] ≠ 0);

break;

case 5: chkBxOUy5. Checked = (Y[i] ≠ 0);

break;

case 6: chkBxOUy6. Checked = (Y[i] ≠ 0);

break;

case 7: chkBxOUy7. Checked = (Y[i] ≠ 0);

break;

case 8: chkBxOUy8. Checked = (Y[i] ≠ 0);

break;

case 9: chkBxOUy9. Checked = (Y[i] ≠ 0);

break;

case 10: chkBxOUy10. Checked = (Y[i] ≠ 0);

break;

case 11: chkBxOUy11. Checked = (Y[i] ≠ 0);

break;

case 12: chkBxOUy12. Checked = (Y[i] ≠ 0);

break;

case 13: chkBxOUy13. Checked = (Y[i] ≠ 0);

break;

}

ПоказатьСвернуть
Заполнить форму текущей работой