|
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
|
6. Алгоритмы
получения описаний
Процедуры получения описаний схем блоков устройства контроля
формализованы в виде алгоритмов составления таблиц.
Таблицы представляются двухмерными массивами данных.
Для разработки алгоритмов были выполнены:
·
Обобщение содержания таблиц, с помощью выделения среди ее
чисел ключевых данных и выражения их через параметры n, k;
·
Определение закономерностей изменения чисел в столбцах и
строках таблицы.
Алгоритм, описывающий табл. 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
|
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.