Forum: FPGA, VHDL & Co. Anfängerfrage - Problem mit bidirektionalen Ports


von Michael (Gast)


Lesenswert?

Hallo

Bin noch völliger Neuanfänger, was programmierbare Hardware angeht. Habe 
auch leider kein Studium in dieser Richtung gemacht.

Trotzdem wollte ich mal versuchen, ein eigenes kleines Design zu 
schreiben. Ich habe mich der Einfachheit halber für Verilog entschieden, 
da es näher an C in der Syntax zu sein scheint.

Bücher habe ich leider keine hier. Ich habe mir vieles aus dem Netz 
runtergeladen. Aber trotzdem muss ich wohl zugeben, dass ich so ziemlich 
keine Ahnung habe.

Weshalb die lange Vorrede: Ich habe ein Verständnisproblem, und es kann 
sein, dass die Antwort offensichtlich ist und ich sie eben nur nicht 
wegen meiner Unkenntnis weiss (schäm).

Frage ist folgende:

Ich habe ein Design, dass mit einen bidirektionalen FIFO "spricht". Den 
Bus habe ich zunächst wie folgt angelegt (Auszug):
1
module mein_erstes_design (FD, ... );
2
3
inout [7:0] FD;
4
5
reg [7:0] FD, ioshifter;

in der State Machine wurde FD dann wie folgt beladen:
1
      // FIFO_DATAOUT
2
        if ( (fstate == Wait_not_FF) || (fstate == Strobe_WR) )
3
                FD <= ioshifter;
4
        else
5
                FD <= 8'hZZ;

Also, das Design funktioniert wunderbar auf einen kleinen FPGA. Aber als 
ich es dann für einen CPLD (MAX7064) kompilieren wollte, habe ich von 
Quartus eine Fehlermeldung erhalten, dass das Design acht Output Enable 
benötige, der Chip aber nur sechs habe.

Ich hatte nicht verstanden, wieso das Design überhaupt acht Output 
Enables braucht. Ich habe nur Grund für einen gesehen.

Ich habe das Design dann wie folgt geändert:
1
module mein_erstes_design (FD, ... );
2
3
inout [7:0] FD;
4
5
reg [7:0] ioshifter;
6
reg OE = 1'b0;
7
8
assign  FD = OE ? ioshifter : 8'hZZ;

in der State Machine wurde FD dann wie folgt beladen:
1
      // FIFO_DATAOUT
2
        if ( (fstate == Wait_not_FF) || (fstate == Strobe_WR) )
3
                OE <= 1'b1;
4
        else
5
                OE <= 1'b0;

Das funktioniert glücklicherweise genau so gut wie die erste Version, 
erzeugt beim Kompilieren aber anscheinend tatsächlich nur einen Output 
Enable.

Da ich eben keine Ahnung habe, wollte ich fragen, ob mir jemand erklären 
kann, wieso das so ist?

Vielen Dank

Michael

von Torsten L. (bluehorn)


Lesenswert?

Hi Michael,

Michael wrote:
>
1
>       // FIFO_DATAOUT
2
>         if ( (fstate == Wait_not_FF) || (fstate == Strobe_WR) )
3
>                 OE <= 1'b1;
4
>         else
5
>                 OE <= 1'b0;
6
>
>
> Das funktioniert glücklicherweise genau so gut wie die erste Version,
> erzeugt beim Kompilieren aber anscheinend tatsächlich nur einen Output
> Enable.
>
> Da ich eben keine Ahnung habe, wollte ich fragen, ob mir jemand erklären
> kann, wieso das so ist?

Gute Frage. Auf den ersten Blick sieht beides für mich in Ordnung aus. 
Ich tippe darauf, dass Dein Synthese Tool (Quartus?) einfach nicht 
erkennt, dass immer alle acht Ausgänge auf einmal gesetzt werden, wenn 
Du das mit dem sequentiellen if entscheidest. Hätte erwartet, das beides 
geht...

Muss das mal XST vorwerfen, was der daraus dreht. :)

Gruss, Torsten

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.