Forum: FPGA, VHDL & Co. Altera IV mit ATmega328 programmieren


von Fabian P. (Firma: wiki.flowerhouse.at) (tropaion)


Lesenswert?

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

von 1N 4. (1n4148)


Lesenswert?


von Markus F. (mfro)


Lesenswert?


von Fabian P. (Firma: wiki.flowerhouse.at) (tropaion)


Lesenswert?

Danke.

Also kann ich das mit jedem GPIO machen?
Gibt es dafür eig. eine Library bzw. hat jemand Beispiel?

von Dumpfbacke (Gast)


Lesenswert?

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?

von Fabian P. (Firma: wiki.flowerhouse.at) (tropaion)


Lesenswert?

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.

von Stefan S. (chiefeinherjar)


Lesenswert?

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!

von Dumpfbacke (Gast)


Lesenswert?

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?

von Fabian P. (Firma: wiki.flowerhouse.at) (tropaion)


Lesenswert?

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

von Markus F. (mfro)


Lesenswert?

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();

von Fabian P. (Firma: wiki.flowerhouse.at) (tropaion)


Angehängte Dateien:

Lesenswert?

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

von Markus F. (mfro)


Lesenswert?

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.

von Fabian P. (Firma: wiki.flowerhouse.at) (tropaion)


Lesenswert?

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
von Markus F. (mfro)


Lesenswert?

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
Noch kein Account? Hier anmelden.