Конструируем 4 битный МК

4-битные микроконтроллеры и микропроцессоры (прошлое, настоящее, будущее)

Moderator: Lavr

awaken
Novelist
Posts: 44
Joined: 24 Jan 2015 13:56
Location: 178.172.216.50

Конструируем 4 битный МК

Post by awaken »

прикинул примерную систему команд получил примерно такое

Code: Select all

begin
  var codes: array [1..16, 0..1] of byte;
  var ron: array[0..7] of byte;
  var over, zero: boolean; over := false; zero := false;
  var bank: byte := 0;
  var i: byte := 1;
  while true do 
  begin
    if (codes[i, bank and 1] shr 4) = 0 then 
      bank := codes[i, bank and 1] and 15;
    if (codes[i, bank and 1] shr 4) = 1 then 
      ron[bank shr 1] :=  codes[i, bank and 1] and 15;
    if (codes[i, bank and 1] shr 4) = 2 then
      ron[bank shr 1] :=  (ron[bank shr 1] or codes[i, bank and 1]) and 15;
    if (codes[i, bank and 1] shr 4) = 3 then
      ron[bank shr 1] :=  (ron[bank shr 1] and codes[i, bank and 1]) and 15;
    if (codes[i, bank and 1] shr 4) = 4 then
      ron[bank shr 1] :=  (ron[bank shr 1] xor codes[i, bank and 1]) and 15;
    if (codes[i, bank and 1] shr 4) = 5 then 
    begin
      if (ron[bank shr 1] + (codes[i, bank and 1] and 15)) > 15 then 
        over := true; ron[bank shr 1] :=  (ron[bank shr 1] + codes[i, bank and 1]) and 15; end;
    if (codes[i, bank and 1] shr 4) = 6 then 
    begin
      if (ron[bank shr 1] - (codes[i, bank and 1] and 15)) > 15 then 
        over := true; ron[bank shr 1] :=  (ron[bank shr 1] - codes[i, bank and 1]) and 15; end;
    if (codes[i, bank and 1] shr 4) = 7 then
      if (codes[i, bank and 1] and 15) < 5 then 
        ron := ron shr (codes[i, bank and 1] and 15) else 
        ron := (ron shr ((codes[i, bank and 1] and 15) shr 2)) or (ron shl (4 - ((codes[i, bank and 1] and 15) shr 2)));
    if (codes[i, bank and 1] shr 4) = 8 then 
      if (codes[i, bank and 1] and 15) < 5 then 
        ron := ron shl (codes[i, bank and 1] and 15) else 
        ron := (ron shl ((codes[i, bank and 1] and 15) shr 2)) or (ron shr (4 - ((codes[i, bank and 1] and 15) shr 2)));
    if ((codes[i, bank and 1] shr 4) = 9) and (codes[i, bank and 1] > ron[bank shr 1]) then 
      i := codes[i, bank and 1] and 15;
    if ((codes[i, bank and 1] shr 4) = 10) and (codes[i, bank and 1] < ron[bank shr 1]) then 
      i := codes[i, bank and 1] and 15;
    if ((codes[i, bank and 1] shr 4) = 11) and (not over) then 
    begin i := codes[i, bank and 1] and 15; over := false; end;
    if ((codes[i, bank and 1] shr 4) = 12) and (not zero) then 
    begin i := codes[i, bank and 1] and 15; zero := false; end;
    if ((codes[i, bank and 1] shr 4) = 13) and over then 
    begin i := codes[i, bank and 1] and 15; over := false; end;
    if ((codes[i, bank and 1] shr 4) = 14) and zero then 
    begin i := codes[i, bank and 1] and 15; zero := false; end;
    if (codes[i, bank and 1] shr 4) = 15 then 
      i := codes[i, bank and 1] and 15;
    if ron[bank shr 1] = 0 then 
      zero := true else zero := false;
    i := i + 1; 
    if i = 17 then break; 
  end;
end.
но пока не уверен в продуманности всех команд
по прикидкам можно будет закодить двоичные часы и генератор всяких сигналов (если к рону подцепить шимку)
awaken
Novelist
Posts: 44
Joined: 24 Jan 2015 13:56
Location: 178.172.216.50

Post by awaken »

возможно с кодом кто чего не понял вкратце чего пока надумалось
8 4 битных регистров регистров 32 байта кода (2 страницы по 16 байт) флаги переноса и нуля
из команд по порядку
0 занесение константы в регистр банк (выбор рабочего рон и переключение между 2 страницами кода )
1 перенос константы в рабочий рон
2 or константы и рон
3 and константы и рон
4 xor константы и рон (одновременно инверсия рон если xor 1111)
5 суммирование константы и рон с изменением флага переноса
6 заем константы из рон с изменением флага переноса
7 логический либо циклический сдвиг вправо
8 логический либо циклический сдвиг влево
9 условный переход если константа больше значения рон
10 условный переход если константа меньше значения рон
11 условный переход при отсутствии переполнения
12 условный переход если рон не 0
13 условный переход при переполнении
14 условный переход если рон 0
15 безусловный переход

стоит ли изменять набор команд? к примеру 11,12 можно заменить на переход при четности / нечетности рон
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

На самом деле - не принципиально.
Тут вопрос в другом, если расписать по тетрадам, то например команда "условный переход если константа меньше значения рон" получается должна занимать 4 тетрады в памяти: 1010 (op) 0rrr (reg) nnnn (const) jjjj (addr). Не многовато ли для 16 (32) байтов кода?
awaken
Novelist
Posts: 44
Joined: 24 Jan 2015 13:56
Location: 178.172.216.50

Post by awaken »

не совсем тут некоторые ограничения константа и адрес равны :)
ну т.е. если сравниваем рон с 5 и есть переход то переходим на 5 ячейку а там либо смена страницы либо безусловный переход хотя смотря что за алгоритм возможно просто операторы
просто эти команды имхо нужнее четность можно в 2 другие команды уложить (лог сдвиг влево на 3 и переход если 0 для четных и переход если не 0 для нечетных)
awaken
Novelist
Posts: 44
Joined: 24 Jan 2015 13:56
Location: 178.172.216.50

Post by awaken »

и да все команды OP + CONST занимают байт
еще возможно урезание количества рон до 4 но увеличение страниц памяти до 4 (64 байта) возможно это будет лучше
awaken
Novelist
Posts: 44
Joined: 24 Jan 2015 13:56
Location: 178.172.216.50

Post by awaken »

если память заполнять случайными числами иногда проскакивают интересные вещи :)

Code: Select all

 cod    ron  i bank over  zero

  222    0   1   0 False  True
  242    0   2   0 False  True
  ...
Развернуть
Last edited by awaken on 30 Jan 2015 14:08, edited 1 time in total.
awaken
Novelist
Posts: 44
Joined: 24 Jan 2015 13:56
Location: 178.172.216.50

Post by awaken »

решил все-же поменять модель теперь 4 рон и 4 страницы память (по 16 байт)
awaken
Novelist
Posts: 44
Joined: 24 Jan 2015 13:56
Location: 178.172.216.50

Post by awaken »

опять изменил модель надеюсь теперь окончательная
0 занесение константы в регистр банк (выбор рабочего рон или переключение между страницами кода (зависит от 7) )
1 перенос константы в рабочий рон
2 or константы и рон
3 and константы и рон
4 xor константы и рон (одновременно инверсия рон если xor 1111)
5 суммирование константы и рон с изменением флага переноса
6 заем константы из рон с изменением флага переноса
7 логический и циклический сдвиг рон вправо +переключение адресации рон и страниц памяти
8 логический и циклический сдвиг рон влево + изменение дополнительного бита регистра банк
9 условный переход если константа больше значения рон
10 условный переход если константа меньше значения рон
11 условный переход при отсутствии переполнения
12 условный переход если рон не 0
13 условный переход при переполнении
14 условный переход если рон 0
15 безусловный переход
адресация теперь относительная , 32 рон , 32 страницы памяти по 1024 байта , к тому же есть команда nop ( xor 0000) :)
все команды 1 байт (4 бита код операции остальные 4 константа (кроме 7 и 8 там при логическом и циклическом сдвиге (влево/вправо) на 4 осуществляются дополнительные махинации с банком ))
план по сборке :
отладить модель программно
собрать на fpga(регистры,обвязка,адресация)+2 пзу(в 1 зашит алу во 2 программа ) -> заменить fpga логикой -> заменить 1 пзу логикой