Minimig - Amiga 500 i en FPGA
- Illuwatar
- Inlägg: 2256
- Blev medlem: 10 november 2003, 14:44:27
- Skype: illuwatar70
- Ort: Haninge
- Kontakt:
Jag misstänker att den är hårdkodad till 512kb ROM-space. Fyller man bara hälften så blir det tomt i resten. Mätningar på kortet med oscilloskop visar ett system i väntläge när detta sker (alla data- och adressledingar låga, alla aktivt låga styrsignaler höga). Men det var inget större problem - jag har några olika kick-romar att välja på...
Det är hårdkodat i MCUn enligt följande:
minimig1_firmware_15_07_2007/main.c
/*load kickstart rom*/
void ReadRom(unsigned char track) {
.
.
/*open kickstart file*/
Open("KICK ROM");
/*do for 1024 sectors of 512 bytes each --> 512kbyte*/
n=0;
while(n<1024)
{
Om man ändrar till "while(n<file.len)" bör det fungera med variabel längd på kickstart. Btw, man kan också lägga in kickstart väljare om man så önskar ;) (Open("KICK ROM");)
bootrom/bootrom.s
BootL bsr Rd16k ;read track into buffer
bsr Cpy16k ;copy buffer to kickstart area
cmp.l #$1000000,a3 ;all data done ? **ÄNDRA TILL $fc0000**
beq Exit ;yes --> exit boot code
bclr #0,CIAPRB(a2) ;no --> load next track
bset #0,CIAPRB(a2)
bra BootL
Detta borde fixa till 256kB Kickstart, fast det går förmodligen lika bra att bara fylla ut resten av KICK.ROM med nollor så att den blir exakt 512kB stor.
Är det någon kickstart som är större än 512kB ..?
minimig1_firmware_15_07_2007/main.c
/*load kickstart rom*/
void ReadRom(unsigned char track) {
.
.
/*open kickstart file*/
Open("KICK ROM");
/*do for 1024 sectors of 512 bytes each --> 512kbyte*/
n=0;
while(n<1024)
{
Om man ändrar till "while(n<file.len)" bör det fungera med variabel längd på kickstart. Btw, man kan också lägga in kickstart väljare om man så önskar ;) (Open("KICK ROM");)
bootrom/bootrom.s
BootL bsr Rd16k ;read track into buffer
bsr Cpy16k ;copy buffer to kickstart area
cmp.l #$1000000,a3 ;all data done ? **ÄNDRA TILL $fc0000**
beq Exit ;yes --> exit boot code
bclr #0,CIAPRB(a2) ;no --> load next track
bset #0,CIAPRB(a2)
bra BootL
Detta borde fixa till 256kB Kickstart, fast det går förmodligen lika bra att bara fylla ut resten av KICK.ROM med nollor så att den blir exakt 512kB stor.
Är det någon kickstart som är större än 512kB ..?
- Illuwatar
- Inlägg: 2256
- Blev medlem: 10 november 2003, 14:44:27
- Skype: illuwatar70
- Ort: Haninge
- Kontakt:
Du verkar vara en hejare på PIC. Så du kan nog svara på en fråga: Hur lägger man en "goto ProgStart" på adress $0000 i ett C-program (PICC-18)? I assembler är det inga problem, men i C... Detta behövs för att kunna köra koden med bootloadern (första instruktionen skall vara ett hopp till programmets start).
Skruva kod kommer jag nog också göra när jag blir lite mer van vid PIC. Tanken är att ha en LCD på fronten som visar systemets status (nu går denna data ut på serieporten).
Dessutom har jag så smått börjat på en "release"-version av detta projekt. Jag kommer göra några smärre ändringar i designen samt rätta felen. Därefter skall en ny batch av kort beställas - denna gång för att erbjudas till omvärlden. Så den som kan få dit en QFP-208 får gärna teckna upp sig för ett exemplar...
Skruva kod kommer jag nog också göra när jag blir lite mer van vid PIC. Tanken är att ha en LCD på fronten som visar systemets status (nu går denna data ut på serieporten).
Dessutom har jag så smått börjat på en "release"-version av detta projekt. Jag kommer göra några smärre ändringar i designen samt rätta felen. Därefter skall en ny batch av kort beställas - denna gång för att erbjudas till omvärlden. Så den som kan få dit en QFP-208 får gärna teckna upp sig för ett exemplar...
I ett C program lägger kompilatorn/länkaren in en egen snutt i början.. så man kommer nog inte åt. Om du inte kompilerar till assembler, ändrar och sedan kompilerar assemblern till maskinkod.
Men du kan i vanlig C kod skriva:
main() {
start:
printf("Hoppla!\n");
goto start;
}
För mer avancerat trixande får du använda dig av inline:
(/usr/include/machine/cpufunc.h)
__asm __volatile("inb %1,%0" : "=a" (data) : "id" ((u_short)(port)));
Kanske något i stil med "__asm jmp 0x12345678;" kan fungera. Men ta en titt på vad slags assembler kompilatorn producerar så du ser vad den egentligen gör.
Ang kortet, så önskar jag nog endast IDC kontakter, 1st minne istället för två, och ev XC3S500. Å annat småplock.
Sen så måste Minimig använda DRAM i någon form om 16MB ska kunna bli realiserat.
Men du kan i vanlig C kod skriva:
main() {
start:
printf("Hoppla!\n");
goto start;
}
För mer avancerat trixande får du använda dig av inline:
(/usr/include/machine/cpufunc.h)
__asm __volatile("inb %1,%0" : "=a" (data) : "id" ((u_short)(port)));
Kanske något i stil med "__asm jmp 0x12345678;" kan fungera. Men ta en titt på vad slags assembler kompilatorn producerar så du ser vad den egentligen gör.
Ang kortet, så önskar jag nog endast IDC kontakter, 1st minne istället för två, och ev XC3S500. Å annat småplock.
Sen så måste Minimig använda DRAM i någon form om 16MB ska kunna bli realiserat.
Verkar som någon lyckats få in en 68k cpu i fpga:n nu.
Kanske något att ta med i beräkningarna vid en ev. produktion?
http://www.mikrocontroller.net/topic/81116#new
Kanske något att ta med i beräkningarna vid en ev. produktion?
http://www.mikrocontroller.net/topic/81116#new
- JimmyAndersson
- Inlägg: 26566
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
m68k "soft cpu" har funnits tillgängligt ett bra tag.Bandaren skrev:Verkar som någon lyckats få in en 68k cpu i fpga:n nu.
Kanske något att ta med i beräkningarna vid en ev. produktion?
http://www.mikrocontroller.net/topic/81116#new
- Illuwatar
- Inlägg: 2256
- Blev medlem: 10 november 2003, 14:44:27
- Skype: illuwatar70
- Ort: Haninge
- Kontakt:
Den där sidan var på tyska så det var lite svårt att hänga med, men det såg onekligen intressant ut. Undrar hur stor FPGA som krävs för detta...
Att göra ett kort med bara headers är inget problem, inte en större FPGA heller om den är kodkompatibel. Ersätta 2 x 1MB minnena med ett 2MB (1M x 16) skulle kunna gå utan att ändra koden genom att externt generera den extra adressledningen utifrån chipselect-signalerna. Däremot DRAM är jag lite tveksam till då detta ger mig krypningar längs ryggen - all denna timing som behövs skulle kräva en skaplig omändring av FPGAns innehåll.
Det som för tillfället är prioriterat är riktig ICSP (så det går att radera PIC'en direkt i kortet), renare strömförsörjning samt bättre skydd på portarna (framförallt joystickportarna). Därefter kommer jag börja titta lite på PIC-koden och börja skruva på denna.
Att göra ett kort med bara headers är inget problem, inte en större FPGA heller om den är kodkompatibel. Ersätta 2 x 1MB minnena med ett 2MB (1M x 16) skulle kunna gå utan att ändra koden genom att externt generera den extra adressledningen utifrån chipselect-signalerna. Däremot DRAM är jag lite tveksam till då detta ger mig krypningar längs ryggen - all denna timing som behövs skulle kräva en skaplig omändring av FPGAns innehåll.
Det som för tillfället är prioriterat är riktig ICSP (så det går att radera PIC'en direkt i kortet), renare strömförsörjning samt bättre skydd på portarna (framförallt joystickportarna). Därefter kommer jag börja titta lite på PIC-koden och börja skruva på denna.
Hittade ingen vhdl/verilog kod på den tyska sidan, bara .pof & .sof fil (vad nu det är).
Den FPGA som har den största antal logikgrindar utan att använda BGA är XC3S500E. Därav valet. Att ersätta minnet med en kapsel går utmärkt. Man får t.om en extra i/o över. Genom att chip select till minne #0 nyttjas som addressledning istället.
DRAM kanske är surt, men no pain, no gain? =)
Hur ska du fixa ICSP och filtrera ingående elektricitet ?
Den FPGA som har den största antal logikgrindar utan att använda BGA är XC3S500E. Därav valet. Att ersätta minnet med en kapsel går utmärkt. Man får t.om en extra i/o över. Genom att chip select till minne #0 nyttjas som addressledning istället.
DRAM kanske är surt, men no pain, no gain? =)
Hur ska du fixa ICSP och filtrera ingående elektricitet ?
Senast redigerad av blueint 17 oktober 2007, 13:06:35, redigerad totalt 1 gång.
.pof och .sof är alteras format. en går FPGAn via jtag, den andra ska in i flashminnet.
på DE2 kortet sitter en cyloneII-35. den är något större än XC3S1600E som är den största i Spartan-3E familjen.
edit: mer info om DE2 porten finns här: http://www.amiga.org/modules/newbb/view ... 70&forum=8
på DE2 kortet sitter en cyloneII-35. den är något större än XC3S1600E som är den största i Spartan-3E familjen.
edit: mer info om DE2 porten finns här: http://www.amiga.org/modules/newbb/view ... 70&forum=8
@rehnmaak:
HDL soft-m68k finns på sidan för ett Atari ST emulations projekt "Suska":
http://download.experiment-s.de/Suska/C ... _68K00_IP/
@Illuwatar:
Kan du kolla den snabbaste accesstiden på /RAM_OE (pin 41) och /RAM_WE (pin 17) ..? Dvs hur lång tid går det som kortast mellan två negativa flanker på dessa signaler.
GND=Pin 12, Pin 34 (M68AW512M).
HDL soft-m68k finns på sidan för ett Atari ST emulations projekt "Suska":
http://download.experiment-s.de/Suska/C ... _68K00_IP/
@Illuwatar:
Kan du kolla den snabbaste accesstiden på /RAM_OE (pin 41) och /RAM_WE (pin 17) ..? Dvs hur lång tid går det som kortast mellan två negativa flanker på dessa signaler.
GND=Pin 12, Pin 34 (M68AW512M).
det är dock inte samma kärna:
"This IP core is the model of a (hopefully) 68000 compatible microprocessor. The core uses about 10.000 logic elements (Altera Cyclone II)."
se hans kommentar nedan.
hans kärna verkar vara runt 4K celler stor.
bör också nämnas att "TobiFlex" är en av killarna bakom C-ONE (C64 emulatorn).
"This IP core is the model of a (hopefully) 68000 compatible microprocessor. The core uses about 10.000 logic elements (Altera Cyclone II)."
se hans kommentar nedan.
Quote:
Did TobiFlex design the 68k core himself?
Yes I have done this myself.
hans kärna verkar vara runt 4K celler stor.
bör också nämnas att "TobiFlex" är en av killarna bakom C-ONE (C64 emulatorn).