Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1
  • 2
  • 3

ТЕМА: Процессор 8086

Процессор 8086 5 года 4 дн. назад #5879

если существуют способы работы с MicroSD (наверное, это подготовка образа из файлов, с последующей его "монолитной" заливкой на карту), при которых информация будет "лежать" на носителе с предсказуемым в терминах секторов и дрожек положением, то код загрузчика, конечно, можно упростить и сделать так, чтобы "уметь понимать FAT" устройство становилось на более позднем этапе. Просто у меня сложилось впечатление (из-за Arduino), что можно попытаться сделать загрузчик, сразу способный найти на карте файл. В конце концов, можно не писать полноценную поддержку всех файловых операций, а только поиск и загрузку одного файла.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Chaosorg.

Процессор 8086 5 года 4 дн. назад #5880

  • foxtail
  • foxtail аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 12
  • Спасибо получено: 0

Со своим или чужим, готовым, контроллером Вы рано или поздно получите место для хранения программ, но откуда их первоначально загружать?

Как-то думал об этом. На шилде разъемов есть USB, и вполне возможно подключить туда флешку с обычным загрузочным диском. Я в свое время почти досконально изучил, как работает загрузка из MBR, как устроены разделы и особенно FAT12/16/32 (там совсем ничего сложного, кроме разве что слегка запутанных "длинных имен") и писал загрузчик для собственной (защищенного режима) ОС, но мне не хватило, опять-таки, мотивации для завершения ОС.

Предполагаю сделать так, что не писать в железе контроллер USB, а написать только некоторый простой приемо-передатчик, который переводит сигналы в пакеты, а разбираться с этим дать загрузчику в ПЗУ, который и будет по сути BIOS, поддерживающий flash память. То есть как-то так... но до этого, конечно, очень далеко еще. Предстоит много работы по самому "железу".

Задача MBR - загрузить с определённого сектора файл IO.SYS (его положение чётко задано на диске, это неперемещаемый файл)

Ну это да, хотя насчет четкого размещения не очень уверен... с одной стороны, загружать из FAT не так уж и сложно, знаю по своему коду загрузчика... Я знаю, что загрузчик для Linux содержится сразу же после boot-sector, там да, жестко привязано.

В итоге кстати придется реализовать железо напрямую, а коды обработки int 10h, 13h, 16h придется брать из BIOS, скорее всего. Ну либо написать микро-версию от BIOS. Да... представляю, сколько это будет работы :) Насчет microsd, не знаю, т.к. хочется использовать шилд, а там уже все "забито" разъемами по ps/2, usb и т.д.

p.s. В данный момент прогресс моей работы только в том, что я научился считывать инструкцию, и обрабатывать инструкции АЛУ (которые находятся в диапазоне маски опкода 00xxx0xx) и записывать результат в регистр, в память еще не сделал.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от foxtail.

Процессор 8086 5 года 4 дн. назад #5881

Умение грузиться из USB у материнок появилось когда объемы их ПЗУ стали большими и интерфейсные микросхемы умнее (OHCI, EHCI), так как USB весьма громоздкая технология. На форуме этого сайта можно ознакомиться с успехами Leka ( marsohod.org/forum/proekty-polzovatelej/...host-dlya-klaviatury ) в области общения с USB мышью и клавиатурой - посмотрите чего это стоит. Он пошел путем аппаратной реализации некой усеченной/минимальной версии протокола. Если в случае с MicroSD Вы почти сразу получаете возможность разговора в терминах секторов, то с USB Вам надо сначала найти друг друга и "поздороваться" в несколько этапов.
Успешные любительские проекты на ПЛИС, которые грузятся с USB пока что делают это на платах, где кроме ПЛИС есть микроконтроллер или специализированная USB-Host микросхема.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Chaosorg.

Процессор 8086 5 года 4 дн. назад #5882

  • foxtail
  • foxtail аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 12
  • Спасибо получено: 0

Умение грузиться из USB у материнок появилось когда объемы их ПЗУ стали большими и интерфейсные микросхемы умнее (OHCI, EHCI), так как USB весьма громоздкая технология.

Тогда вполне возможно, что это станет моей следующей задачей после самого микропроцессора. Возможно, что на это придется потратить весь внутренний RAM на ПЛИС.

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

Вот код, который "выедает" почти 300 LE.
        // 16 бит
        if (opcode[0]) regs[ ds_reg[2:0] ][15:0] <= rs[15:0];
        // 8 бит
        else begin
            if (ds_reg[2])
                 regs[ ds_reg[1:0] ][15:8] <= rs[7:0];  
            else regs[ ds_reg[1:0] ][7:0]  <= rs[7:0];  
        end

Может я что-то не так делаю? Может быть нужно регистры подключать к шине как-то? Общий объем памяти регистров это 128 бит (8 регистров x 16 бит).

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от foxtail.

Процессор 8086 5 года 4 дн. назад #5883

foxtail пишет: Может я что-то не так делаю? Может быть нужно регистры подключать к шине как-то? Общий объем памяти регистров это 128 бит (8 регистров x 16 бит).

Наверняка Вам известно, что внутри ПЛИС (по крайнем мере в той Altera Cyclone III, что в Марсоходе 2) нет высокоимпедансного состояния выходов. Поэтому шина имитируется мультиплексорами подсоединенными по цепочке. В принципе, не грех прикинуть вариант с шиной, но ведь для управления мультиплексорами тоже что-то понадобится.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Chaosorg.

Процессор 8086 5 года 4 дн. назад #5884

  • foxtail
  • foxtail аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 12
  • Спасибо получено: 0
В действительности я не до конца знаю все возможности ПЛИС, знакомился достаточно поверхностно (про мультиплексирование да, известно), и я видел то, что там есть операции с bidirectional, но вероятно, это касается только внешних пинов для ввода-вывода. Думаю, что насчет того кода сохранения регистров, возможно, что вполне логично, что там ~ 300 LE уходит, по 2 LE на 1 бит, хотя и очень странно, пока не могу разобраться, почему 2 к 1. Дело в том, что при чтении регистров уходит гораздо меньше LE.

С другой стороны, запись в регистры будет только в 1 блоке.

И хочу выразить большую признательность за поддержку на форуме :) Спасибо.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Процессор 8086 5 года 4 дн. назад #5885

Возможно может помочь MS Excel. Во всяком случае мне он очень помог. В таблице 16х16 можно разместить коды операций, а потом с помощью цветов фона ячеек можно сгруппировать их логически. Получится наглядно видно где какие биты можно сгруппировать. И для различных форм инструкций можно проделать аналогичную операцию - систематизировать группы бит в дополнительных байтах инструкции. Судя по фрагменту кода, Вы пытаетесь сейчас это реализовать, но фишка в том, что после систематизации многие вещи станут наглядными и как результат - сэкономите множество времени и логических элементов.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от alman. Причина: 8х8 -> 16x16

Процессор 8086 5 года 4 дн. назад #5886

  • foxtail
  • foxtail аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 12
  • Спасибо получено: 0
Нечто подобное я уже сделал, когда формировал список базовых инструкции, чтобы всегда лежало перед глазами :) Например у меня уже написан модуль
module DETERMINE_MODRM(

	input  wire [7:0] o, // opcode
	output wire rm       // rm = 0, if no RM, rm = 1, if HAS rm

);

// (1) 00xxx0xx: 00-03, 08-0B, 10-13, 18-1B...
wire general_alu = (o[7]^1'b1) & (o[6]^1'b1) & (o[2]^1'b1); 

// (2) 1000xxxx: 80-8F
wire range80_8f = o[7] & (o[6]^1'b1) & (o[5]^1'b1) & (o[4]^1'b1);

// (3) 62, 63, 69, 6B
wire at6x = (o == 8'h62 || o == 8'h63 || o == 8'h69 || o == 8'h6B) ? 1'b1 : 1'b0;

// (4) 1100 01xx c4..c7
//     1100 000x c0, c1
wire atC0 = (o[7] & o[6] & (o[5]^1'b1) & (o[4]^1'b1) & (o[3]^1'b1)) & (o[2] | ((o[2]^1'b1) & (o[1]^1'b1)));

// (5) 1101 00xx d0..d3
wire atD03 = o[7] & o[6] & (o[5]^1'b1) & o[4] & (o[3]^1'b1) & (o[2]^1'b1);

// (6) 1111 x11x f6, f7, fe, ff
wire atF8 = o[7] & o[6] & o[5] & o[4] & o[2] & o[1];

// Decision about HAS rm for opcode?
// ---------------------------------------------------------------------------
assign rm = general_alu | range80_8f | at6x | atC0 | atD03 | atF8;

endmodule

Для определения, есть ли у опкода modrm. Также есть подробное описание команд на моем сайте. Так что теперь дело за обработкой...

Кстати, по поводу лицензирования архитектуры
* Насчет лицензии на разработку x86 совместимых архитектур на википедии https://ru.wikipedia.org/wiki/X86 
 * Тип лицензии: Open. Отчасти.
 * ---------------------------------
 * | Для некоторых дополнительных функций x86 архитектуры может потребоваться лицензия от Intel,
 * | по x86-64 может потребоваться дополнительная лицензия от AMD. 
 * | Процессор 80486 был на рынке уже более 20 лет и поэтому не может быть предметом патентных претензий. 
 * | Это подмножество архитектуры x86, следовательно, полностью открыто.
 * ---------------------------------
 * Это означает, что до 80486-го процессора лицензия не распространяется.
Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от foxtail.

Процессор 8086 5 года 4 дн. назад #5887

Если не потеряете интерес к проекту, то вполне возможно что у Вас получится.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Процессор 8086 5 года 3 дн. назад #5891

  • foxtail
  • foxtail аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 12
  • Спасибо получено: 0
Есть достаточно нескромный вопрос... Как попадают проекты сюда ? Если у меня, к примеру, получится сделать хотя бы минимальный по инструкциям, но рабочий 8086, то есть вероятность что проект будет занесен? Если нет, то все ок, я тогда размещу свой готовый вариант на форуме.

p.s. по состоянию моего проекта, уже добрался до инструкции 5Fh... затрачено 1058 LE, 318 dedicated registers.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3
Время создания страницы: 0.296 секунд
Работает на Kunena форум