- •(СПбГэту “лэти”)
- •Задание на выпускную квалификационную работу
- •(СПбГэту “лэти”)
- •Календарный план выполнения выпускной квалификационной работы
- •Реферат
- •Abstract
- •Определения, обозначения и сокращения
- •Введение
- •1 Матричные делители
- •1.1 Матричные устройства
- •1.2 Алгоритм деления без восстановления остатка
- •1.3 Конвейерные делители
- •2 Структурно-топологическое проектирование конвейерного матричного делителя (кмд)
- •2.1 Структурно-топологический план кмд и его оптимизация
- •2.2 Особенности реализации кмд
- •2.2.1 Основные ячейки
- •2.2.2 Ячейки области триггеров
- •3 Схемотехническое проектирование кмд
- •3.1 Схемная конфигурация полного двоичного сумматора
- •3.2 Мультиплексор
- •3.3 Конвейерный триггер
- •4 Топологическое проектирование кмд
- •4.1 Иерархические макроблоки сбис
- •4.2 Основные этапы проектирования топологии иерархических макроблоков сбис
- •4.3 Концепция топологического проектирования
- •4.3.1 Расположение транзисторов
- •4.3.2 Расположение выводов фрагмента
- •4.3.3 Расположение шин земли и питания
- •4.3.4 Топологическая модель базовой ячейки
- •4.4 Топологическое проектирование элементов кмд
- •4.5 Топологии ячеек кмд
- •4.5.1 Топологии ячеек основных элементов ячеек делителя
- •4.5.2 Топологии простых элементов
- •4.5.3 Топологии ячеек области триггеров
- •5 Разработка кремниевого компилятора кмд
- •5.1 Этапы генерации топологии макроблока кмд программными средствами
- •5.2 Разработка спецификаций ячеек кмд
- •5.3 Разработка программы генерации файла спецификации кмд
- •5.4 Согласование ячеек и сборка макроблока кмд
- •6 Экономическое обоснование
- •6.1 Заработная плата основных исполнителей
- •6.2 Затраты на расходные материалы
- •6.3 Амортизационные отчисления
- •6.4 Накладные расходы
- •6.4 Сметная стоимость разработки
- •Заключение
- •Список использованных источников
- •Приложение а Топологические эскизы ячеек кмд
- •Приложение б Структура макроблока кмд
- •Приложение в Текст программы генерации спецификации структурно-топологических схем кмд различной разрядности
- •Приложение г Топологические чертежи конвейерного матричного делителя
Приложение б Структура макроблока кмд
В данном приложении представлена таблица соответствия имён разработанных ячеек и имён, используемых для корректной работы программы генерации топологии макроблока, а также его структура (таблица Б.1).
Таблица Б.1 – Соответствие названий ячеек делителя
Наименование ячейки |
Новое имя ячейки |
Содержание ячеек |
buff |
str1_1m |
Раскачивающий строку буфер |
basc_together_left |
str1_2m |
Левая основная ячейка, имеющая соединение с буфером |
basc_together |
str1_3m |
Средняя основная ячейка, имеющая соединение с левой и правой основными ячейками |
basc_together_right_top |
str1_4m |
Верхняя правая основная ячейка, имеющая соединение с триггерами и с единичным переносом для инициализации вычитания |
trigg_right_top_1 |
str1_5m |
Верхняя ячейка триггеров справа от основной ячейки |
trigg_right_top_2 |
str1_6m |
Верхняя правая ячейка триггеров |
basc_together_right |
str2_4m |
Правая основная ячейка, имеющая соединение с триггерами |
trigg_right_together_1 |
str2_5m |
Ячейка триггеров справа от основной ячейки |
trigg_right_together_2 |
str2_6m |
Самая правая ячейка триггеров |
trigg_right_together_e_1 |
strE1_6m |
Верхняя ячейка триггеров справа, объединяющая триггеры str1_5 и str1_6 |
trigg_right_together_e_2 |
strE2_6m |
Ячейка триггеров справа, объединяющая триггеры str2_5 и str2_6 |
trigg_right_together_top_double |
strT1_6m |
Верхняя правая ячейка триггеров в случае только одной ячейки триггеров |
trigg_right_together_double |
strT2_6m |
Правая ячейка триггеров в случае только одной ячейки триггеров |
Приложение в Текст программы генерации спецификации структурно-топологических схем кмд различной разрядности
В данном приложении приведён текст программы на языке C++, генерирующий спецификацию структурно-топологической схемы КМД по заданному количеству разрядов делимого и делителя.
// Генерация спецификации КМД различной разрядности
#include <fstream>
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
string nameFile = "divider_conv_auto.txt";
ofstream fout(nameFile, ios_base::out | ios_base::trunc);
cout << "----------------------------------------------------------" << endl;
cout << "Программа генерации спецификации КМД различной разрядности" << endl;
cout << "----------------------------------------------------------" << endl;
cout << endl;
if (!fout.is_open())
{
cout << "Файл " << nameFile << " не может быть открыт!" << endl;
cout << "Исправьте проблему и попробуйте снова." << endl;
system("pause");
exit(0);
}
else
{
int m = 0, n = 0, summ = 0;
cout << "Введите количество разрядов делимого, кратное 8:" << endl;
cin >> m;
if (cin.get() != (int)'\n')
{
cout << "Ошибка ввода! Необходимо ввести целое число!" << endl;
system("pause");
exit(0);
}
else
{
if (m <= 0)
{
cout << "Ошибка ввода! Количество разрядов должно быть больше нуля!" << endl;
system("pause");
exit(0);
}
}
cout << "Введите количество разрядов делителя, кратное 8:" << endl;
cin >> n;
if (cin.get() != (int)'\n')
{
cout << "Ошибка ввода! Необходимо ввести целое число!" << endl;
system("pause");
exit(0);
}
else
{
if (n <= 0)
{
cout << "Ошибка ввода! Количество разрядов должно быть больше нуля!" << endl;
system("pause");
exit(0);
}
else
{
if (m < n)
{
cout << "Ошибка ввода! Количество разрядов делимого не может быть ";
cout << "меньше, чем у делителя!" << endl;
system("pause");
exit(0);
}
else
{
//Несмотря на то, что запрашивается количество разрядов кратное 8,
//главное то, чтобы они были чётными, а разница разрядов делимого и
//делителя была кратной 8
if ((m % 2 != 0) && (n % 2 != 0))
{
cout << "Ошибка ввода! Количество разрядов должно быть ";
cout << "чётным!" << endl;
system("pause");
exit(0);
}
else
if ((m - n) % 8 != 0)
{
cout << "Ошибка ввода! Разница разрядов делимого и ";
cout << "делителя должна быть кратной 8!" << endl;
system("pause");
exit(0);
}
}
}
}
if ((n < 4) || (n % 4 != 0))
{
cout << "Ошибка ввода! Количество разрядов делителя должно быть ";
cout << "кратно 4 и не меньше 4!" << endl;
system("pause");
exit(0);
}
fout << "C:\\TopVG" << endl;
fout << "C:\\TopVG\\EXAMPLES\\Divider" << endl;
fout << "C:\\TopVG\\EXAMPLES\\Divider\\M1.2" << endl;
//Формирование первой строки
int k = 0, sqrt_k = 0;
int k_diff = (m - n) / 8;
fout << "S1 :g str1_1m str1_1m , 1 ; ";
switch (n)
{
case 4:
{
fout << "strD1_4m strD1_4m , 1 ; ";
break;
}
case 8:
{
fout << "str1_2m str1_2m , 1 ; str1_4m str1_4m , 1 ; ";
break;
}
default:
{
fout << "str1_2m str1_2m , 1 ; ";
k = (n - 8) / 4;
do
{
sqrt_k = trunc(sqrt(k));
k = k - pow(sqrt_k, 2);
fout << "str1_3m str1_3m , " << sqrt_k << " ; ";
} while (k != 0);
fout << "str1_4m str1_4m , 1 ; ";
break;
}
}
//Определяем количество блоков триггеров справа
switch (k_diff)
{
case 0:
{
fout << "strT1_6m strT1_6m , 1 ; EOL";
break;
}
case 1:
{
fout << "strT1_6m strT1_6m , 1 ; EOL";
break;
}
case 2:
{
fout << "str1_5m str1_5m , 1 ; str1_6m str1_6m , 1 ; EOL";
break;
}
default:
{
fout << "str1_5m str1_5m , 1 ; ";
k_diff = k_diff - 2;
do
{
sqrt_k = (int)trunc(sqrt(k_diff));
k_diff = k_diff - pow(sqrt_k, 2);
fout << "strE1_6m strE1_6m , " << sqrt_k << " ; ";
} while (k_diff != 0);
fout << "str1_6m str1_6m , 1 ; EOL";
break;
}
}
fout << endl;
if (m - n)
{
//Формирование второй строки
k_diff = (m - n) / 8;
fout << "S2 :g str1_1m str1_1m , 1 ; ";
switch (n)
{
case 4:
{
fout << "strD2_4m strD2_4m , 1 ; ";
break;
}
case 8:
{
fout << "str1_2m str1_2m , 1 ; str2_4m str2_4m , 1 ; ";
break;
}
default:
{
fout << "str1_2m str1_2m , 1 ; ";
k = (n - 8) / 4;
do
{
sqrt_k = (int)trunc(sqrt(k));
k = k - pow(sqrt_k, 2);
fout << "str1_3m str1_3m , " << sqrt_k << " ; ";
} while (k != 0);
fout << "str2_4m str2_4m , 1 ; ";
break;
}
}
//Определяем количество блоков триггеров справа
switch (k_diff)
{
case 0:
{
fout << "strT2_6m strT2_6m , 1 ; EOL";
break;
}
case 1:
{
fout << "strT2_6m strT2_6m , 1 ; EOL";
break;
}
case 2:
{
fout << "str2_5m str2_5m , 1 ; str2_6m str2_6m , 1 ; EOL";
break;
}
default:
{
fout << "str2_5m str2_5m , 1 ; ";
k_diff = k_diff - 2;
do
{
sqrt_k = trunc(sqrt(k_diff));
k_diff = k_diff - pow(sqrt_k, 2);
fout << "strE2_6m strE2_6m , " << sqrt_k << " ; ";
} while (k_diff != 0);
fout << "str2_6m str2_6m , 1 ; EOL";
break;
}
}
fout << endl;
}
//Итоговая компиляция из сформированных строк
fout << "divider_conv_auto :v S1 , 1 ;";
if (m - n)
{
fout << " S2 , " << (m - n) << " ; EOL";
}
else
{
fout << " EOL";
}
fout.close();
cout << "Спецификация '" << nameFile << "' успешно создана!" << endl;
system("pause");
}
}