Altera IV mit ATmega328 programmieren

OP (Firma: wiki.flowerhouse.at) #5054068
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
OP (Firma: wiki.flowerhouse.at) #5054615
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.
OP (Firma: wiki.flowerhouse.at) #5054672
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
#5054790
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();
OP (Firma: wiki.flowerhouse.at) #5059867
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
Angehängte Dateien:
#5062667
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.
#5063165
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren