|
|
|
Свои процессоры, Разработка своих процессоров со своей системой команд |
|
|
|
Mar 13 2009, 10:55
|
Гуру
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881
|
Цитата(Ynicky @ Mar 13 2009, 13:23) А у меня уже есть свой процессор. LCC осилил, а вот с ассемблером напряг. По образованию я не программист, но приходится писать программы для отладки железа. Мой совет, как уже прошедшего этот этап - берите binutils, и делайте на основе какого-то уже существующего там. Неделя на то, чтобы въехать, ну и неделя на то, чтобы свой сделать. Там, в бинутилс, "все для людей", т.е. добавить свою систему команд достаточно просто, при том, что сразу будут работать все фичи и объектного кода, и линковки. Что интересно - я давал объявление на эту работу (за деньги), ни одного желающего не нашлось! Не то, что бы условия не устроили, а они были вполне щедрыми, а именно не было даже желающих!
|
|
|
|
|
Mar 13 2009, 11:40
|
Местный
Группа: Свой
Сообщений: 429
Регистрация: 11-08-05
Из: Санкт-Петербург
Пользователь №: 7 537
|
Цитата(PVL @ Mar 12 2009, 23:53) Система команд пока не для записи во внешнюю память - аж 57 бит на инструкцию. Какой формат инструкции?
|
|
|
|
|
Mar 19 2009, 16:03
|
Участник
Группа: Участник
Сообщений: 38
Регистрация: 1-02-07
Пользователь №: 24 959
|
Цитата(SM @ Mar 13 2009, 21:41) Ну почему же - расширить до 64 бит, и при шине внешней памяти шириной 128 и больше бит очень даже смотреться будет, выборка по паре или более инструкций за такт. Хотя лично я предпочитаю variable length, правда ведущую за собой серьезные усложнения декодера и схемы буфера предвыборки. (я так понял, что речь все таки в данном случае идет о суперпроизводительной числомолотилке, а не о CPU общего назначения, перекошенного под что-то конкретное) 57 бит нужно ядру ,чтобы выполнить инструкцию. Типа откуда взять, как переключить мультиплексор разультата, как положить. С положить напряг - умноженеи и деление результат 64 бита, умножение 9 тактов, сложение 4, деление 12 кароче баги с конвейером. Цитата(SM @ Mar 13 2009, 21:41) Ну почему же - расширить до 64 бит, и при шине внешней памяти шириной 128 и больше бит очень даже смотреться будет, выборка по паре или более инструкций за такт. Хотя лично я предпочитаю variable length, правда ведущую за собой серьезные усложнения декодера и схемы буфера предвыборки. (я так понял, что речь все таки в данном случае идет о суперпроизводительной числомолотилке, а не о CPU общего назначения, перекошенного под что-то конкретное) Во первых систему команд, хочется уложить в 16 бит дабы не юзать БГА корпус. Народный проц хочу сделать. Во вторых уже не просто числомолотилка поскольку есть спец узлы под фурье и вейвлет, на числомолотилке раз в 10 медленнее будет. Шина 96 бит - читать шесть инструкций за такт дабы работать на СРАМ. С динамикой пока лениво связываться. И вообще сейчас есть спартан 3Е - 500к. На нем не далеко уити от числомолотилки..
|
|
|
|
|
Mar 25 2009, 06:29
|
я только учусь...
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839
|
Цитата(PVL @ Mar 19 2009, 20:03) 57 бит нужно ядру ,чтобы выполнить инструкцию. Типа откуда взять, как переключить мультиплексор разультата, как положить. С положить напряг - умноженеи и деление результат 64 бита, умножение 9 тактов, сложение 4, деление 12 кароче баги с конвейером. А можно узнать как Вы делаете целочисленное деление за 12 тактов, наверное при разрядности данных 32 или 16. Поделитесь пожалуйста алгоритмом, а лучше описанием на VHDL (идеальный вариант )/Verilog (если конечно это возможно) Цитата(SM @ Mar 24 2009, 23:13) нет, готовая среда для разработки С компайлера это gcc А binutils это binutils - ассемблер, линкер, objdump, и прочее вокруг а не подскажите где можно взять готовую среду - gcc?
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Mar 25 2009, 08:33
|
Гуру
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881
|
Цитата(Maverick @ Mar 25 2009, 09:29) А можно узнать как Вы делаете целочисленное деление за 12 тактов, наверное при разрядности данных 32 или 16. Поделитесь пожалуйста алгоритмом, а лучше описанием на VHDL (идеальный вариант )/Verilog (если конечно это возможно) А в чем вопрос-то? Например деление за два такта делается при помощи комбинаторного "полуделителя", который при N-битном входе дает N/2-битное частное и N-битный остаток. Деление за 3 такта - "третьделителя" - соотв N/3 и N. Ну и так далее. вот пример полнофункционального делителя, который делит 8/8 бит за 1 такт, а 16/16 бит за два такта, с поддержкой дробного деления и чисел со знаком. Код module div(num, den, quot, rem, m16, divz, sn, sd, frct, n_in, n_out, cycle, clock);
input [15:0] num; // numerator input [15:0] den; // denominator output [15:0] quot; // quotient output [15:0] rem; // remainder output divz, n_out; // divide-by-zero & sign bits input m16, sn, sd, frct, n_in, cycle, clock; // 8/16_mode, numerator_signed, denominator_signed, fractional/normal, sign_from_PSW, cpu_cycle_#, clock
wire [15:0] int_den, int_num, int_quot, ext_num, ext_den, int_rem;
wire nsgn, dsgn, qsgn; assign nsgn = sn & (m16 ? num[15] : num[7]); assign dsgn = sd & (m16 ? den[15] : den[7]); assign qsgn = nsgn ^ dsgn;
assign ext_num = m16 ? num : { {8{nsgn}}, num[7:0]}; assign ext_den = m16 ? den : { {8{dsgn}}, den[7:0]};
assign int_num = (ext_num ^ {16{nsgn}}) + nsgn; assign int_den = (ext_den ^ {16{dsgn}}) + dsgn;
assign divz = !(|int_den);
wire en_frct = frct & (int_num < int_den); // fractional mode only if |num| < |den| wire numz = !(|int_num);
reg [3:0] i; reg [16:0] temp; reg [15:0] save_rem; reg [17:0] temp1; reg [7:0] out, save_out;
always @* begin temp = cycle ? {save_rem, int_num[7] & !(en_frct)} : (en_frct ? {int_num, 1'b0} : {16'h0000,int_num[m16?15:7]}); for (i=0; i<8; i = i+1'b1) begin temp1 = temp - int_den; out[7-i] = !temp1[17]; if (i != 7) temp = {(temp1[17] ? temp[15:0] : temp1[15:0]), int_num[(cycle | !m16) ? (6-i) : (14-i)] & !(en_frct)}; else temp = {1'b0, (temp1[17] ? temp[15:0] : temp1[15:0])}; end end always @(posedge clock) if (!cycle) save_rem <= temp[15:0];
always @(posedge clock) if (!cycle) save_out <= out;
assign int_quot = {save_out, out}; assign int_rem = temp[15:0];
// sign of remaider : // sign of remainder is equal to sign of numerator. assign rem = (int_rem ^ {16{nsgn}}) + nsgn;
// sign of quotient : // fractional mode - quotient always positive // integer mode - quotient has sign of den*num wire t_qsgn = qsgn & !frct; assign quot = (int_quot ^ {16{t_qsgn}}) + t_qsgn;
// sign output: // fractional mode - if numerator not zero, put sign into N // integer mode - put sign into N assign n_out = (!numz | !frct) ? qsgn : n_in;
endmodule Цитата(Maverick @ Mar 25 2009, 09:29) а не подскажите где можно взять готовую среду - gcc? ну как бы gcc.gnu.org
|
|
|
|
|
Mar 25 2009, 18:01
|
Гуру
Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640
|
Цитата(PVL @ Mar 12 2009, 23:16) Почти тоже что РИСК только с бОльшим количеством рабочих регистров 256... 1024. Идеально для блочной памяти в ПЛИС. я всегда думал, что MISC это minimal instruction ... то есть по русски - безоперандный (или стековый) комп http://en.wikipedia.org/wiki/Minimal_instr...on_set_computer(кстати там по ссылке есть и OISC one ... - имхо, cool) примеры таких - всякие лисп/форт/жава компутеры для ПЛИС есть ZPU (имхо, интересно, но мне не увы нужно) http://www.zylin.com/zpu.htm
|
|
|
|
|
Mar 29 2009, 15:34
|
Участник
Группа: Участник
Сообщений: 38
Регистрация: 1-02-07
Пользователь №: 24 959
|
Цитата(yes @ Mar 25 2009, 22:01) я всегда думал, что MISC это minimal instruction ... то есть по русски - безоперандный (или стековый) комп http://en.wikipedia.org/wiki/Minimal_instr...on_set_computer(кстати там по ссылке есть и OISC one ... - имхо, cool) примеры таких - всякие лисп/форт/жава компутеры для ПЛИС есть ZPU (имхо, интересно, но мне не увы нужно) http://www.zylin.com/zpu.htmЭто ЛАЖА ,а не процессор. 300 ЛУТ таблиц 95 МГц. ААААхренеть производительность. У меня без нагрева шарашит на 240 МГц комерческий Спартан 3е работает. Индустриальные добегают до 300... 350 или 200 МГц на -40 градусов цельсия. Правда ПЛИС на 500 к ушла вся.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|