Forum: FPGA, VHDL & Co. Buswahl und RS232 - invertieren?


von Stefan H. (stefanhanke)


Lesenswert?

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

von TheMason (Gast)


Lesenswert?

>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

von Stefan H. (stefanhanke)


Lesenswert?

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