|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Самодельный процессор nedoRISC-0 (NEDONAND)
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Shaos, а проверь на осциллографе, что у тебя там с самой длинной цепью - сигнал действительно запаздывает, на столько, на сколько ты прикидывал теоретически, или, может быть, реальный результат лучше?
_________________ iLavr
|
14 Mar 2016 11:32 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Я уже почти подобрался к этой задаче - обязательно отпишусь тут (надеюсь что с картинками сигналов), как разберусь вот с этой фиговиной
|
14 Mar 2016 11:43 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
У тебя ж вроде нормальный ослик есть... или полосы не хватает? Моя "эта фиговина" попроще вроде, но в действии мне почему-то не понравилась... "Неживая" какая-то....
_________________ iLavr
|
14 Mar 2016 12:44 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Да есть 2-лучевой 30-МГц старичок, но проблема если разрешение делать мелким, лучей почти не видно будет - до 2 МГц он ничё показывает, а всё что мельче - уже почти неразличимо...
|
14 Mar 2016 14:02 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А если на ждущей развертке с запуском от исходного сигнала? Исходный - на первый луч, после задержки - на второй, аккурат задержку и должны увидеть...
_________________ iLavr
|
14 Mar 2016 14:21 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Ну опять же - надо подкручивать разрешение по времени, чтобы была видна задержка - а она менее 200 нс судя по всему (тестю пиком щас и пока на следующем шаге пика АЛУ уже всё посчитал, а это 200 нс в верхнем пределе), что значит надо гнать сигнал раза в два более быстрый чем 5 МГц, т.е. 10, а в 10 луч будет слабенький... P.S. Ха, поподавал входные воздействия не подряд, а в разнобой (то 0x00, то 0xFF) и обнаружил, что в некоторых случаях 200 нс недостаточно чтобы АЛУ отработал и зафиксировал значения на выходах, но вот 400 нс похоже достаточно всегда! Выходит, что моя первоначальная оценка "на всём АЛУ - 4*31.5+4*3.5=140 нс (в худшем случае 180+20=200)" оказалась излишне оптимистичной и реальность несколько хуже худшего случая, но мне сейчас важно, чтобы оно не было хуже 300 нс, но проверить я это смогу только с помощью цифрового осциллоскопа...
|
14 Mar 2016 18:00 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Вот программка для nedoCPU-16, которая перебирает все 4096 вариантов входных воздействий для 4-битного АЛУ и фиксирует по 5 значений на выходах со смещением по времени в 200 нс, 600 нс, 1000 нс, 1400 нс и 1800 нс (можно также пересобрать так, чтобы было 400 нс, 800 нс, 1200 нс и т.д. т.е. с первоначальным сдвигом в 200 нс - надо просто раскомментировать nop между записью в PORTB и первым чтением из PORTA): CODE | | | | Code: processor pic16f870 radix dec include "p16f870.inc" __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC include "shaos-p16.inc" include "PDBLv1-2A2.inc"
; NN4 (bad one) -> nedoCPU-16 ;----------------------------- ; 1) GND ; 2) D0 ~~~ ; 3) D1 ~~~ ; 4) D2 ~~~ ; 5) D3 ~~~ ; 6) COUT-> RA0 (flag C output) ; 7) VOUT-> RA1 (flag V output) ; 8) /O0 RA2 (wire to D0 output) ; 9) /O1 RA3 (wire to D1 output) ;10) /O2 RA4 (wire to D2 output) ;11) NC* RA5 (wire to D3 output) ;12) VCC -> VCC ;13) --- -> GND ;14) ;15) O0 -> RB0 (operation 0 input) ;16) O1 -> RB1 (operation 1 input) ;17) O2 -> RB2 (operation 2 input) ;18) C -> RB3 (flag C input) ;19) A0 -> RB4 (argument A bit 0 input) ;20) A1 -> RB5 (argument A bit 1 input) ;21) A2 -> RB6 (argument A bit 2 input) ;22) A3 -> RB7 (argument A bit 3 input) ;23) B0 ~~~ ;24) B1 -> RC0 (argument B bit 1 input) ;25) B2 -> RC1 (argument B bit 2 input) ;26) B3 -> RC2 (argument B bit 3 input) ;27) RC3 (wire to B0 input) ;28) RC4 (not connected) ;29) RC5 (not connected) ;30) RC6 (not connected - used for RS232) ; RC7 (not connected - used for RS232)
; Variables
byte equ 0x3C prefix equ 0x3D store0 equ 0x40 store1 equ 0x41 store2 equ 0x42 store3 equ 0x43 store4 equ 0x44
; Reset vector ORG 00h goto Start
; Interrupt vector ORG 04h retfie
Start:
; Configure all I/O pins as digital _bank1 _movlr 0x06,ADCON1
; Set direction of ports (A-inputs, B/C-outputs) _bank1 _movlr b'11111111',TRISA _movlr b'00000000',TRISB _movlr b'11110000',TRISC
; Initialize output ports _bank0 _movlr b'00000000',PORTA _movlr b'00000000',PORTB _movlr b'00000000',PORTC
; Setup interrupts _bank1 clrf INTCON ; disable all interrupts and clear all flags bcf OPTION_REG,NOT_RBPU ; enable pull-ups bsf OPTION_REG,INTEDG ; interrupt on rising edge ; bsf INTCON,INTE ; enable RB0 port change interrupt ; bsf INTCON,GIE ; enable interrupts
; Clear watch dog _bank0 clrwdt
goto Main go256: clrf byte go256loop: comf PORTC,w movlw 255 movwf PORTB comf PORTC,w nop
movf byte,w movwf PORTB ; 0.0us ; nop ; to add 0.2us to everything below movf PORTA,w ; 0.2us -> 0x40 movwf store0 ; 0.4us movf PORTA,w ; 0.6us -> 0x41 movwf store1 ; 0.8us movf PORTA,w ; 1.0us -> 0x42 movwf store2 ; 1.2us movf PORTA,w ; 1.4us -> 0x43 movwf store3 ; 1.6us movf PORTA,w ; 1.8us -> 0x44 movwf store4 ; 2.0us
movf prefix,w call serial_print_hex _serial_print_byte byte _serial_send_ ':' _serial_print_byte store0 _serial_send_ ',' _serial_print_byte store1 _serial_send_ ',' _serial_print_byte store2 _serial_send_ ',' _serial_print_byte store3 _serial_send_ ',' _serial_print_byte store4 _serial_print_nl
incfsz byte,f goto go256loop return
Main: _serial_print_nl _serial_send_ 'H' _serial_send_ 'E' _serial_send_ 'L' _serial_send_ 'L' _serial_send_ 'O' _serial_print_nl MainLoop: _movlr 0,prefix _movlr 0,PORTC call go256 _movlr 1,prefix _movlr 8,PORTC call go256 _movlr 2,prefix _movlr 1,PORTC call go256 _movlr 3,prefix _movlr 9,PORTC call go256 _movlr 4,prefix _movlr 2,PORTC call go256 _movlr 5,prefix _movlr 10,PORTC call go256 _movlr 6,prefix _movlr 3,PORTC call go256 _movlr 7,prefix _movlr 11,PORTC call go256 _movlr 8,prefix _movlr 4,PORTC call go256 _movlr 9,prefix _movlr 12,PORTC call go256 _movlr 10,prefix _movlr 5,PORTC call go256 _movlr 11,prefix _movlr 13,PORTC call go256 _movlr 12,prefix _movlr 6,PORTC call go256 _movlr 13,prefix _movlr 14,PORTC call go256 _movlr 14,prefix _movlr 7,PORTC call go256 _movlr 15,prefix _movlr 15,PORTC call go256
loop: goto loop
END
| | | | |
P.S. Вот пример того, что программа выводит в терминал: | | | | Code: 16C:00,22,22,22,22 16D:00,22,22,22,22 16E:00,22,22,22,22 16F:02,22,22,22,22
| | | | |
Сначала идёт 12-битный код входного воздействия, а потом 5 шестнадцатиричных значений с выходов со смещением 0.2мкс, 0.6мкс, 1.0мкс, 1.4мкс и 1.8мкс...
|
14 Mar 2016 19:46 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Вот так выглядел процесс тестирования:
|
14 Mar 2016 19:56 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Попробуй еще 0xAA, 0x55 и 0xСС, 0x33 раз уж случилась такая "пьянка"...
_________________ iLavr
|
15 Mar 2016 01:18 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Вобщем написал на сях программку анализирующую лог файл с терминала с 200нс первым отступом и с 400нс первым отступом - в пером случае (200нс) иногда не успевало первый раз, во втором (400нс) - успевало всегда, вот исходник: CODE | | | | Code: #include <stdio.h> #include <stdlib.h> #include <string.h>
/*
This checker is only for older preliminary version of NEDONAND-4 board!
Input: BBBBAAAACOOO
Output: DDDDVC
*/
int main(int argc, char** argv) { char n[100],s[256],u[8]; int i,j,r[5],v,c; FILE *f; signed char a,b,d;
if(argc<2) return -1; strcpy(n,argv[1]); f = fopen(n,"rt"); if(f==NULL) return -1; fscanf(f,"%s\n",s); while(!feof(f)) { fscanf(f,"%3X:%2X,%2X,%2X,%2X,%2X\n",&i,&r[0],&r[1],&r[2],&r[3],&r[4]); // printf("0x%4.4X:",i); v = -1; a = (i>>4)&15; b = (i>>8)&15; switch(i&7) { case 0: strcpy(u,"RRC"); d = (i&8)|(a>>1); c = a&1; break; case 1: strcpy(u,"RLC"); d = ((a&7)<<1)|((i&8)>>3); c = (a&8)>>3; break; case 2: strcpy(u,"NAN"); d = (~(a&b))&15; c = 1; break; case 3: strcpy(u,"XOR"); d = a^b; c = 1; break; case 4: case 5: case 6: case 7: strcpy(u,"ADD"); d = a + b + ((i&8)>>3); c = (d&16)>>4; if(a&8) a|=0xF0; if(b&8) b|=0xF0; d = a + b + ((i&8)>>3); if((d<0 && !(d&8)) || (d>0 && (d&8))) v = 1; else v = 0; break; } for(j=0;j<5;j++) { // printf(" 0x%2.2X",r[j]); if((d&15)!=(r[j]>>2) || c!=(r[j]&1) || (v>=0 && ((r[j]&2)>>1)!=v)) { printf("%s %3.3X[%i] %2.2X a=%i b=%i c=%i -> d=%i (%i) c=%i (%i)",u,i,j,r[j],a,b,(i&8)>>3,d,r[j]>>2,c,r[j]&1); if(v>=0) printf(" v=%i (%i)",v,(r[j]&2)>>1); printf("\n"); } } // printf("\n"); }
fclose(f); return 0; }
| | | | |
Результат работы программки по анализу лога с 4096 записями при первом отступе 200нс: Как видим не успевает только сложение (ADD) и только самый первый сэмпл [0], напомню, что эта версия АЛУ всегда делает сложение при коде операции 1XX). В большинстве случаев (если не во всех) это неготовность самого старшего бита результата (четвёртого) и/или флагов C/V. Радует, что к моменту 400нс оно всё успевает - надо ещё будет на оциллографе заснять эти задержки, чтобы понять реальный предел (хотелось бы меньше 300нс)... P.S. Все логи и сырцы лежат на гитхабе: https://github.com/shaos/nedonand/tree/master/tester
|
15 Mar 2016 15:30 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Вобщем решил собирать NEDONAND в виде гибрида - в качестве центральной будет wire-wrap платка поменьше (но с посадочными местами точно под DIP14), к которой приделана макетка куда будут припаяны разъёмы для втыкания вспомогательных платок (таких разъёмов с wire-wrap ногами не выпускают): Пару разъёмов получилось припаять к самой плате: Прикинул, что для реализации первой ступени конвейера (и демы "HELLO") мне понадобиться 17 микросхем 74F00 и некоторое количество NEDONAND-платок...
|
15 Mar 2016 23:12 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Припаял разъёмы для регистров A,B,C,D,E,T, двух мультиплексоров 8x2:1 и ещё 2 регистров R и A' (аргументы ALU) и чуть ниже начал припаивать разъёмы покороче для мультиплексоров 8:1 пока они не закончились. Кроме того прикрутил 60-ногий разъёмчик (справа вверху) на котором будут встречаться припаянные и прикрученные проводки: Также поставил платку на ножки:
|
16 Mar 2016 21:23 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Что-то как-то проволоками "на соплях" две платы скрутил... В "раю для радиолюбителей" не нашлось пары винтов М3 с гайками и шайбочками? Ну пусть хоть дюймовые, если в "раю" нет М3...
_________________ iLavr
|
17 Mar 2016 03:12 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Да у них дырки не совпадают, а новые сверлить - неохота
|
17 Mar 2016 06:24 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Для этого должна быть возможность при копировании регистров выдавать на их вход не только выходы регистра T (временный регистр, используемый при копировании регистров), но и выход АЛУ (который в обычном случае идёт только на вход аккумулятора, причём минуя всё это кольцо через T). Другой вопрос, что если после операции АЛУ идёт не копирование в регистр, а другая операция АЛУ, использующая аккумулятор в качестве аргумента? Например два сдвига подряд - RRC A, RRC A или что-то типа этого. В этом случае при копировании аргументов для второй RRC должен браться не регистр A, а выход АЛУ...
|
17 Mar 2016 23:56 |
|
|
Who is online |
Users browsing this forum: No registered users and 74 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
|
|