Jump to content

    

Свои процессоры

А у меня уже есть свой процессор. LCC осилил, а вот с ассемблером напряг.

По образованию я не программист, но приходится писать программы для отладки

железа.

Мой совет, как уже прошедшего этот этап - берите binutils, и делайте на основе какого-то уже существующего там. Неделя на то, чтобы въехать, ну и неделя на то, чтобы свой сделать. Там, в бинутилс, "все для людей", т.е. добавить свою систему команд достаточно просто, при том, что сразу будут работать все фичи и объектного кода, и линковки.

 

Что интересно - я давал объявление на эту работу (за деньги), ни одного желающего не нашлось! Не то, что бы условия не устроили, а они были вполне щедрыми, а именно не было даже желающих!

Share this post


Link to post
Share on other sites
Система команд пока не для записи во внешнюю память - аж 57 бит на инструкцию.

 

Какой формат инструкции?

Share this post


Link to post
Share on other sites
Система команд пока не для записи во внешнюю память - аж 57 бит на инструкцию.

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

Share this post


Link to post
Share on other sites
Ну почему же - расширить до 64 бит, и при шине внешней памяти шириной 128 и больше бит очень даже смотреться будет, выборка по паре или более инструкций за такт. Хотя лично я предпочитаю variable length, правда ведущую за собой серьезные усложнения декодера и схемы буфера предвыборки. (я так понял, что речь все таки в данном случае идет о суперпроизводительной числомолотилке, а не о CPU общего назначения, перекошенного под что-то конкретное)

57 бит нужно ядру ,чтобы выполнить инструкцию. Типа откуда взять, как переключить мультиплексор разультата, как положить. С положить напряг - умноженеи и деление результат 64 бита, умножение 9 тактов, сложение 4, деление 12 кароче баги с конвейером.

 

 

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

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

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

Шина 96 бит - читать шесть инструкций за такт дабы работать на СРАМ. С динамикой пока лениво связываться.

И вообще сейчас есть спартан 3Е - 500к. На нем не далеко уити от числомолотилки..

Share this post


Link to post
Share on other sites
Во вторых уже не просто числомолотилка поскольку есть спец узлы под фурье и вейвлет
Так это и говорит о том, что проц - числомолотилка. Иначе бы без таких узлов был бы просто проц общего назначения.

Share this post


Link to post
Share on other sites
Что интересно - я давал объявление на эту работу (за деньги), ни одного желающего не нашлось! Не то, что бы условия не устроили, а они были вполне щедрыми, а именно не было даже желающих!

 

Не надо ля-ля, помню обьяву, просто был дико занят в тот момент ;)

Share this post


Link to post
Share on other sites

Что такое binutils? Готовая среда для разработки С - компайлера? Где взять? Подскажите , а то сейчас с программерами сношаюсь - достали :cranky:

Share this post


Link to post
Share on other sites
Что такое binutils? Готовая среда для разработки С - компайлера?

нет, готовая среда для разработки С компайлера это gcc :) А binutils это binutils - ассемблер, линкер, objdump, и прочее вокруг

Share this post


Link to post
Share on other sites
57 бит нужно ядру ,чтобы выполнить инструкцию. Типа откуда взять, как переключить мультиплексор разультата, как положить. С положить напряг - умноженеи и деление результат 64 бита, умножение 9 тактов, сложение 4, деление 12 кароче баги с конвейером.

 

А можно узнать как Вы делаете целочисленное деление за 12 тактов, наверное при разрядности данных 32 или 16.

Поделитесь пожалуйста алгоритмом, а лучше описанием на VHDL (идеальный вариант :rolleyes: )/Verilog (если конечно это возможно)

 

нет, готовая среда для разработки С компайлера это gcc :) А binutils это binutils - ассемблер, линкер, objdump, и прочее вокруг

 

а не подскажите где можно взять готовую среду - gcc?

Share this post


Link to post
Share on other sites
А можно узнать как Вы делаете целочисленное деление за 12 тактов, наверное при разрядности данных 32 или 16.

Поделитесь пожалуйста алгоритмом, а лучше описанием на VHDL (идеальный вариант :rolleyes: )/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

 

а не подскажите где можно взять готовую среду - gcc?

ну как бы gcc.gnu.org

Share this post


Link to post
Share on other sites

 

Спасибо за исчерпающий ответ :)

Share this post


Link to post
Share on other sites
Почти тоже что РИСК только с бОльшим количеством рабочих регистров 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

Share this post


Link to post
Share on other sites
я всегда думал, что 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 к ушла вся.

Share this post


Link to post
Share on other sites
Это ЛАЖА ,а не процессор. 300 ЛУТ таблиц 95 МГц. ААААхренеть производительность. У меня без нагрева шарашит на 240 МГц комерческий Спартан 3е работает. Индустриальные добегают до 300... 350 или 200 МГц на -40 градусов цельсия. Правда ПЛИС на 500 к ушла вся.

 

а что С++ и eCos у Вас работают?

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this