Hallo, ich möchte einen Altera EP4CE6E22C8N mit einem ATmega328 programmieren. Der uC soll die Datei von einer SD-Karte lesen und in denn FPGA schreiben. Denn Teil mit der SD-Karte zu programmieren ist kein Problem für mich, aber ich weis nicht, wie ich denn uC an denn FPGA anschließen soll. Laut Datenblatt ist es möglich denn FPGA mit einem uC zu programmieren, wenn er im PS-Mode ist, aber mehr konnte ich leider nicht herrausfinden. Hat da jemand vll. mehr Infos für mich? Mfg, Tropaion
Danke. Also kann ich das mit jedem GPIO machen? Gibt es dafür eig. eine Library bzw. hat jemand Beispiel?
Fabian P. schrieb: > Gibt es dafür eig. eine Library bzw. hat jemand Beispiel? Maker wa? Bloss nicht selber machen, sondern nur copy & paste, gell?
Dumpfbacke schrieb: > Bloss nicht selber machen, sondern nur copy & paste, gell? Nicht ganz. Wenn es jedoch schon etwas gibt, macht es keinen Sinn das Rad neu zu erfinden. Fragen schadet nicht. Wenn es nichts gibt, auch kein Problem, dann schreibe ich einfach eine Library dafür. BTW, mir gefällt es, das du als Gast wenigstens einen Autornamen verwendest, welcher optimal zu deinem Kommentar passt.
Fabian P. schrieb: > Wenn es nichts gibt, auch kein Problem, dann schreibe ich einfach eine > Library dafür. Ich denke, du/ihr unterschätzt den Aufwand ein wenig... Aber bitte - wenn ihr fertig seid, könnt ihr es ja veröffentlichen. Ich wäre sehr gespannt!
Stefan S. schrieb: > Ich denke, du/ihr unterschätzt den Aufwand ein wenig... Was ist so schwer einen Byte-Stream über das SPI zu schicken?
Stefan S. schrieb: > Ich denke, du/ihr unterschätzt den Aufwand ein wenig... Aber bitte - > wenn ihr fertig seid, könnt ihr es ja veröffentlichen. Ich wäre sehr > gespannt! Gerne! Hatte ich sowieso vor, alle meine Projekte sind Open-Source. Ich habe sowieso Ferien, also Zeit ist da. Ich weis das das etwas aufwendiger ist, aber das ist eig. nur ein Teil eines Projektes. Das Endergebnis soll eine Atomuhr inkl. verstellbarem Frequenzausgang für genaue Messungen in einem kompakten Gehäuse werden. Mfg, Tropaion
Fabian P. schrieb: > Danke. > > Also kann ich das mit jedem GPIO machen? > Gibt es dafür eig. eine Library bzw. hat jemand Beispiel? Das ist eigentlich ganz simpel. Das folgende Beispiel läuft auf einer ColdFire-Maschine (die GPIO's mußt Du halt anpassen). Erst kommt ein Reset, dann wird die Config (kommt aus FPGA_FLASH_DATA) per Bit-Banging in das FPGA geschrieben. SPI braucht man nicht (könnte allerdings sein, daß es damit etwas schneller ginge). Die ganze Chose dauert auf einem (großen) Cyclone III etwas weniger als zwei Sekunden.
1 | config_gpio_for_fpga_config(); |
2 | MCF_GPIO_PODR_FEC1L &= ~FPGA_CLOCK; /* FPGA clock => low */ |
3 | |
4 | /* pulling FPGA_CONFIG to low resets the FPGA */
|
5 | MCF_GPIO_PODR_FEC1L &= ~FPGA_CONFIG; /* FPGA config => low */ |
6 | wait(10); /* give it some time to do its reset stuff */ |
7 | |
8 | while ((MCF_GPIO_PPDSDR_FEC1L & FPGA_STATUS) && (MCF_GPIO_PPDSDR_FEC1L & FPGA_CONF_DONE)); |
9 | |
10 | MCF_GPIO_PODR_FEC1L |= FPGA_CONFIG; /* pull FPGA_CONFIG high to start config cycle */ |
11 | while (!(MCF_GPIO_PPDSDR_FEC1L & FPGA_STATUS)) |
12 | ; /* wait until status becomes high */ |
13 | |
14 | |
15 | const uint8_t *fpga_flash_data_end = FPGA_FLASH_DATA + FPGA_FLASH_DATA_SIZE; |
16 | |
17 | fpga_data = (uint8_t *) FPGA_FLASH_DATA; |
18 | do
|
19 | {
|
20 | uint8_t value = *fpga_data++; |
21 | for (i = 0; i < 8; i++, value >>= 1) |
22 | {
|
23 | |
24 | if (value & 1) |
25 | {
|
26 | /* bit set -> toggle DATA0 to high */
|
27 | MCF_GPIO_PODR_FEC1L |= FPGA_DATA0; |
28 | }
|
29 | else
|
30 | {
|
31 | /* bit is cleared -> toggle DATA0 to low */
|
32 | MCF_GPIO_PODR_FEC1L &= ~FPGA_DATA0; |
33 | }
|
34 | /* toggle DCLK -> FPGA reads the bit */
|
35 | MCF_GPIO_PODR_FEC1L |= FPGA_CLOCK; |
36 | MCF_GPIO_PODR_FEC1L &= ~FPGA_CLOCK; |
37 | }
|
38 | } while ((!(MCF_GPIO_PPDSDR_FEC1L & FPGA_CONF_DONE)) && (fpga_data < fpga_flash_data_end)); |
39 | |
40 | if (fpga_data < fpga_flash_data_end) |
41 | {
|
42 | end = MCF_SLT0_SCNT; |
43 | time = (start - end) / (SYSCLK / 1000) / 1000; |
44 | |
45 | xprintf("finished (took %f seconds).\r\n", time / 1000.0); |
46 | config_gpio_for_jtag_config(); |
47 | |
48 | return true; |
49 | }
|
50 | xprintf("FAILED!\r\n"); |
51 | config_gpio_for_jtag_config(); |
Hallo! Ich habe jetzt eine Library dafür geschrieben. Da es das erste mal ist das ich so eine Library schreibe, wäre es toll wenn Ihr mal drüberschauen könnten. Testen konnte ich sie leider noch nicht, weil die Hardware noch nicht da ist. Mfg, Tropaion
Fabian P. schrieb: > wenn Ihr mal drüberschauen könnten. Ich hab' dir extra ein (seit fast zehn Jahren fehlerfrei funktionierendes) Beispiel eingestellt. Schade daß Du's offensichtlich nicht mal angeschaut hast. Dann hättest Du erkannt, daß Du deine Bytes falsch herum raus schiebst. Der Chip will die "LSB first" sehen. Den Rest hab' ich mir nicht angeschaut.
Doch, natürlich habe ich mir das Script angesehen, nur nicht gänzlich verstanden. Darum habe ich dann Anhand der zwei Datenblätter programmiert. Woran bei dir im Script erkenne ich das LSB als erstes kommt? Mfg, Tropaion
:
Bearbeitet durch User
Fabian P. schrieb: > Woran bei dir im Script erkenne ich das LSB als erstes kommt? Schau selber: Markus F. schrieb:
1 | > for (i = 0; i < 8; i++, value >>= 1) |
2 | > { |
3 | >
|
4 | > if (value & 1) |
5 | > { |
6 | > /* bit set -> toggle DATA0 to high */ |
7 | > MCF_GPIO_PODR_FEC1L |= FPGA_DATA0; |
8 | > } |
9 | > else |
10 | > { |
11 | > /* bit is cleared -> toggle DATA0 to low */ |
12 | > MCF_GPIO_PODR_FEC1L &= ~FPGA_DATA0; |
13 | > } |
Fabian P. schrieb:
1 | for (i = 0; i < 8; i++) |
2 | {
|
3 | if (b & 0x80) |
4 | {
|
5 | //Send HIGH
|
6 | ALTERAsendHIGH(); |
7 | }
|
8 | else
|
9 | {
|
10 | //Send LOW
|
11 | ALTERAsendLOW(); |
12 | }
|
13 | b <<= 1; |
Da ist ein kleiner (aber feiner) Unterschied. Deine Bits sind verkehrt herum. Werf' mal einen Blick auf "Figure 1: Configuration Cycle Waveform" in dem von mir verlinkten Altera-Artikel.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.