nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 07:56



Reply to topic  [ 8 posts ] 
Конструируем 4 битный МК 
Author Message
Novelist

Joined: 24 Jan 2015 13:56
Posts: 44
Location: 178.172.216.50
Reply with quote
прикинул примерную систему команд получил примерно такое
Code:
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.

но пока не уверен в продуманности всех команд
по прикидкам можно будет закодить двоичные часы и генератор всяких сигналов (если к рону подцепить шимку)


29 Jan 2015 02:57
Profile
Novelist

Joined: 24 Jan 2015 13:56
Posts: 44
Location: 178.172.216.50
Reply with quote
Post 
возможно с кодом кто чего не понял вкратце чего пока надумалось
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 можно заменить на переход при четности / нечетности рон


29 Jan 2015 13:24
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
На самом деле - не принципиально.
Тут вопрос в другом, если расписать по тетрадам, то например команда "условный переход если константа меньше значения рон" получается должна занимать 4 тетрады в памяти: 1010 (op) 0rrr (reg) nnnn (const) jjjj (addr). Не многовато ли для 16 (32) байтов кода?


29 Jan 2015 22:21
Profile
Novelist

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


30 Jan 2015 02:55
Profile
Novelist

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


30 Jan 2015 02:57
Profile
Novelist

Joined: 24 Jan 2015 13:56
Posts: 44
Location: 178.172.216.50
Reply with quote
Post 
если память заполнять случайными числами иногда проскакивают интересные вещи :)
Code:
 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.



30 Jan 2015 14:05
Profile
Novelist

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


30 Jan 2015 14:07
Profile
Novelist

Joined: 24 Jan 2015 13:56
Posts: 44
Location: 178.172.216.50
Reply with quote
Post 
опять изменил модель надеюсь теперь окончательная
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 пзу логикой


31 Jan 2015 00:59
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 8 posts ] 

Who is online

Users browsing this forum: No registered users and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.