[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем
Автор Сообщение
Михаил Долинский

Темы: 1984
Сообщений: 47243

Мой профиль
В этой теме по моей просьбе Роман Белько (ПО-22) будет проводить разбор проектов, создаваемых студентами во время выполнения контрольных работ по проектированию цифровых устройств с целью иллюстрации различных подходов и представления лучших приемов проектирования.
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Это правильное решение задачи "Котёнок", которое было предложено в виде подсказки.

А это правильное решение этой же задачи, до которого можно было догадаться, посмотрев на таблицу истинности.

На втором курсе до такого решения догадался каждый третий. А вот на первом курсе - только Чаховский Дмитрий. Это и есть его решение.
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Перед вами два правильных решения задачи "Умножить и сложить".
Это чужое решение:

А это моё решение:

Мне кажется, что в первом решении проделана лишняя работа. Сперва размерность каждого множителя доводится до восьми, а затем при сложении берётся только первые восемь бит от результата умножения. Я же предлагаю изменить размерность входных контактов умножителя с восьми до четырёх, а выходных - с шестнадцати до восьми. Как это делается, описано здесь.
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
В задаче "Таблица Татьяны" требовалось спроектировать устройство, которое работало бы в соответствии с определённой таблицей истинности. У многих студентов, которые правильно решили эту задачу, решение было очень похоже на это.

На самом же деле в задаче требовалось вычислить арифметическую функцию Y=14-X. Вот это решение:

Было и вот такое решение:

Но из великого многообразия решений этой задачи, больше всего мне понравилось решение Сергея Федоры (ПО-22).

Простое решение на непростую задачу.
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Иногда студент, проектирующий устройство в HLCCAD-е, ищет определённый элемент с определённой размерностью. Но обыскав всё что можно и всё что нельзя, такого элемента он не находит. Следовательно, эту задачу он прекращает делать и приступает к следующей. И очень зря! Здесь я расскажу как надо правильно менять размерности входных и выходных контактов. Данные правила распространяются только на элементы библиотеки Standard.prj. Итак, всего существует два способа.

Способ первый
Пусть, например, есть умножитель размерности восемь (то есть на входе по 8 бит, а на выходе 16).

Изменим размерность на четыре (то есть на входе поставим по 4 бита, а на выходе 8). Сперва нужно два раза кликнуть левой клавишей мыши в самом центре умножителя. После этого появится корпус устройства. Проверить, всё ли до сих пор сделано правильно можно следующим образом: попробовать передвинуть с помощью мыши синие буквы "MUL".

Если они двигаются, то пока всё правильно, иначе что-то Вы сделали не то. Будем считать что всё правильно. Далее кликаем два раза на любом контакте и в появившемся окошке "Параметры контакта" меняем размерность на нужную.

Сохраняем изменения на корпусе и переходим на схему. Там Вы увидите умножитель с изменённой размерностью.


Способ второй
Пусть, например, есть сумматор размерности восемь (то есть на входах и выходе по 8 бит). Изменим размерность на четыре (то есть на входах и выходе поставим по 4 бита).

Наводим курсор на сам сумматор, кликаем правой клавишей мыши, в выпадающем меня выбираем строку с надписью "Внешний редактор".

Указываем нужную размерность, ...

... кликаем ОК ...

... и продолжаем радоваться жизни
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
В последнее время мне неоднократно доводилось наблюдать как некоторые студенты путают визуально похожие, но отличающиеся таблицами истинности, логические элементы. В связи с этим в этом сообщении я попытаюсь подробно описать каждый логический элемент.
Для решения задач, которые предлагаются на контрольных работах, достаточно понять принцип работы только четырёх логических элементов: отрицание - NOT, логическое сложение - OR, логическое умножение - AND и исключающее ИЛИ - XOR.

Отрицание - NOT
Таблица истинности "отрицания" следующая:

При инверсии 0 заменяется на 1, а 1 на 0. В HLCCAD-е элемент NOT обозначается единичкой ("1"), а на выходе стоит инвертор (маленький кружок). На рисунке показан элемент NOT размерности один бит:

А это уже восьмибитный элемент NOT. Принцип его работы заключается в побитном инвертировании всего числа. Пример приведён выше.

Вот ещё несколько примеров:

Как же отличить NOT от других логических элементов? Очень просто! Нужно дважды кликнуть по самому элементу и посмотреть имя корпуса.

В данном случае, как и предполагалось, перед нами элемент NOT.

Логическое сложение - OR
Таблица истинности логического сложения:

В HLCCAD-е элемент OR, так же как и элемент NOT обозначается единичкой ("1"). Внешне эти элементы очень похожи, но, и таблицы истинности, и имена корпусов совершенно разные.

Ниже показаны различные модификации элемента OR.

Примеры с числовыми значениями:

Первые два элемента работают по принципу: результат равен 0, если все слагаемые равны нулю, в остальных случаях результат равен 1. Третий элемент работает также как и первые два, просто у него "шинный" вход. А вот последний элемент, у которого один контакт восьмибитный, а другой - однобитный - делает логическое OR каждого из верхних битов с нижним и разрядность на выходе не один, как у всех остальных элементов, а равна разрядности входного верхнего контакта.

Логическое умножение - AND
Таблица истинности логического умножения:

Элемент AND обозначается значком &. Названий у этого значка очень много: и амперсант, и M&M's ...
Вот несколько примеров с элементом AND:

Первые два элемента работают по принципу: результат равен 1, если все слагаемые равны единице, в остальных случаях результат равен 0. Третий элемент работает также как и первые два, просто у него "шинный" вход. А вот последний элемент, у которого один контакт восьмибитный, а другой - однобитный - делает логическое AND каждого из верхних битов с нижним и разрядность на выходе не один, как у всех остальных элементов, а равна разрядности входного верхнего контакта.

Исключающее ИЛИ - XOR
Таблица истинности исключающего ИЛИ:

Элемент XOR обозначается значком "+".
Далее приводится несколько примеров с элементом XOR:

Первый элемент работает так: результат равен 1, если два числа на входах не равны между собой. Если же они равны, то результат равен 0. У второго элемента три входа, поэтому операцию, описанную выше для элемента с двумя входами, необходимо проделать дважды. Третий элемент работает также как и первые два, просто у него "шинный" вход. А вот последний элемент, у которого один контакт восьмибитный, а другой - однобитный - делает исключающее ИЛИ каждого из верхних битов с нижним и разрядность на выходе не один, как у всех остальных элементов, а равна разрядности входного верхнего контакта.
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Константа - это практически то же самое что и переменная, но объявляется и определяется она один раз, то есть не изменяется по ходу программы, и всегда находится в глобальной области видимости. В HLCCAD есть две фиксированные константы: ноль и единица. Каждая из этих констант имеет единственный выход "O", который может иметь произвольную размерность.

Размерность изменяется точно так же, как и в случае с сумматором или умножителем (описано выше). Ниже приводятся простейшие примеры использования этих констант:

Более универсальным является устройство с названием Const. Месторасположение этого устройства в библиотеке Standard devices показано на следующей картинке:

Универсальность устройства Const заключается в том, что на выходе может быть любое число в любой системе счисления. Устройство устанавливает на выходе значение, указанное в параметре устройства - "Value". Для установки значения в произвольной системе счисления нужно: кликнуть правой клавишей мыши по копусу устройства и в выпадающем меню выбрать "Внешний редактор". Появится такое окошко:

Число 10 в записи 10#123# означает систему счисления в которой записано число 123. Таким образом, изменяя эти два числа на нужные, можно создать любую константу в любой системе счисления.
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Для того чтобы взять нужный бит из битовой последовательности целесообразно использовать мультиплексор. На рисунке приведён пример такого устройства. Из восьмибитного числа х берётся бит с номером fs и подаётся на выход s.
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Для занесения 1 в битовую последовательность на указанную позицию применяется два устройства: дешифратор и побитное логическое "OR".

Пример
Пусть, например, нужно поместить 1 в пятый бит (fs=101) восьмибитного числа 10001010 (х=10001010). Сперва fs=101 пройдёт через дешифратор и преобразуется в 100000. Затем применяется логическое сложение чисел 100000 и х=10001010. В результате y=10101010.
Роман Белько

Темы: 3
Сообщений: 47

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

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

В случае, если число состоит из одних нулей, на выходе будет ноль, иначе на выходе будет один.
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Чтобы определить количество единичных бит в числе, надо сложить все биты этого числа
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Логический сдвиг
Это сдвиг, при котором уходящий бит уходит, не влияя на оставшееся биты, а на место появившегося бита записывается бит 0.
Пример работы логического сдвига:
Пусть у нас есть число 10101010b. Если сделать сдвиг влево на 1 бит, то получим число 01010100b. Если сделать сдвиг вправо на 1 бит, то получим число 01010101b.
Логический сдвиг влево:

Логический сдвиг вправо:


Арифметический сдвиг
При этом сдвиге байт рассматривается не просто как группа битов, а как целое число в дополнительном коде. Дополнительный код — наиболее распространенный способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения, чем упрощает архитектуру ЭВМ. Дополнительный код отрицательного числа получается инвертированием двоичного числа и прибавлением к нему единицы. При сдвиге влево биты ведут себя как при логическом сдвиге, при сдвиге вправо уходящий бит уходит, не влияя на оставшееся биты, а на место появившегося бита устанавливается бит, соответствующий знаку.
Пример работы арифметического сдвига:
Пусть у нас есть число 11111010b=-6 (в двоичной системе). Если сделать сдвиг влево на 1 бит, то получим число 11110100b=-12. Если сделать сдвиг вправо на 1 бит, то получим число 11111101b=-3. Легко заметить, что при арифметическом сдвиге сдвиг влево соответствует умножению на 2, а сдвиг вправо делению на 2.
Арифметический сдвиг влево:

Арифметический сдвиг вправо:


Циклический сдвиг
При этом сдвиге уходящий бит появляется на месте появившегося.
Пример работы циклического сдвига:
Пусть у нас есть число 11111010b. Если сделать сдвиг влево на 1 бит, то получим число 11110101b. Если сделать сдвиг вправо на 1 бит, то получим число 01111101b.
Циклический сдвиг влево:

Циклический сдвиг вправо:


Реализация сдвигов на HLCCAD
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Тест - это набор входных и выходных значений. Значения могут иметь как числовой формат записи, так и строковый. Если мысленно подставить значения входных переменных, которые находятся в тесте, на место соответствующих переменных в самой программе (или проекте), то получившееся значение на выходе программы (или проекта) должно совпадать с выходным значением в тесте. Если это условие выполняется, значит, задача решена верно. В противном случае нужно искать ошибку. Самый простой способ быстро найти ошибку - это подключить тесты.
Итак, задача не прошла. Берём тест обычным образом, а именно:
1. Заходим в протокол проверки.
2. Кликаем на пересечении столбца, с названием "Результат", и строки, в которой значится неправильно решённая задача.
3. Затем кликаем по ссылке "Взять тест".
4. Выделяем тест и копируем.

Далее вся работа будет производиться исключительно в самом проекте. Открыв его, нужно кликнуть правой кнопкой мыши по надписи "Редактор теста".

Тесты ведь где-то должны храниться. Поэтому сперва надо сохранить файл с будущими тестами (расширение файла tst). После этого откроется чёрный экран...

... куда и надо вставить скопированные ранее тесты.

Кликая по дискетке, сохраняем этот файл и закрываем его, после чего компилируем проект заново. Если какой-то тест не проходит, окошко с сообщениями это выдаст. Далее настаёт процесс исправления ошибок...
Роман Белько

Темы: 3
Сообщений: 47

Мой профиль
Процесс создания теста в чём-то схож с процессом подключения теста. Отличие состоит лишь в том, что при подключении теста, тест копировался из протокола проверки, а при создании теста, тест будет создаваться вручную и с нуля.
Создание тестов - это очень ответственный и важный этап работы при установке задач. Малейшая расслабленность и халатное отношение в процессе работы могут привести к не предсказуемым последствиям. Поэтому тесты нужно создавать полностью сконцентрировавшись на работе.
Что касается количества тестов, то чрезмерно большое их количество может замедлит тестирование, а чрезмерно маленькое - не проверять всех возможных ситуаций. Поэтому автор сам должен решать, сколько у него будет тестов, но ...
...обязательно должны быть тесты на минимальную и максимальную размерность, а также обязательно должны быть специальные тесты на крайние случаи (если такие возможны по условию задачи) 

Пример типичного тестового файла представлен ниже:
; test 1
Set 0 on x at 1          ; входному контакту x присваивается значение равное x=0
Set 0 on y at 1          ; входному контакту y присваивается значение равное y=0
Set 0 on z at 1          ; входному контакту z присваивается значение равное z=0
Diff 0 on res at 1000    ; выходному контакту res присваивается значение равное res=0
; test 2
Set 1 on x at 1001       ; входному контакту x присваивается значение равное x=1
Set 1 on y at 1001       ; входному контакту y присваивается значение равное y=1
Set 1 on z at 1001       ; входному контакту z присваивается значение равное z=1
Diff 0 on res at 2000    ; выходному контакту res присваивается значение равное res=0
; test 3
Set 1 on x at 2001       ; входному контакту x присваивается значение равное x=1
Set 1 on y at 2001       ; входному контакту y присваивается значение равное y=1
Set 3 on z at 2001       ; входному контакту z присваивается значение равное z=3
Diff 5 on res at 3000    ; выходному контакту res присваивается значение равное res=5

Всё, что пишется после знака "Точка с запятой", воспринимается как комментарии.
Просьба, при установке задач, к каждому тесту делать комментарий. Это поможет студентам в отладке своих решений, а также это будет очень полезно, в случае нахождения ошибок в тестах. Также старайтесь выдерживать паузу между установкой значений на входных контактах и проверкой значений на выходных, как это сделано в приведенном выше примере.
Между тестами паузу лучше не делать.
Вот так не очень хорошо:
;1
IN_0=1 at 2
IN_1=1 at 2
IN_2=1 at 2
IN_3=1 at 2
IN_4=1 at 2
Assert OUT_0=1 at 4000
;2
IN_0=1 at 6000
IN_1=0 at 6000
IN_2=1 at 6000
IN_3=0 at 6000
IN_4=1 at 6000
Assert OUT_0=0 at 8000 
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем
Time:0,047