Hallo, ich will Daten zwischen zwei (asynchronen) FPGAs austauschen. Dazu habe ich RS232 nachgebaut; das braucht nur ein Bit und ist (war) relativ schnell implementiert. Das Signal ist elektrisch per LVTTL kodiert, und RS232 hat als Ruhezustand die '1'. Ist es da nicht besser, das Signal zu invertieren, so dass im Ruhezustand (fast) kein Strom fließt? Oder brauche ich mir darum keine Sorgen zu machen? Das ist hier alles ein bisschen verzwickt. Ich habe es vorher nicht geschafft, per Handshake Daten korrekt zu übertragen. Das einzige, was da eigentlich schief gehen kann, ist eine fehlerhafte Abtastung der Handshake-Signale. Aber selbst, als ich den Takt phasenverschoben habe, hat es nicht geklappt. Kann man da sonst noch was falsch machen? Anmerkungen bezüglich der "Bus"wahl? Ich werde innerhalb des Datenstromes zwar schon irgendwie "Addressen" haben, aber ich addressiere damit keine Teilnehmer im Sinne eines Busses. Wobei, man kann es natürlich so hinbiegen ;-) -- stefan
>Ist es da nicht besser, das Signal zu invertieren, >so dass im Ruhezustand (fast) kein Strom fließt? Oder brauche ich mir >darum keine Sorgen zu machen? ich glaube da brauchst du dir keine sorgen drum machen, denn "richtig" (sprich nennenswert) strom fließt ja eh nur beim wechsel von 0 nach 1 bzw. umgekehrt. hast du genügend ff (3-4) zum einsynchronisieren deiner handshake leitungen ?! hast du das als statemachine aufgebaut ? poste vielleicht mal deinen code. gruß rene
TheMason wrote: > ich glaube da brauchst du dir keine sorgen drum machen, denn "richtig" > (sprich nennenswert) strom fließt ja eh nur beim wechsel von 0 nach 1 > bzw. umgekehrt. OK. > hast du genügend ff (3-4) zum einsynchronisieren deiner handshake > leitungen ?! Öhm, ich habe ein einsames FF... > hast du das als statemachine aufgebaut ? poste vielleicht mal deinen > code. Es gibt ein FIFO mit 16 bit Breite. Die ersten zwei Zustände brauche ich, um Daten aus dem FIFO zu holen. Die nächsten drei Zustände wiederholen sich viermal. st_write und st_write_again schreiben das Datum zweimal raus, bevor im st_wait_for_ack VALID auf '1' gesetzt wird.
1 | when st_idle => |
2 | if S_CMDQUEUE_EMPTY = '1' then |
3 | next_wa_state <= st_idle; |
4 | else
|
5 | next_wa_state <= st_idle_wait; |
6 | next_S_CMDQUEUE_RD_EN <= '1'; |
7 | end if; |
8 | when st_idle_wait => |
9 | -- now rd_en is at fifo, wait one more cycle
|
10 | -- for data being served.
|
11 | next_wa_state <= st_write_1; |
12 | |
13 | when st_write_1 => |
14 | next_wa_cmd <= S_CMDQUEUE_DOUT(3 downto 0); |
15 | next_wa_state <= st_write_1_again; |
16 | when st_write_1_again => |
17 | next_wa_cmd <= S_CMDQUEUE_DOUT(3 downto 0); |
18 | next_wa_state <= st_wait_for_ack_1; |
19 | when st_wait_for_ack_1 => |
20 | if S_ACK = '1' then |
21 | next_wa_cmd <= S_CMDQUEUE_DOUT(3 downto 0); |
22 | next_wa_state <= st_write_2; |
23 | else
|
24 | next_wa_cmd <= S_CMDQUEUE_DOUT(3 downto 0); |
25 | next_valid <= '1'; |
26 | next_wa_state <= st_wait_for_ack_1; |
27 | end if; |
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.