Смекни!
smekni.com

Разработка средства функционального диагностирования вычислительных устройств (стр. 2 из 2)

Алгоритм, описывающий табл. 1., представлен в приложении 3.

Блок 2 описывает ввод данных:

· n – разрядность МКП;

· k – количество отбрасываемых разрядов.

В блоке 3,4 и 5 представлены ключевые данные:

· d1 = первое значение в таблице 1, которое соответствует разрядности МКП;

· d2 = 4*n – k + 5 – номер выхода первого сумматора по модулю три в схеме.

· d3 = n/2+3 – количество столбцов в таблице 1.

· L = n – k – Количество разрядов в усеченном результате.

· as1 = (n/4 +n % 2) – Количество сумматоров в первом ряду.

· as2 = as1 + L – Количество сумматоров во втором ряду.

· as3 = (as2+as2% 2) /2 – Количество сумматоров в третьем ряду.

· as4 = (as3+as3% 2) /2 – Количество сумматоров в четвертом ряду.

Блоки 10,6 определяет данные последнего столбца элементоа первого ряда табл. 1.

В блоках 7 – 9 задан цикл по столбцам, начиная со второго и заканчивая последним столбцом. В цикле определяют данные последних двух строк таблицы. Номер выхода в строке увеличивается на 2 для каждого последующего столбца.

В блоках 11 – 15 заданы циклы по строкам 1: 4 и по столбцам 1: as1. В цикле определяются входы сумматоров по модулю три, определяющих вычисляемые контрольные коды.

Блок 16,17 определяет данные первого столбца элементоа первого ряда табл. 1.

Блок 18,19,23 – подпрограмма заполняющая массив х. В подпрограмму передаем следующие параметры imin, imax, iinc, jmin, jmax, jinc,

В блоке 20–22, задаются номера входов разрядов контрольного кода КА16 {1,2}, а также номер выхода первого в таблице сумматора по модулю три, который подается на вход следующего сумматора.

В блоке 27–29, задаются номера входов разрядов контрольного кода КА12 {1,2}, а также номер выхода первого в таблице сумматора по модулю три, который подается на вход следующего сумматора.

В блоке 24–26, заполним столбцы таблицы, первый столбец в четвертом ряду

В блоке 30, задаются номера входов разрядов контрольного кода КА32 {1,2}, а также номер выхода первого в таблице сумматора по модулю три, который подается на вход следующего сумматора.

Блок 31 вычитаем из свернутого операнда А его ККА, получаем признак корректности результата.

В блоке 32 производится вывод данных.

Алгоритм, описывающий табл. 2., представлен в приложении 3.

Блок 2 описывает ввод данных:

· n – разрядность МКП;

· k – количество отбрасываемых разрядов.

В блоке 3 представлены ключевые данные:

· d1 = (n-k)* 2 – первое значение в таблице 1;

· d2 = 8*n – 5*k -3 – номер выхода первого сумматора в таблице. 2.

· d3 = n – k – 3 – количество столбцов в таблице 2.

· as1 = n/4–2 – Количество сумматоров в первом ряду.

· Tail, head – переменые(указатели) хранят номер опорного и «заполняемого» элемента

Блоки 56,62 определяют данные первого столбца таблицы 2.

В блоках 63 – 65 задан цикл по столбцам, начиная со второго и заканчивая последним столбцом. В цикле определяют данные последних двух строк таблицы, а также первых двух строк. Номер выхода в строке увеличивается на 2 для каждого последующего столбца.

В блоках 57 – 61 заданы циклы по строкам 1: 4 и по столбцам 1: as1. В цикле определяются входы сумматоров по модулю три, определяющих вычисляемые контрольные коды.

В блоках 66 – 68 заполняются первый два столбца таблицы.

Заполнением данными столбцы 9,11,13,15,17; 10,12,14,16.

Установим указатели tail и head, на опорный элемент, тот элемент откуда берутся данные, и тот, который заполняется.

В блоках 72 – 76 заполним данными 10,12,14,16 элементы. Инициализируем tail, head, затем вызываем подпрограмму, увеличиваем tail, head. В цикле определяются входы сумматоров по модулю три, определяющих вычисляемые контрольные коды. Определим КВ22, КВ24, КВ26, КВ28, КВ30.

В блоках 77 – 85 заполним 11,13,15,17 данными элементы. В цикле вызываем подпрограмму, увеличиваем tail, head. Определим КВ4, КВ8, КВ12, КВ16.

В блоке 86–88, задаются номера входов разрядов контрольного кода КВ32 {1,2}, а также номер выхода первого в таблице сумматора по модулю три, который подается на вход следующего сумматора.

Блок 89–91 вычитаем из свернутого операнда А его ККА, получаем признак корректности результата

В блоке 92 производится вывод данных.


7. Листинг программы, реализующей алгоритмы

1) Текст программы, реализующей описание схемы блока контроля БКА.БКв

void __fastcall TForm1: Button1Click (TObject *Sender)

{

int d3b, d3a;

n = StrToInt (Edit1->Text);

k = StrToInt (Edit2->Text);

d3a = n/2 + 3;

d3b = (n – n % 2)/2;

StringGrid1->ColCount = d3a;

StringGrid2->ColCount = d3b;

for (int i=1; i<StringGrid1->ColCount; i++)

StringGrid1->Cells[i] [0]=i;

for (int i=1; i<StringGrid2->ColCount; i++)

StringGrid2->Cells[i] [0]=i;

String stroca1 [7]={«», «Âõ1», «Âõ2», «Âõ3», «Âõ4», «Âûõ1», «Âûõ2»};

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

{

StringGrid1->Cells[0] [i]=stroca1 [i].c_str();

StringGrid2->Cells[0] [i]=stroca1 [i].c_str();

}

StrGr1 ();

StrGr2 ();

}

// –

void __fastcall TForm1: Cycle (TStringGrid *tab, int imin, int imax, int iinc, int jmin, int jmax, int jinc)

{

for (int i=imin; i<imax; i=i+iinc) {

for (int j = jmin; j<jmax; j=j+jinc) {

if (n % 2 == 1) {

tab->Cells[i] [1] = tab->Cells [j-1] [6];

tab->Cells[i] [2] = tab->Cells [j-1] [5];

tab->Cells[i] [3] = tab->Cells[j] [6];

tab->Cells[i] [4] = tab->Cells[j] [5];

}

else {

tab->Cells[i] [1] = tab->Cells [j-1] [5];

tab->Cells[i] [2] = tab->Cells [j-1] [6];

tab->Cells[i] [3] = tab->Cells[j] [5];

tab->Cells[i] [4] = tab->Cells[j] [6];

}

}}}

// –

void __fastcall TForm1:IF1 (TStringGrid *tab, int head, int tail, int m)

{

if (n % 2 == 1) {

StringGrid1->Cells[head] [1] = StringGrid1->Cells[tail] [5];

StringGrid1->Cells[head] [2] = StringGrid1->Cells[tail] [6];

StringGrid1->Cells[head] [3] = StringGrid1->Cells[m] [5];

StringGrid1->Cells[head] [4] = StringGrid1->Cells[m] [6];

}

else

{

StringGrid1->Cells[head] [1] = StringGrid1->Cells[tail] [6];

StringGrid1->Cells[head] [2] = StringGrid1->Cells[tail] [5];

StringGrid1->Cells[head] [3] = StringGrid1->Cells[m] [6];

StringGrid1->Cells[head] [4] = StringGrid1->Cells[m] [5];

}}

// –

void __fastcall TForm1:IF2 (TStringGrid *tab, int head, int tail, int m, int m1)

{

if (n % 2 == 1) {

StringGrid1->Cells[head] [1] = StringGrid1->Cells[tail] [5];

StringGrid1->Cells[head] [2] = StringGrid1->Cells[tail] [6];

StringGrid1->Cells[head] [3] = StringGrid1->Cells[m] [5];

StringGrid1->Cells[head] [4] = StringGrid1->Cells[m] [6];

}

else

{

StringGrid1->Cells[head] [1] = StringGrid1->Cells[tail] [6];

StringGrid1->Cells[head] [2] = StringGrid1->Cells[tail] [5];

StringGrid1->Cells[head] [3] = m;

StringGrid1->Cells[head] [4] = m1;

}}

// –

void __fastcall TForm1: StrGr1 ()

{

int L, as1, as2, as3, as4, as5, d2a;

as1 = n/4 + n % 2;

as2 = as1 + L;

as3 = as2/2 + as2% 2;

as4 = as3/2 + as3% 2;

d2a = 4*n-k +5;

L = n-k;

StringGrid1->Cells[1] [5] = d2a;

StringGrid1->Cells[1] [6] = d2a+1;

for (int i=2; i<StringGrid1->ColCount; i++) {

StringGrid1->Cells[i] [5] = StringGrid1->Cells [i-1] [5]+2;

StringGrid1->Cells[i] [6] = StringGrid1->Cells[i] [6]+2;

}

StringGrid1->Cells[as1] [1] = n – 3;

StringGrid1->Cells[as1] [2] = n – 2;

StringGrid1->Cells[as1] [3] = n – 1;

StringGrid1->Cells[as1] [4] = n;

for (int i=(as1–1); i>=0; i–)

for (int j=4; j<=0; j–)

StringGrid1->Cells[i] [j] = StringGrid1->Cells [i+1] [j] – 4;

if (n % 2 == 1) {

StringGrid1->Cells[1] [1] = 0;

StringGrid1->Cells[1] [2] = 0;

StringGrid1->Cells[1] [3] = 0;

StringGrid1->Cells[1] [4] = 1;

}

Cycle (StringGrid1, as2, (as2-L/2), – 1, as1,0, – 2);

Cycle (StringGrid1, as3, (as3-L/4), – 1, as2,0, – 2);

Cycle (StringGrid1, (as1+1), (as2-L/2–1), 1,0,4,2);

IF1 (StringGrid1, as3+1, as2+1, as2+2);

IF1 (StringGrid1, as5, as3+1, as3+2);

IF2 (StringGrid1, as5+1, as5, n+2, n+1);

}

// –

void __fastcall TForm1: StrGr2 ()

{

int d2b, d1, d3, bs1, tail, head, m, m1;

d2b = 8*n-5*k-3;

d1 = (n-k)*2;

d3 = n-k-3;

bs1= n/4–2;

StringGrid2->Cells[1] [5] = d2b;

StringGrid2->Cells[1] [6] = d2b+1;

for (int i=2; i<StringGrid2->ColCount; i++) {

StringGrid2->Cells[i] [5] = StringGrid2->Cells [i-1] [5]+2;

StringGrid2->Cells[i] [6] = StringGrid2->Cells[i] [6]+2;

}

StringGrid2->Cells[bs1] [1] = n – 3;

StringGrid2->Cells[bs1] [2] = n – 2;

StringGrid2->Cells[bs1] [3] = n – 1;

StringGrid2->Cells[bs1] [4] = n;

for (int i=(bs1–1); i>d2b; i–)

for (int j=0; j<4; j++)

StringGrid2->Cells[i] [j] = StringGrid2->Cells [i+1] [j] – 4;

IF1 (StringGrid2, d1+2, d1, d3–2);

tail+=2;

head+=2;

IF1 (StringGrid2, d1+2, d1, d3–2);

if (n % 2 == 1) {

StringGrid2->Cells [head+2] [1] = StringGrid2->Cells[head] [6];

StringGrid2->Cells [head+2] [2] = StringGrid2->Cells[head] [5];

StringGrid2->Cells [head+2] [3] = StringGrid2->Cells [d3+1] [6];

StringGrid2->Cells [head+2] [4] = StringGrid2->Cells [d3+1] [5];

}

tail= d3;

m= 4*(k-1);

head = bs1+2;

for (int i=1; i<n-k; i++)

{

IF2 (StringGrid2, head, tail, m, m-1);

tail+=2;

head+=2;

}

IF1 (StringGrid2, head, d1, d1+1);

IF1 (StringGrid2, head, tail, n/4–2);

IF2 (StringGrid2, head, tail, 2*n+4,2*n+3);

}

8. Результаты работы программы

В программе была задана разрядность n = 36 и количество отбрасываемых разрядов k = 31. Разбиение МКП представлено на рис. 2.

Блоки контроля БКА и БКБ представлены в приложении 4.

Описание схемы блока контроля БКА приведено в табл. 4.

Таблица 4

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Вх1 1 5 9 13 17 21 25 29 33 118 122 126 128 132 136
Вх2 2 6 10 14 18 22 26 30 34 119 123 127 129 133 137
Вх1 3 7 11 15 19 23 27 31 35 120 124 0 130 134 138
Вх2 4 8 12 16 20 24 28 32 36 121 125 0 131 135 139
Вых1 118 120 122 124 126 128 130 132 134 136 138 140 142 144 146
Вых2 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147

Таблица 4 продолжение

16 17 18 19 20 21
Вх1 140 142 146 150 152 38
Вх2 141 143 147 151 153 37
Вх1 0 144 148 0 154 157
Вх2 0 145 149 0 155 158
Вых1 148 150 152 153 156 159
Вых2 149 151 153 154 157 160

Описание схемы блока контроля БКБ приведено в табл. 5.

Таблица 5

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Вх1 39 43 55 59 63 67 71 161 165 171 177 169 177 167 185
Вх2 40 44 56 60 64 68 72 162 166 172 178 170 178 168 186
Вх1 41 0 57 61 65 69 73 163 53 173 51 179 49 183 47
Вх2 42 0 58 62 66 70 74 164 54 174 52 180 50 184 48
Вых1 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189
Вых2 162 164 166 168 170 172 174 176 178 180 182 184 186 188 190

Таблица 5 продолжение

16 17 18 19
Вх1 175 189 191 76
Вх2 176 190 192 75
Вх1 187 45 193 195
Вх2 188 46 197 196
Вых1 191 193 195 197
Вых2 192 194 196 198

Список литературы

1. Рабинович З.Л., Раманаускас В.А. Типовые операции в вычислительных машинах. – Киев: Техника, 1980.

2. Савельев А.Я. Прикладная теория цифровых автоматов. – М.: Высш. шк. 1987.