Вопросы по ВМ NL2

Вопросы по ВМ NL2

Сообщение Рустам » 26 ноя 2009, 22:18

Думаю, эта тема пригодится. :twisted:
Аватара пользователя
Рустам
 
Сообщения: 164
Зарегистрирован: 27 май 2008, 01:24

Re: Вопросы по ВМ NL2

Сообщение invaisor » 29 ноя 2009, 19:40

Рустам писал(а):Думаю, эта тема пригодится. :twisted:

Это точно :)
А вот и вопросики:

  1. С режимом логического вычисления.
    Не совсем понятно как реализовывать некоторые логические функции, к примеру сравнение на больше или равно.
    Т.е. мы вычититаем из одного числа другое => получаем в @0 некоторые флаги заема (которые там будут или нет).
    И если мы используем режим логического преобразования, то @0 схлопывается в 1 бит (>0 - 111111111, ==0 - 0)?
    Тогда не особо понятно как из всего этого реализовать такое сравнение.
    Хотя конечно можно сначала вычесть, потом сложить, а потом сравнить на равенство путем вычитания, тогда некое подобие сравнение на больше или равно будет.
  2. В описании NLMM упомянут регистр NLN (номер нетлиста), как я понял, с помощью которого можно переключаться между нетлистами. Однако, в симуляторе такого регистра нет. Таким образом не понятно как переключаться между нетлистами.
Аватара пользователя
invaisor
 
Сообщения: 227
Зарегистрирован: 08 апр 2008, 16:08

Re: Вопросы по ВМ NL2

Сообщение Рустам » 29 ноя 2009, 21:44

invaisor писал(а):Не совсем понятно как реализовывать некоторые логические функции, к примеру сравнение на больше или равно.

Для сравнения нужно выполнить инструкцию. Обычно это инструкция вычитания. В результате вычитания получаем результат и флаг переноса в регистре @0. Их мы подаем на вход инструкции, вычисляющей логическую функцию. Инструкция в режиме логической функции имеет 1 вход и имеет доступ к регистру @0. По этому входу и регистру @0 инструкция вычисляет следующие значения:
!ZERO
SIGN
CARRY
CARRY^OVERDLOW
Эти значения преобразуются в логические (либо 00000000, либо 11111111) и подаются на 4 входа инструкции. Далее нужно рассчитать значение логического выражения. В вашем случае не указано, какое сравнение: знаковое или беззнаковое. В зависимости от этого получится логическая функция. Например, для логического выражения "не меньше и не равно" (взято из документации на nl2ucd) логическая функция следующая:
~((SIGN ^ OVERFLOW) | ZERO)
Проблема в том, что у вас нет 4-ки логических значений, но есть 4-ка других значений, полученная из тех, что нужны вам. Значит логическую функцию нужно выразить в новой 4-ке (смена логического базиса). Получаем:
~(SIGN ^ CARRY ^ (CARRY^OVERFLOW)) & !ZERO

invaisor писал(а):Т.е. мы вычититаем из одного числа другое => получаем в @0 некоторые флаги заема (которые там будут или нет).

При использовании обратной связи в @0 сохраняется флаг переноса/заема.

invaisor писал(а):И если мы используем режим логического преобразования, то @0 схлопывается в 1 бит (>0 - 111111111, ==0 - 0)?

Не совсем. Просто все биты входного значения становятся равными 0 или 1.

invaisor писал(а):Хотя конечно можно сначала вычесть, потом сложить, а потом сравнить на равенство путем вычитания, тогда некое подобие сравнение на больше или равно будет.

Достаточно просто вычесть и сравнить. 8-)

invaisor писал(а):В описании NLMM упомянут регистр NLN (номер нетлиста), как я понял, с помощью которого можно переключаться между нетлистами.

Это регистр @0. Он существует независимо от разрядности виртуальной машины. В @0 сохраняется перенос и содержимое этого регистра анализируется после окончания исполнения нетлиста. Регистр @0 и есть регистр NLN.
Аватара пользователя
Рустам
 
Сообщения: 164
Зарегистрирован: 27 май 2008, 01:24

Re: Вопросы по ВМ NL2

Сообщение invaisor » 29 ноя 2009, 22:28

Рустам писал(а):
invaisor писал(а):Не совсем понятно как реализовывать некоторые логические функции, к примеру сравнение на больше или равно.

Для сравнения нужно выполнить инструкцию. Обычно это инструкция вычитания. В результате вычитания получаем результат и флаг переноса в регистре @0. Их мы подаем на вход инструкции, вычисляющей логическую функцию. Инструкция в режиме логической функции имеет 1 вход и имеет доступ к регистру @0. По этому входу и регистру @0 инструкция вычисляет следующие значения:
!ZERO
SIGN
CARRY
CARRY^OVERDLOW
Эти значения преобразуются в логические (либо 00000000, либо 11111111) и подаются на 4 входа инструкции. Далее нужно рассчитать значение логического выражения. В вашем случае не указано, какое сравнение: знаковое или беззнаковое. В зависимости от этого получится логическая функция. Например, для логического выражения "не меньше и не равно" (взято из документации на nl2ucd) логическая функция следующая:
~((SIGN ^ OVERFLOW) | ZERO)
Проблема в том, что у вас нет 4-ки логических значений, но есть 4-ка других значений, полученная из тех, что нужны вам. Значит логическую функцию нужно выразить в новой 4-ке (смена логического базиса). Получаем:
~(SIGN ^ CARRY ^ (CARRY^OVERFLOW)) & !ZERO

Спасибо, теперь вроде понятно.

Рустам писал(а):
invaisor писал(а):Хотя конечно можно сначала вычесть, потом сложить, а потом сравнить на равенство путем вычитания, тогда некое подобие сравнение на больше или равно будет.

Достаточно просто вычесть и сравнить. 8-)

Это понятно, но таким образом нам нужно будет только сравнить на равенство нулю, что я представлял как сделать.

Рустам писал(а):
invaisor писал(а):В описании NLMM упомянут регистр NLN (номер нетлиста), как я понял, с помощью которого можно переключаться между нетлистами.

Это регистр @0. Он существует независимо от разрядности виртуальной машины. В @0 сохраняется перенос и содержимое этого регистра анализируется после окончания исполнения нетлиста. Регистр @0 и есть регистр NLN.

Неожиданно :) Я думал он будет 0x0F, для совместимости с NL1.
Аватара пользователя
invaisor
 
Сообщения: 227
Зарегистрирован: 08 апр 2008, 16:08

Re: Вопросы по ВМ NL2

Сообщение Рустам » 30 ноя 2009, 03:32

invaisor писал(а):Это понятно, но таким образом нам нужно будет только сравнить на равенство нулю, что я представлял как сделать.

Что-то я уже потерял суть вопроса. Любые сравнения типа "больше-меньше" реализуются через вычитание.
Аватара пользователя
Рустам
 
Сообщения: 164
Зарегистрирован: 27 май 2008, 01:24

Re: Вопросы по ВМ NL2

Сообщение invaisor » 30 ноя 2009, 21:38

Рустам писал(а):
invaisor писал(а):Это понятно, но таким образом нам нужно будет только сравнить на равенство нулю, что я представлял как сделать.

Что-то я уже потерял суть вопроса. Любые сравнения типа "больше-меньше" реализуются через вычитание.

Сейчас вопрос уже снят :)

Но появились другие -

  1. Секундный таймер (TIMER_SEC) считает не 1 раз в секунду, а, наверное, раза 4 в секунду или больше.
  2. Какое-то непонятное поведение индикатора при использовании LCD_DECN.
    Если мы просто записываем значение в LCD_BUF, а потом раскидываем во все LCD_DECN, то все нормально.
    Но если нам нужно вывести 2 десятичных числа, находящихся в регистрах @4 и @5, то вот такой код:
    Код: Выделить всё
    {rm}   move @4 LCD_BUF
    {mr}   move LCD_DEC0 @10
    {mr}   move LCD_DEC1 @11
    {rm}   move @5 LCD_BUF
    {mm}   move LCD_DEC0 LED0
    {mm}   move LCD_DEC1 LED1
    {rm}   move @10 LED2
    {rm}   move @11 LED3


    дает очень странный результат вне зависимости от значений в регистрах @4 и @5:
    Код: Выделить всё
    _0_0

    где пробел - это пусто.

    Хотя такой код (без использования LCD_DECN) работает:
    Код: Выделить всё
    {rm}   move @4 LCD_BUF
    {mr}   move LCD_HEX0 @10
    {mr}   move LCD_HEX1 @11
    {rm}   move @5 LCD_BUF
    {mm}   move LCD_HEX0 LED1
    {mm}   move LCD_HEX1 LED0
    {rm}   move @10 LED3
    {rm}   move @11 LED2
Аватара пользователя
invaisor
 
Сообщения: 227
Зарегистрирован: 08 апр 2008, 16:08

Re: Вопросы по ВМ NL2

Сообщение Рустам » 01 дек 2009, 00:59

invaisor писал(а):Секундный таймер (TIMER_SEC) считает не 1 раз в секунду, а, наверное, раза 4 в секунду или больше.

А такой код работает? Надеюсь, мнемоники инструкций понятные.
Код: Выделить всё
<netlist id="0">
{*m}   imove 30 TIMER_SEC
   imove 1 @0
</netlist>

<netlist id="1">
{mm}   move TIMER_SEC LCD_BUF
{mm}   move LCD_HEX0 LED1
{mm}   move LCD_HEX1 LED0
</netlist>


Кстати, в тестовом проекте отсутствует определение таймеров. Вы его сами добавили? Я выложил обновление test.xml

invaisor писал(а):Какое-то непонятное поведение индикатора при использовании LCD_DECN.

Просто нужно понять, что оказывается в LCD_DEC0, LCD_DEC1, LCD_DEC2 и LCD_DEC3 после преобразования. Выведите их всех на ЖКИ.
Аватара пользователя
Рустам
 
Сообщения: 164
Зарегистрирован: 27 май 2008, 01:24

Re: Вопросы по ВМ NL2

Сообщение invaisor » 01 дек 2009, 01:48

Рустам писал(а):А такой код работает? Надеюсь, мнемоники инструкций понятные.
Код: Выделить всё
<netlist id="0">
{*m}   imove 30 TIMER_SEC
   imove 1 @0
</netlist>

<netlist id="1">
{mm}   move TIMER_SEC LCD_BUF
{mm}   move LCD_HEX0 LED1
{mm}   move LCD_HEX1 LED0
</netlist>


Кстати, в тестовом проекте отсутствует определение таймеров. Вы его сами добавили? Я выложил обновление test.xml

Да с таймером все нормально, просто с кодом было не очень :)
Сказывается отсутствие возможности реализации демультиплексора, пришлось дополнительный нетлист задействовать для этого. Добавить описание таймера - это просто 1 дефайн на адрес в память, добавить было нетрудно.

Рустам писал(а):Просто нужно понять, что оказывается в LCD_DEC0, LCD_DEC1, LCD_DEC2 и LCD_DEC3 после преобразования. Выведите их всех на ЖКИ.

Да осознал. Просто думал, что если индекс 0, то это младшее значение :)
Аватара пользователя
invaisor
 
Сообщения: 227
Зарегистрирован: 08 апр 2008, 16:08

Re: Вопросы по ВМ NL2

Сообщение invaisor » 04 дек 2009, 22:32

Или я что-то опять не понимаю, или где-то ошибка.
Допустим мы создадим микрокод move_3 с 1 входом (const) и 3 выходами (register). Логическая операция - прямое соответствие выходов входу.
Получим такой код:
Код: Выделить всё
<microcode name="move_3" data="020000707000000000000000" />


Теперь, если мы напишем так:
Код: Выделить всё
move_3 0 @2 @3 @4


то все нормально откомпилируется.
Но если мы попытаемся параметризовать, например задать вместо регистров память вот так:
Код: Выделить всё
{cmmm}  move_3 0 [0x10] [0x11] [0x12]


то мы получим -
Код: Выделить всё
Creating the binary image...
ERROR: Netlist id=0, line=6. Invalid microcode activation mode.
ERROR: Cannot create a binary equivalent for a netlist (id=0).
ERROR: Compilation failed.


Вопрос - я неправильно задаю параметризацию, хотя в других случаях она работает :shock:, или что-то еще?
Аватара пользователя
invaisor
 
Сообщения: 227
Зарегистрирован: 08 апр 2008, 16:08

Re: Вопросы по ВМ NL2

Сообщение Рустам » 05 дек 2009, 01:03

Параметризовать можно входы и выходы. Причем входы параметризуются индивидуально, а выходы - все сразу. Т.о. выходы параметризуются одним символом.
Аватара пользователя
Рустам
 
Сообщения: 164
Зарегистрирован: 27 май 2008, 01:24

Re: Вопросы по ВМ NL2

Сообщение invaisor » 05 дек 2009, 01:21

Рустам писал(а):Параметризовать можно входы и выходы. Причем входы параметризуются индивидуально, а выходы - все сразу. Т.о. выходы параметризуются одним символом.


Спасибо!
Так вот в чем был сакраментальный смысл шаманской записи "1234Z", мне казалось что под Z можно сконфигурировать более 1 выхода.
Аватара пользователя
invaisor
 
Сообщения: 227
Зарегистрирован: 08 апр 2008, 16:08

Re: Вопросы по ВМ NL2

Сообщение Интегральный вычислитель » 13 дек 2009, 23:13

В code designer'e есть некие параметры сопроцессора. Не совсем понятно что такое сопроцессор и какая от него польза.
I Have Seen The Truth And It Doesn't Make Any Sense
Аватара пользователя
Интегральный вычислитель
 
Сообщения: 561
Зарегистрирован: 02 апр 2008, 16:04
Откуда: из Леса

Re: Вопросы по ВМ NL2

Сообщение Рустам » 14 дек 2009, 01:29

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

Когда я рассказывал про NL2, в моей речи были слова о том, что сопроцессоры позволяют выполнять преобразования данных, которые не описываются логическими функциями. Например: табличная выборка, масштабирование и др.
Аватара пользователя
Рустам
 
Сообщения: 164
Зарегистрирован: 27 май 2008, 01:24


Вернуться в Программно - аппаратный базис ВВС

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

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

cron