2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
 
 Re: Чип NXH5104
Сообщение29.06.2020, 19:08 


21/05/16
4292
Аделаида
Dmitriy40 в сообщении #1462774 писал(а):
5. Изменить подключение старших битов при чтении регистра команд чтобы можно было задавать не только положительные, но и отрицательные константы.

Кстати, а что это значит?

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение29.06.2020, 21:32 
Заслуженный участник


20/08/14
11061
Россия, Москва
kotenok gav в сообщении #1471281 писал(а):
если будет возможность читать/писать данные и в RAM, и на HDD
Аппаратура компьютера редко имеет понятие что где-то на шине подключен HDD, обычно он выглядит просто как набор регистров (плюс прерывания и DMA). Т.е. HDD обычно является обычным внешним устройством. В связи с этим я потерялся и не понимаю Вашего вопроса про HDD. HDD всё же внешний жесткий диск, а не что-то иное ...
Если же имеете в виду что можно писать (и кстати читать) данные в память кода, то выйдет почти стандартная архитектура (фон Неймана), как оно и есть сейчас с 16-ю байтами общей памяти. Но вообще говоря прочитать код команды часто заметно сложнее чтения/записи данных (команда может занимать больше одного слова (байта) памяти, она должна адресоваться совсем другим регистром (счётчиком команд), попадать она тоже должна в специальное место (регистр команд), это всё усложнения аппаратуры, хоть и не всегда большие). А вот прочитать команду из I2C памяти, да с поддержкой всех фичей протокола (и мультимастер, и останов шины, и приостанов тактирования, и опрос готовности памяти), может оказаться на порядок сложнее всего остального процессора. :D
kotenok gav в сообщении #1471281 писал(а):
(еще я понял, что идеальное разделение данных и команд невзможно - в коде всегда бывают какие-нибудь константы)? Как решается эта проблема в обычных компьютерах?
Возможно. Решается по разному, не только в зависимости от компьютера (аппаратуры), но и в зависимости от ОС. Например все константы выносятся в отдельный сегмент памяти (например память данных) и загружаемого файла, а уже ОС при запуске программы на исполнение инициализирует все сегменты, в том числе и с константами, и к моменту старта программы все данные/константы уже лежат где надо.
Во многих диалектах языка С для МК кстати в связи с этим есть хитрая засада: если объявить некую переменную или массив с модификатором const (и инициализатором разумеется), то прилетит сразу две плюхи, во первых этот массив будет занимать место и в памяти программ и в памяти данных (!), во вторых потребуется время между сигналом RESET и передачей управления в main() для копирования этой переменной или массива из памяти программ в память данных.
kotenok gav в сообщении #1471360 писал(а):
Кстати, а что это значит?
Сейчас младшие 4 бита загружаются с расширением нулями (т.е. в старшие 4 бита при этом записываются нули), что позволяет загрузить константу 0..15. Нередко удобнее пользоваться константами -8..+7, что легко реализуется расширением знакового бита (старшего), всё что требуется так это подключить старший бит из операнда (это бит 3, старший из 4-х битов операнда) к всем более старшим битам. Тогда операнды 0..7 будут загружаться как число 0..+7, а операнды 8..15 будут загружаться как число -8..-1 (разумеется в двоичном дополнительном коде).
Например это удобно для кодирования смещения в команде (условного) перехода, можно перейти и вперёд по коду (для оператора if), и назад (для циклов).
Плюс это позволит не добавлять команду SUB R,# (вычесть откуда-то непосредственный операнд), достаточно команды сложения ADD R,# с отрицательным операндом.

Sender в сообщении #1471288 писал(а):
(но неужели на гарвардской архитектуре кто-то пользуется динамическим?)
Приходится иногда. Но чаще дело даже не в распределении памяти, которое может быть и статическим, а в совместной обработке строк и из памяти данных, и из памяти программ (константы и таблицы). Например нужно сформировать строку из нескольких кусочков, которые могут лежать как в памяти данных (вычисленные ранее или полученные из внешних источников), так и в памяти кода (выборка подстроки из большой таблицы в зависимости от принятого/вычисленного значения переменной). И может получиться так, что при разных значениях переменной подстроку надо брать или из памяти данных, или из памяти кода. Более-менее реальный пример: большая постоянная таблица передаточной функции и мало исправлений к ней, вычисляемых уже в процессе работы (или очередной калибровки). Или функция printf, по умолчанию берущая строку формата из памяти кода, но имеющая управляющий символ подстановки подстроки формата из операнда (который в памяти данных) — обработчик символов формата должен уметь брать части строки и из данных и из кода. При этом скопировать перед обработкой всю строку формата в память данных нельзя, строка может быть и очень длинной (вывод просто длинного текста).
В принципе всё это решаемо, разумеется, но каждый раз приходится думать и изобретать велосипед по новой. Или отказаться от эффективности и писать на очень высокоуровневом языке, где все эти сложности спрятаны в компилятор.

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение29.06.2020, 22:30 


21/05/16
4292
Аделаида
Dmitriy40 в сообщении #1471377 писал(а):
Если же имеете в виду что можно писать (и кстати читать) данные в память кода

Да, я сейчас про это.
Dmitriy40 в сообщении #1471377 писал(а):
Например все константы выносятся в отдельный сегмент памяти (например память данных) и загружаемого файла, а уже ОС при запуске программы на исполнение инициализирует все сегменты, в том числе и с константами, и к моменту старта программы все данные/константы уже лежат где надо.

Но это же не решает проблемы... У нас ведь есть данные в этой памяти, и данные в ОЗУ, и все равно приходится дублировать.
Dmitriy40 в сообщении #1471377 писал(а):
Сейчас младшие 4 бита загружаются с расширением нулями (т.е. в старшие 4 бита при этом записываются нули), что позволяет загрузить константу 0..15. Нередко удобнее пользоваться константами -8..+7, что легко реализуется расширением знакового бита (старшего), всё что требуется так это подключить старший бит из операнда (это бит 3, старший из 4-х битов операнда) к всем более старшим битам. Тогда операнды 0..7 будут загружаться как число 0..+7, а операнды 8..15 будут загружаться как число -8..-1 (разумеется в двоичном дополнительном коде).

Хм... Т.е., должны быть два отдельных режима (с интерпретацией чисел как 0..15 или как -8..7), с двумя командами переключения между ними?

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение29.06.2020, 23:43 
Заслуженный участник


20/08/14
11061
Россия, Москва
kotenok gav в сообщении #1471381 писал(а):
Но это же не решает проблемы... У нас ведь есть данные в этой памяти, и данные в ОЗУ, и все равно приходится дублировать.
Что и зачем? Можно не дублировать, а иметь разные команды доступа к каждому виду памяти.
Вообще опишите подробнее в чём именно проблема/засада/вопрос и к какой архитектуре он относится. Пока я и проблемы не понимаю, и вариантов её решения есть несколько.
kotenok gav в сообщении #1471381 писал(а):
Хм... Т.е., должны быть два отдельных режима (с интерпретацией чисел как 0..15 или как -8..7), с двумя командами переключения между ними?
Почитайте про Дополнительный код. Фишка как раз в том что разные команды (и режимы) не нужны (по крайней мере для сложения и вычитания).

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 04:14 


21/05/16
4292
Аделаида
Dmitriy40 в сообщении #1471386 писал(а):
Что и зачем? Можно не дублировать, а иметь разные команды доступа к каждому виду памяти.
Вообще опишите подробнее в чём именно проблема/засада/вопрос и к какой архитектуре он относится. Пока я и проблемы не понимаю, и вариантов её решения есть несколько.

Я сейчас говорю про обычную архитектуру. Функции, работающие с данными, приходится дублировать, вы об этом сами же говорили:
Dmitriy40 в сообщении #1462873 писал(а):
Приходится дважды-четырежды дублировать очень многие функции, получающие в аргументах массивы/строки, ведь они могут лежать как в RAM, так и в ROM и команды доступа к ним разные.

Dmitriy40 в сообщении #1471386 писал(а):
Почитайте про Дополнительный код
. Фишка как раз в том что разные команды (и режимы) не нужны (по крайней мере для сложения и вычитания).

Ну, для сложения и вычитания - да. А если это и в самом деле сдвиг, как вы говорили? Тогда, скажем, 1111 в одном режиме будет сдвигом на 15, а в другом - на 7.

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 13:24 
Заслуженный участник


20/08/14
11061
Россия, Москва
kotenok gav в сообщении #1471394 писал(а):
А если это и в самом деле сдвиг, как вы говорили? Тогда, скажем, 1111 в одном режиме будет сдвигом на 15, а в другом - на 7.
На минус 1.
И тут сразу две плюшки: а) можно отказаться от двух команд сдвига (влево и вправо) и обойтись одной, а знак минус интерпретировать как сдвиг в противоположную сторону (что вообще говоря очевидно), б) да кому вообще нужны сдвиги длиннее машинного слова (а -8..+7 практически достаточно для сдвига байта)! ;-) А чем меньше разных кодов команд, тем проще устройство управления, оно может быстрее работать (основа RISC идеологии), короче команды, проще и лучше компиляторы (и ещё куча экономических причин).

kotenok gav в сообщении #1471394 писал(а):
Я сейчас говорю про обычную архитектуру. Функции, работающие с данными, приходится дублировать, вы об этом сами же говорили:
Обычной вообще-то считается фон Неймана с общей памятью данных и кода, там ничего дублировать не надо. А Вы явно всё же про Гарвардскую с раздельной памятью данных и кода.
Дублировать приходится по крайней мере в тех диалектах языков что я пользуюсь. И потому что я хочу всё же приличного быстродействия, хотя можно было бы поступить и наоборот, усложнить код функций ради упрощения их использования.
Вообще задача хранения данных в памяти кода может решаться на разных уровнях и разными способами, от аппаратных до программных или их смеси. Например ничто не мешает взять язык с развитым ООП и создать свои типы и классы, которые не будут привязаны к типу памяти, а будут его хранить где-то у себя внутри и всегда корректно обрабатывать. Но я заранее ужасаюсь от объёма и тормозов результирующего кода ... :facepalm: Хотя далеко не всегда это важно.
Опишу несколько разных методов решения задачи хранения данных в памяти кода:
Можно расширить длину адреса и хранить в нём признак памяти. Работает аппаратно и быстро, но усложняется устройство управления. Зато ПО простое.
Можно сделать разные команды доступа к памяти. Усложняется и аппаратура и ПО. Последнее иногда сильно, иногда не очень, причём выбор можно оставить за программистом (кому как захочется), можно делать быстрый но объёмный код, а можно сложный и медленный.
Можно через регистры подключать часть памяти кода в память данных. Аппаратно просто, ПО усложняется, но меньше чем в предыдущем варианте. Похоже работали XMS/EMS.
Можно часть регистров выделить для доступа только в память кода, тогда выбор типа памяти определяется выбором регистра с адресом. Аппаратно просто, ПО усложняется. При ручном программировании очень чревато глюками.
Можно всегда копировать данные в ОЗУ и работать только с ним. Копировать можно и на лету, и при включении питания, и по запросу программы, и ещё как-нибудь. ПО усложняется сильнее аппаратуры.
Можно каждому объекту (переменной, массиву, константе) приписать её тип и сделать полностью объектно-ориентированный процессор (примером является Intel iAPX 432). Аппаратно очень сложно, ПО усложняется не столь значительно. Плюсом является сильная защита от глюков программиста и взломов хакерами.
И этот список не исчерпывающий, можно и ещё придумать или вспомнить уже реализованное, но память и фантазия забастовали.
В общем необходимость дублирования данных или кода вовсе не является принципиальной в Гарвардской архитектуре, есть способы обойти, вопрос в их цене.

-- 30.06.2020, 13:29 --

kotenok gav
Давайте попросим модераторов переименовать тему в что-нибудь типа "Чип NXH5104 и проектирование процессоров"? Тема уже давно ушла от самого чипа и завернула в проектирование процессоров, но разрезать её на две смысла мало.

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 14:03 


21/05/16
4292
Аделаида
Dmitriy40 в сообщении #1471432 писал(а):
Обычной вообще-то считается фон Неймана с общей памятью данных и кода, там ничего дублировать не надо. А Вы явно всё же про Гарвардскую с раздельной памятью данных и кода.
Дублировать приходится по крайней мере в тех диалектах языков что я пользуюсь. И потому что я хочу всё же приличного быстродействия, хотя можно было бы поступить и наоборот, усложнить код функций ради упрощения их использования.
Вообще задача хранения данных в памяти кода может решаться на разных уровнях и разными способами, от аппаратных до программных или их смеси. Например ничто не мешает взять язык с развитым ООП
и создать свои типы и классы, которые не будут привязаны к типу памяти, а будут его хранить где-то у себя внутри и всегда корректно обрабатывать. Но я заранее ужасаюсь от объёма и тормозов результирующего кода ... :facepalm: Хотя далеко не всегда это важно.
Опишу несколько разных методов решения задачи хранения данных в памяти кода:
Можно расширить длину адреса и хранить в нём признак памяти. Работает аппаратно и быстро, но усложняется устройство управления. Зато ПО простое.
Можно сделать разные команды доступа к памяти. Усложняется и аппаратура и ПО. Последнее иногда сильно, иногда не очень, причём выбор можно оставить за программистом (кому как захочется), можно делать быстрый но объёмный код, а можно сложный и медленный.
Можно через регистры подключать часть памяти кода в память данных. Аппаратно просто, ПО усложняется, но меньше чем в предыдущем варианте. Похоже работали XMS
/EMS
.
Можно часть регистров выделить для доступа только в память кода, тогда выбор типа памяти определяется выбором регистра с адресом. Аппаратно просто, ПО усложняется. При ручном программировании очень чревато глюками.
Можно всегда копировать данные в ОЗУ и работать только с ним. Копировать можно и на лету, и при включении питания, и по запросу программы, и ещё как-нибудь. ПО усложняется сильнее аппаратуры.
Можно каждому объекту (переменной, массиву, константе) приписать её тип и сделать полностью объектно-ориентированный процессор (примером является Intel iAPX 432
). Аппаратно очень сложно, ПО усложняется не столь значительно. Плюсом является сильная защита от глюков программиста и взломов хакерами.
И этот список не исчерпывающий, можно и ещё придумать или вспомнить уже реализованное, но память и фантазия забастовали.
В общем необходимость дублирования данных или кода вовсе не является принципиальной в Гарвардской архитектуре, есть способы обойти, вопрос в их цене.

Нет, я говорил именно про архитектуру фон Неймана. Там данные могут находиться как и в ОЗУ, так и вместе с кодом (в отдельном куске памяти, но все равно). И поэтому мне кажется, что дублировать придется.
Dmitriy40 в сообщении #1471432 писал(а):
Давайте попросим модераторов переименовать тему в что-нибудь типа "Чип NXH5104 и проектирование процессоров"? Тема уже давно ушла от самого чипа и завернула в проектирование процессоров, но разрезать её на две смысла мало.

Предлагаю переименовать в "Апгрейд восьмибитного компьютера".

-- 30 июн 2020, 20:38 --

Ладно, вернемся к теме. За три дня я сделал "HDD" и MAR (не подключенные пока к основному компьютеру), мультиплексоры "обхода" регистров (с выбором из четырех вариантов: исходный байт, байт 0000 0000, байт 0000 0001, байт 1111 1111), и сейчас делаю битовые операции и сдвиги в ALU. Битовых операций я решил сделать восемь (not a, not b, a and b, a or b, a xor b, a nand b, a nor b, a xnor b). Сейчас для этого буду пытаться упростить выражение ((not a) and c) or ((not b) and d) or ((a and b) and e) or ((a or b) and f) or ((a xor b) and g) or ((a nand b) and h) or ((a nor b) and i) or ((a xnor b) and j) (только один из битов c...j равен единице, остальные равны нулю).

-- 30 июн 2020, 20:48 --

Пока лишь свел к (not a and c) or (not b and d) or (a and b and e) or (a and f) or (b and f) or (not b and a and g) or (not a and b and g) or (not (a and b) and h) or (not a and not b and i) or (a and b and j) or (not a and not b and j).

-- 30 июн 2020, 20:52 --

Которое является (not a and c) or (not b and d) or (a and b and e) or (a and f) or (b and f) or (not b and a and g) or (not a and b and g) or (not a and h) or (not b and h) or (not a and not b and i) or (a and b and j) or (not a and not b and j), это ДНФ того выражения.

-- 30 июн 2020, 21:08 --

Еще это то же самое, что (not a and b and (c or f or g or h)) or (not b and a and (d or f or g or h)) or (a and b and (e or j or f)) or (not a and not b and (i or j or c or h or d)), и это уже полегче записать в виде микросхем.

-- 30 июн 2020, 21:12 --

Там, на самом деле, все c...j инвертированы, так что получится not ((a or not b or (c and f and g and h)) and (b or not a or (d and f and g and h)) and (not a or not b or (e and j and f)) and (a or b or (i and j and c and h and d))).

-- 30 июн 2020, 21:21 --

Написал скрипт в питоне, говорит, неправильно.

-- 30 июн 2020, 21:24 --

А, упс, скрипт проверял не то, теперь все правильно.

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 15:02 


14/01/11
2916
kotenok gav в сообщении #1471437 писал(а):
Сейчас для этого буду пытаться упростить выражение ((not a) and c) or ((not b) and d) or ((a and b) and e) or ((a or b) and f) or ((a xor b) and g) or ((a nand b) and h) or ((a nor b) and i) or ((a xnor b) and j) (только один из битов c...j равен единице, остальные равны нулю).

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

-- Вт июн 30, 2020 15:11:40 --

По этой теме есть работы, вот, например:
https://logic.pdmi.ras.ru/~arist/papers/sat09.pdf

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 15:20 


21/05/16
4292
Аделаида
В общем-то, проблема состоит в минимизации числа бинарных AND и OR, и унарных NOТ. Но, кажется, я минимизировал их.

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 15:45 
Заслуженный участник


20/08/14
11061
Россия, Москва
kotenok gav в сообщении #1471437 писал(а):
Нет, я говорил именно про архитектуру фон Неймана. Там данные могут находиться как и в ОЗУ, так и вместе с кодом (в отдельном куске памяти, но все равно). И поэтому мне кажется, что дублировать придется.
В архитектуре фон Неймана и данные и код лежат в общем адресном пространстве и команды доступа к ним одинаковы (за исключением операции записи в ROM кода, которая может не выполняться или выполняться очень разными способами) и соответственно ничего дублировать не нужно вообще.

kotenok gav в сообщении #1471437 писал(а):
мультиплексоры "обхода" регистров (с выбором из четырех вариантов: исходный байт, байт 0000 0000, байт 0000 0001, байт 1111 1111),
Подача констант вместо данных из регистра или шины это интересно и полезно, но я вообще-то имел в виду проще, только лишь замену байта из регистра на байт с шины.
kotenok gav в сообщении #1471437 писал(а):
сейчас делаю битовые операции и сдвиги в ALU. Битовых операций я решил сделать восемь (not a, not b, a and b, a or b, a xor b, a nand b, a nor b, a xnor b).
Не очень понятно зачем так много битовых операций, но если хочется ... Кстати, Вы в курсе что на мультиплексоре 4-в-1 можно реализовать произвольную (т.е. все возможные) логическую функцию двух переменных (ссылка не фонтан, но на нормальный учебник быстро не нашлась)? Просто подачей на его 4 входа одного из 16-ти кодов, получите 16 разных логических функций (включая и обнуление и все единицы и инверсии обоих операндов). А на мультиплексоре 8-в-1 любую (из 256 возможных) логическую функцию трёх переменных. Плюс, если не гнаться за удобством программиста, то произвольную логическую функцию можно реализовать всего одной операцией (например 2ИЛИ-НЕ или 2И-НЕ, к ней требований всего два: 1) не менее двух входов, 2) наличие инверсии хоть где-то), муторно, но можно. Обычно в процессорах ограничиваются классикой (2И, 2ИЛИ, 2XOR, 1НЕ).
На практике, из битовых операций кроме логических весьма полезны: нахождение левого/правого нулевого (или единичного, и то и другое уже излишество, решается предварительной инверсией) бита, подсчёт количества единичных битов в слове (или хотя бы чётно оно или нет), объединение двух переменных по маске из третьей (blend в командах intel), вырезание/вставка одной переменной в/из другой по индексу в третьей, сжатие/разжатие переменной по маске из другой. Всё это можно сделать и обычными логическими командами, но очень муторно. И тут важно найти баланс между усложнением процессора (а оно для этих операций огромно) и упрощением и ускорением кода (почти все эти операции выполняются редко и обычно не критичны к скорости).
Зачем Вам команда определения наличия ровно одного единичного бита в слове не очень понятно. Или это не команда, а схема в АЛУ для выполнения каких-то других команд?
Из сдвигов принципиально наличие лишь сдвигов вправо, сдвиги влево легко реализуются как сложение само с собой. Сдвиги вправо бывают двух типов: арифметические (с дублированием знакового бита) и логические (с заполнением нулями или другим операндом для длинных сдвигов). Сдвиги влево и те и другие ничем друг от друга не отличаются.
Очень желательно наличие длинных сдвигов (или через перенос, или с взятием вдвигаемых битов из другого операнда). Без них грустно и код разрастается.
Приятно наличие сдвигов более чем на один бит, но это заметно усложняет схемотехнику.
Очень востребованы команды умножения, причём часто (при соответствующей реализации) они способны заменить команды сдвига. Очень желательно иметь возможность перемножать длинные числа (т.е. получать не только младшее слово результата умножения, но и старшее).
Приятно наличие команд деления (и тоже особенно с возможностью расширения операндов), но их реальная востребованность спорна, хотя программная реализация обычно на порядок-полтора тормознее аппаратной.
Вы в курсе что взяв ПЗУ 64Кх8 можно на нём реализовать абсолютно любую функцию двух 8-ми битных переменных? Просто подав обе переменные на адресные входы и корректно заполнив ПЗУ получим на его выходах что нам угодно. Добавив ещё адресов (увеличив объем ПЗУ) можно и переключать функции входных переменных в зависимости от кода коамнды. Добавив ещё адресную линию и несколько выходных линий у ПЗУ (увеличив объём и разрядность) можно задействовать и входной перенос и формирование флагов результата. А включив вместо или вместе с ПЗУ и ОЗУ соответствующего объёма (не менее 64К байтов) и организовав его загрузку откуда-то можно получить перестраиваемое прямо во время работы АЛУ. Это конечно профанация упрощения процессора, однако возможно и такое.
Вообще стоило бы поинтересоваться какие вообще обычно команды реализуют аппаратно (и чего это стоит в плане затрат аппаратуры). Сделать CISC систему типа Intel x86 с её расширениями AVX и прочими у Вас не получится (места в комнате не хватит), потому в любом случае придётся как-то ограничиваться. И этим вопросом занимались очень много и долго и грамотные товарищи (включая и множество научных исследований по оптимальным вариантам реализации очень разных алгоритмов на разных системах команд), стоит если не изучить их опыт, то хотя бы глянуть какими критериями и почему они руководствовались. Готовых ссылок у меня нет, но например меня в своё время очень впечатлил выбор одних проектировщиков между аппаратной реализацией сдвигателя на любое количество битов или умножителя, они занимают почти одинаковое количество аппаратуры, а возможности и полезность заметно разная (на тех задачах, под которые проектировался процессор! не любых!), а вместе они не влезали в кристалл. Аналогично и с логическими функциями АЛУ, можно поставить 8 одинаковых мультиплексоров 4-в-1, добавить в управляющее слово 4 бита и получить реализацию всех возможных логических функций двух переменных. Без всяких отдельных схем реализаций И, ИЛИ, НЕ, XOR, И-НЕ, ИЛИ-НЕ, НЕ-ИЛИ, НЕ-И и логикой объединения их выходов в АЛУ.

kotenok gav в сообщении #1471441 писал(а):
проблема состоит в минимизации числа бинарных AND и OR, и унарных NOТ.
Это противоречивое (или неполное) условие, часто можно минимизировать одни за счёт других. А ещё есть микросхемы с числом входов более двух, что тоже позволяет минимизировать количество корпусов микросхем (обычно ставят именно это условие, а не Ваше, они сильно не совпадают), даже за счёт усложнения логического выражения.

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 16:01 


21/05/16
4292
Аделаида
Dmitriy40 в сообщении #1471442 писал(а):
В архитектуре фон Неймана и данные и код лежат в общем адресном пространстве и команды доступа к ним одинаковы (за исключением операции записи в ROM кода, которая может не выполняться или выполняться очень разными способами) и соответственно ничего дублировать не нужно вообще.

А данные в ОЗУ?
Dmitriy40 в сообщении #1471442 писал(а):
Подача констант вместо данных из регистра или шины это интересно и полезно, но я вообще-то имел в виду проще, только лишь замену байта из регистра на байт с шины.

Окей, сделаю.
Dmitriy40 в сообщении #1471442 писал(а):
нахождение левого/правого нулевого (или единичного, и то и другое уже излишество, решается предварительной инверсией) бита, подсчёт количества единичных битов в слове (или хотя бы чётно оно или нет), объединение двух переменных по маске из третьей (blend в командах intel), вырезание/вставка одной переменной в/из другой по индексу в третьей, сжатие/разжатие переменной по маске из другой

Тоже сделаю.
Dmitriy40 в сообщении #1471442 писал(а):
Зачем Вам команда определения наличия ровно одного единичного бита в слове не очень понятно. Или это не команда, а схема в АЛУ для выполнения каких-то других команд?

А где я говорил про такую команду?...
Dmitriy40 в сообщении #1471442 писал(а):
Из сдвигов принципиально наличие лишь сдвигов вправо, сдвиги влево легко реализуются как сложение само с собой. Сдвиги вправо бывают двух типов: арифметические (с дублированием знакового бита) и логические (с заполнением нулями или другим операндом для длинных сдвигов). Сдвиги влево и те и другие ничем друг от друга не отличаются.
Очень желательно наличие длинных сдвигов (или через перенос, или с взятием вдвигаемых битов из другого операнда). Без них грустно и код разрастается.
Приятно наличие сдвигов более чем на один бит, но это заметно усложняет схемотехнику.
Очень востребованы команды умножения, причём часто (при соответствующей реализации) они способны заменить команды сдвига. Очень желательно иметь возможность перемножать длинные числа (т.е. получать не только младшее слово результата умножения, но и старшее).
Приятно наличие команд деления (и тоже особенно с возможностью расширения операндов), но их реальная востребованность спорна, хотя программная реализация обычно на порядок-полтора тормознее аппаратной.

Тоже сделаю.
Dmitriy40 в сообщении #1471442 писал(а):
Вы в курсе что взяв ПЗУ 64Кх8 можно на нём реализовать абсолютно любую функцию двух 8-ми битных переменных?

Да, знаю, это делалось и в оригинальном восьмибитном компьютере (для контрольной логики и отображения цифр).
Dmitriy40 в сообщении #1471442 писал(а):
Аналогично и с логическими функциями АЛУ, можно поставить 8 одинаковых мультиплексоров 4-в-1, добавить в управляющее слово 4 бита и получить реализацию всех возможных логических функций двух переменных.

О, это очень хорошо! Сделаю.
Dmitriy40 в сообщении #1471442 писал(а):
Это противоречивое (или неполное) условие, часто можно минимизировать одни за счёт других.

Я имел в виду "минимизировать суммарное число".

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 17:13 


21/05/16
4292
Аделаида
kotenok gav в сообщении #1471444 писал(а):
Dmitriy40 в сообщении #1471442

писал(а):
Подача констант вместо данных из регистра или шины это интересно и полезно, но я вообще-то имел в виду проще, только лишь замену байта из регистра на байт с шины.
Окей, сделаю.

Да, кстати: тогда лучше убрать одну из констант, как думаете, лучше убрать 0000 0001 или 1111 1111? По сути, они взаимозаменяемы, но второе еще и легко получается из 0000 0000...

-- 30 июн 2020, 23:45 --

kotenok gav в сообщении #1471444 писал(а):
Dmitriy40 в сообщении #1471442

писал(а):
Аналогично и с логическими функциями АЛУ, можно поставить 8 одинаковых мультиплексоров 4-в-1, добавить в управляющее слово 4 бита и получить реализацию всех возможных логических функций двух переменных.
О, это очень хорошо! Сделаю.

Сделал.

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 18:09 
Заслуженный участник


20/08/14
11061
Россия, Москва
kotenok gav в сообщении #1471444 писал(а):
А где я говорил про такую команду?...
Я просто не понял откуда и для чего взялось это страшное выражение.

kotenok gav в сообщении #1471450 писал(а):
Да, кстати: тогда лучше убрать одну из констант, как думаете, лучше убрать 0000 0001 или 1111 1111? По сути, они взаимозаменяемы, но второе еще и легко получается из 0000 0000...
Если вопрос ставить именно так, то -1 нужно реже +1, а учитывая легкость получения -1 я бы оставил +1. Ещё и потому что обычно есть как команды сложения, так и команды вычитания, что позволяет заменить ADD R,-1 на SUB R,+1 и обойтись без -1. С другой стороны, наличие -1 позволяет обойтись без команды NOT (НЕ), заменив её командой XOR с -1.
Хотя лёгкость получения спорна, ведь любую из 0..+15 (или что по моему гораздо полезнее из -8..+7) можно получить из непосредственного операнда. Так что возможно излишни вообще все три константы, тут надо хорошо подумать в каких случаях они будут (или не будут) использоваться. А это зависит от других команд которые будут в наличии (например будет ли команда организации циклов, где в ином случае весьма полезна -1 или команда вычитания +1, и т.д.).

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 19:47 
Заслуженный участник


20/08/14
11061
Россия, Москва
kotenok gav в сообщении #1471444 писал(а):
Dmitriy40 в сообщении #1471442 писал(а):
В архитектуре фон Неймана и данные и код лежат в общем адресном пространстве и команды доступа к ним одинаковы (за исключением операции записи в ROM кода, которая может не выполняться или выполняться очень разными способами) и соответственно ничего дублировать не нужно вообще.
А данные в ОЗУ?
А что с ними не так и зачем их дублировать (в архитектуре фон Неймана)? Я опять не понимаю вопроса.

 Профиль  
                  
 
 Re: Чип NXH5104
Сообщение30.06.2020, 20:30 


21/05/16
4292
Аделаида
Ну смотрите. Есть данные в ОЗУ, и есть данные в отдельной памяти, которые перемешанны (ну, не совсем) с кодом. Команды доступа туда и туда разные.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 98 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group