Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 10:20

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 08, 2006 06:43 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
oleg писал(а):
А мне тут кто-то предлагал исключить регистр ADDRESS из устройства Cool

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

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 08, 2006 06:51 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Ясно.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 10, 2006 03:26 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Не спится. И в голове все этот четырехбитный проц крутится.
И мысли кое какие визникли.

Для начала, напомню одно из предложений набора команд:
Код:
0 - nop
1 - call
2 - if
3 - lit
4 - >R
5 - R>
6 - ret
7 - dup
8 - drop
9 - over
A - swap
B - pre:
C - user:
D - sys:
E - fetch
F - store

отвлекемся от префиксов и выделим некоторые команды:

Код:
0 - nop
1 - call
2 - if
3 - lit
6 - ret
E - fetch
F - store


nop - вызывает споры, но я продолжу настаивать на том, чтобы она была, потому что у нее появляется одна очень нужная процессору функция - выборка слезующей группы команд.
Кажется, это должна делать каждая команда, но на самом деле это не так! Если процессор 16-разрядный, то у него в слове 4 команды, а выбирать следующие 4 надо один раз, a не четыре, поэтому я включаю в набор команду nop, ответственную за выборку команд, и она "грузится" в очередь команд пятой вместе с текущей загружаемой четверкой, в результате, четыре команды отрабатывают без обращения за новыми командами, а пятая - nop - и выполняет необходимое действие по загрузке. Если же такого не сделать, то устройство управления должно будет содержать семнадцатую фиктивную команду, которая и будет выполнять это действие!

Теперь о следующих командах.
lit, call и if имеют общее действие - загрузку литерала.
Его можно грузить явно, используя lit перед call и if, а можно сделать и иначе.
Вспомним, что мы проектируем все же форт-процессор, а для работы форта нужна реализация адресного интерпретатора, который по сути состоит из одной команды NEXT, которая берет адрес со стека возратов, разыменовывает его и загружает в счетчик команд, т.е это команда R@@->PC. И ВСЕ. Команда ret оказывается аналогом CODE, а вызов адресного интерпретатора заключается во вталкивании на стек возвратов счетчика команд и исполнения NEXT.
Нужен ли call при наличии такого механизма? Мне кажется, что не нужен!
Таким образом, можно в наборе заменить команду call на команду next и получить наибыстрейший механизм для адресного интерпретатора. Остается только придумать, какой командой делать вызов адресного интерпретатора, пока просто обозначим команду - adint, которая всего лишь выполняет загрузку PC в стек возвратов.
Чтобы не нервничать по этому поводу, заменим ей один из префиксов.

Код:
0 - nop
1 - next
2 - if
3 - lit
4 - ret
5 - adint
6 - fetch
7 - store


Код:
8 - >R
9 - R>
A - dup
B - drop
C - over
D - swap
E - pre:
C - user:


Расписываем действия каждой команды.
Для начала, определяем состав процессора
(считаем на 16-битный процессор):

R_Stack -- стек
D_Stack -- стек
PC -- счетчик команд
ALU -- угадайте с трех раз :)
RCMD -- 20-битный регистр команд
DI[] -- входная шина данных
DO[] -- выходная шина данных
AO[] -- выходная шина адреса

Код:
IF (RCMD[3..0] != 0) THEN
    RCMD[19..0] = B"0000",RCMD[19..4]; -- сдвиг команд
ELSE
    RCMD[19..0] = B"0000",DI[]; -- загрузка команд
    PC[] = PC[]+1; -- следующий адрес команд
END IF;


Код:
0 - nop - PC@ ->  RCMD; PC+1 -> PC;
1 - next - R@@->PC
2 - if - PC@->PC, then PC+1->PC else
3 - lit - PC@; PC+1->PC
4 - ret - R_Stack -> PC
5 - adint PC -> R_Stack
6 - fetch  PC -> R_Stack; D_Stack -> PC;
           PC@ -> D_Stack; R_Stack -> PC;
7 - store  PC -> R_Stack; D_Stack -> PC;
           D_Stack -> (PC!); R_Stack -> PC;

Описание действия восьми остальных я опускаю в виду их очевидности.
Есть только вопрос с префиксами, они должны выполнять операцию, определяемую следующей четверкой, т.е. битами из RCMD[7..4], а следующей командой при этом должна грузиться четверка RCMD[11..8], т.е:
Код:
IF (RCMD[3..0] != 0) THEN
    IF (RCMD[3..0] != B"111X") THEN
        RCMD[19..0] = B"0000",RCMD[19..4];
    ELSE
        RCMD[19..0] = B"00000000",RCMD[19..8];
    END IF;
ELSE
    RCMD[19..0] = B"0000",DI[]; -- загрузка команд
    PC[] = PC[]+1; -- следующий адрес команд
END IF;


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

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 10, 2006 03:52 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Очень большой ответ 8) Поэтому я буду отвечать помаленьку.
Я тоже думаю об этом.
(Я не реализовывал ранее процессоров на плисах, но с плисами работал.)
Насчет префиксов я категарически не согласен и настаиваю на таком наборе:

if - ( flag addr --> flag ) - не удаляет флаг после выполнения перехода
call - ( addr --> ) войти во вложенное определение [ IP@ >R TOP IP! ] - как это заменить я не представляю
ret - ( r: addr --> ) выйти из вложенного определения. [ RTOP IP! ] - можно заменить на r> dup if но не стоит

dup
drop
over
swap

add ( na nb --> na+b ) сложить два числа с учетом переноса в регистр переноса, который мапится в память
and ( na nb --> na&b ) на флаги не воздействует
xor ( na nb --> naXORb ) на флаги не воздействует
shift ( n # --> <<n||n>> ) сдвинуть число на # бит. Сдвиг арифметический с заемом из старшего бита в регистр переноса (целиком, а не только последний бит)

>r тут все понятно
r> тут тоже

lit ( --> n ) единственная команда, которая выгребает данные, находящиеся в коде за ней
store ( n addr --> addr ) - вершина стека, как и в команде if содержит адрес, адрес после выполнения не удаляется а инкрементируется на минимально адресуемую величину (4 бита гранулярность памяти)
fetch ( addr --> n ) извлечь из памяти число

таким образом на вершине стека всегда находится адрес.

команду nop не предусматриваю. префиксы тоже.
Ну не нравятся мне префиксы!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 10, 2006 04:09 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
кстати, как правильно присоединять картинки? Никогда этого не делал 8(

вобщем получаются такие связи по данным:
выход TOP на входы: SUBTOP, RTOP, IP, ALUa, ADDR = 5 путей
выход SUBTOP на входы: TOP, DS, ALUb, MEMORY = 4 пути
выход DS на вход SUBTOP
выход IP на входы RTOP, ADDR
выход RTOP на входы: TOP, RS, IP = 3 пути
выход RS на вход RTOP
выход ALU на вход TOP
память на вход TOP, DC

DS, RS - стеки данных и команд
DC - дешифратор команд
регистра ADDR может не быть, но его надо как-то обзывать 8)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 10, 2006 04:46 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Для такой модели я бы предпочел 12 битный процессор, тем более, что я его хочу запихнуть в EPF10K10-3 которые у меня есть в наличии 8)
WingLion писал(а):
Теперь о следующих командах.
lit, call и if имеют общее действие - загрузку литерала.

я предпочел бы оставить только lit. За скорость я не борюсь, а вот гибкость у косвенных переходов значительно большая! В любом случае через косвенный переход реализовать прямой переход просто с помощью литерала, а вот наоборот...
WingLion писал(а):
адресного интерпретатора, который по сути состоит из одной команды NEXT, которая берет адрес со стека возратов, разыменовывает его и загружает в счетчик команд, т.е это команда R@@->PC.

Вот здесь у меня есть некоторое удивление. Все оно правильно, но применимо только к системам с косвенным шитым кодом, конечно можно представлять программу как набор адресов... Возможно это будет даже эффективно. Ладно, надо думать. Мне кажется что здесь что-то не то. Вот, дошло! Придется заводить еще один регистр, помимо счетчика команд.

WingLion писал(а):
ызов адресного интерпретатора заключается во вталкивании на стек возвратов счетчика команд и исполнения NEXT.

Заметь, в системах с шитым кодом команда EXIT & CALL присутствуют!
WingLion писал(а):
Нужен ли call при наличии такого механизма? Мне кажется, что не нужен!

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

доступ к памяти я хочу делать 8-битный для любой разрядности данных.
и не знаю, стоит ли делать такой длинный буфер команд.

вобщем взгляды различными могут быть. Нужно делать каждому свое 8) а потом сравнивать удачность решения! Мне хочется сделать что-то вроде ТТА: у меня получается что должно быть 5 универсальных шин данных ( может это позволит выполнять пару команд одновременно, хотя я таких пока что не вижу - все наборы сильно пересекаются.

Есть идея, заменить команду SWAP & OVER на еще один стек( только неглубокий) тогда будет легче реорганизовывать стек данных.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 10, 2006 11:53 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Кстати, еще одна мысля.
Если не делать префиксов, можно сделать ALU с 16-ю командами, и мапить в память выбор этих команд для четырех операций, т.е.
группа
Код:
add
and
xor
shift

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

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 11, 2006 01:25 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
теперь картинка 8)
Изображение
вот такой граф у меня получился.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 11, 2006 01:48 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
и вот такой получился транспорт, если я не ошибся:
Изображение


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 20, 2006 00:45 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Я тут насчет флагов подумал, и понял, что вообще-то проблема только с флагом заема-переполнения, так как знаковый флаг легко получить по and с числом у которого 1 в старшем разряде. А if сам проверит на равенство нулю.
И еще, оказалось, что альтера не хочет создавать блоки во встроенной памяти не кратные 4 -ем.
и максимальная разрядность одного блока 8 бит 8( или я не правильно понял?
Делать стеки на регистрах не очень хоца.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 20, 2006 01:01 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
хм... с Альтерой странно... Не помню, чтобы проблемы были с размером блоков памяти. Хотя, на EPF10K10 использовал только 8-разрядные блоки.
Иная разрядность, по идее должна реализовываться простым усечением или добавлением EAB в самой мегафункции.

Я использовал для памяти в 10K10 мегафункцию lpm_ram_dq

В ACEX лучше использовать уже lpm_ram_dp т.к. RAM там двухпортовая с разными адресами на запись и чтение.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 29, 2006 01:24 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Сильно не ругайте, я вижу это так:
Код:
Parameters(dataWidth=12);

Subdesign TOP
(       -- источники данных
           Ist[datawidth..1]       : input ; -- from subtop
           Irt[datawidth..1]       : input ; -- from rtop
           Ial[datawidth..1]       : input ; -- from alu
           Imm[datawidth..1]       : input ; -- from memory
        -- входы выбора источника
           rs, rr, ra, rm          : input ;
           reset                   : input ;
           clk                     : input ;

        -- выход данных
           out[datawidth..1]       : output ;
           eqzero                  : output ;
)

Variable
                reg[datawidth..1]  : dff ;
                locker             : node ;
Begin

        locker=dff(.d=(rs#rr#ra#rm),
                   .clk=(lcell(clk)),
                   .clrn=lcell(!locker)
                  );

        For i in 1 to datawidth Generate

            reg[i].d=(cascade((Ist[i]&rs)#(Irt[i]&rr))#
                     (Ial[i]&ra)#(Imm[i]&rm));

        End generate;

        if reg[].q == 0 Then   eqzero = Vcc;
         ElsIf reg[].q != 0 Then eqzero = Gnd;
        End if;

        reg[].clk=locker;
        reg[].clrn=reset;

        out[] = reg[].q;

End;


согласно выше приведенной блок схеме.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 30, 2006 00:50 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
увы, четырех битный проц реализован уже.

http://www.cse.cuhk.edu.hk/~phwl/mt/pub ... msl16.html

но набор команд всетаки в 4 бита чуточку не вмещается 8) получается 17 а не 16!

0 - NOP
1 - AND
2 - XOR
3 - ADD
4 - 0=
5 - lit
6 - 2/
7 - SUB
8 - DUP
9 - DROP
A - if
B - R>
C - >R
D - @
E - !
F - SWAP
MSB=1 - call

такие вот дела. Явный переизбыток математики и кое еще чего. Мой вариант интереснее.
У них все влезло в EPF10K30 а я хочу в EPF10K10


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 30, 2006 11:06 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
oleg писал(а):
У них все влезло в EPF10K30 а я хочу в EPF10K10


Ой, а на фотке (по ссылке) платка с Ксайлинксом, a не с Альтерой...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 30, 2006 22:19 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
Ой, а на фотке (по ссылке) платка с Ксайлинксом, a не с Альтерой...


Ага. И стаааааарым... :) В PLCC разве что XC4000 или Spartan какой-нибудь, из мелких.


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

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB