Forum: FPGA, VHDL & Co. Verhalten von Signalen nach zuweisung


von Der A. (vimes_ankh)


Lesenswert?

Eine wahrscheinlich doofe Frage:
Ich habe ein design und füge hier drei gleiche Komponenten zur 
Berechnung einer Gleitkommazahl ein. Die Komponenten haben jeweils zwei 
eingänge von 32 bit breite und einen genau so breiten ausgang.
In der Logik, in die ich die Komponenten gehängt habe, habe ich für jede 
der Komponenten drei Signale der gleichen bitbreite. Also insgesamt 9 
Signale für ein- und Ausgabe der drei Komponenten.

Mein IPCore hat zwei writable register, von denen sollen die Daten 
kommen.

Mein Problem: Ich will jetzt abwechselnd auf die erste, dann auf die 
zweite und dann auf die dritte Komponente die Registerinhalte als 
Eingangsdaten legen. Ich habe einen Automaten geschrieben, in dem im 
ersten schritt reg1 und reg2 auf die eingangssignale der ersten 
komponente gelegt werden. Wenn ich jetzt im zweiten zustand, nach 
registeränderung, den Inhalt der Registersignale auf die eingangssignale 
der zweiten komponente lege, "behalten" sich die eingänge für Komponente 
eins dann die ersten Registerinhalte?

Vielen Dank für eure Antworten!

von Der A. (vimes_ankh)


Lesenswert?

Oder einfacher Ausgedrückt: Wie behalten sich die sechs Eingangssignale 
für meine Komponenten die Daten, bis die Bereichnung fertig ist?

von Falk B. (falk)


Lesenswert?

@ Der Anfänger

>Oder einfacher Ausgedrückt: Wie behalten sich die sechs Eingangssignale
>für meine Komponenten die Daten, bis die Bereichnung fertig ist?

Mittels Register/FlipFlops?

MfG
Falk


von Der A. (vimes_ankh)


Lesenswert?

Da bin ich jetzt auch drauf gekommen. Ich mache es jetzt 
folgendermassen, es wäre super, wenn jemand sagt, ob das totaler Quatsch 
ist:

Ich habe einen synchronisierten Prozess. Das einzige, was er macht, ist 
zu warten, ob ein std_logic auf 1 ist. Wenn das der Fall ist, mache ich 
eine Signalzuweisung der Eingangsregister auf die Eingänge meiner 
Komponenten. Bei 0 macht er nix. Wenn ich jetzt das Signal auf die 
Eingänge lege, mache ich das nicht per Signalzuweisung, sondern per 
setzen des std_logic auf 1, im nächsten Takt dann wieder auf Null.

Die Eingänge für meine Komponenten müssten den Zustand ja dann wieder 
halten, oder?

@Falk: Danke für dein Engagement im Forum. Ich persönlich habe schon 
sehr oft davon profitiert.

von Falk B. (falk)


Lesenswert?

@ Der Anfänger

>Da bin ich jetzt auch drauf gekommen. Ich mache es jetzt
>folgendermassen, es wäre super, wenn jemand sagt, ob das totaler Quatsch
>ist:

Poste mal ein wenig Code (als Anhang), das sagt mehr als tausend 
allgmeine Worte.

>Ich habe einen synchronisierten Prozess. Das einzige, was er macht, ist
>zu warten, ob ein std_logic auf 1 ist. Wenn das der Fall ist, mache ich
>eine Signalzuweisung der Eingangsregister auf die Eingänge meiner
>Komponenten. Bei 0 macht er nix. Wenn ich jetzt das Signal auf die
>Eingänge lege, mache ich das nicht per Signalzuweisung, sondern per
>setzen des std_logic auf 1, im nächsten Takt dann wieder auf Null.

So in etwa passt das.

>Die Eingänge für meine Komponenten müssten den Zustand ja dann wieder
>halten, oder?

Die Eingänge nicht, aber die FlipFlops, welche die Eingänge speisen, 
schon. ;-)

MfG
Falk

von Der A. (vimes_ankh)


Lesenswert?

Hier der Prozess zum Legen der Register auf die Eingänge:
1
  SCHREIBE_EINGANGSREGISTER1 : process( Bus2IP_Clk ) is
2
  begin
3
4
    if ( Bus2IP_Clk'event and Bus2IP_Clk = '1' ) then
5
     if(sax1_eingang_schreiben = '1') then
6
        sax1_x_in <= slv_reg2(32 to 63);
7
      sax1_y_in <= slv_reg3(32 to 63);
8
    end if;
9
   end if;     
10
  end process   SCHREIBE_EINGANGSREGISTER1;
Hier der Automat, der dann das Signal genau einen Takt auf 1 setzen soll 
(habs mal auf eine Komponente reduziert):
1
  ADDIERE_PROCESS : process( Bus2IP_Clk ) is
2
  begin
3
    if ( Bus2IP_Clk'event and Bus2IP_Clk = '1' ) then
4
      if ( Bus2IP_Reset = '1' ) then
5
        addier_zustand <= IDLE;
6
      sax1_exc_in <= '0';
7
      else
8
        case addier_zustand is
9
      
10
        when IDLE=>
11
        sax1_rdy_in <= '0';
12
        addier_zustand <= IDLE;
13
        if(addiere_aussen = '1') then
14
          sax1_rdy_in <= '0';
15
          sax1_eingang_schreiben <= '1';
16
          addier_zustand <= EINS;
17
          else 
18
            addier_zustand <= IDLE;
19
        end if;
20
         
21
       when EINS =>
22
         sax1_eingang_schreiben <= '0';
23
        sax1_rdy_in <= '1';
24
         if (fertig_geschrieben = '1') then 
25
          addier_zustand <= IDLE;    
26
          fertig_gerechnet <= '0';
27
          fertig_gerechnet <= '0';
28
            else 
29
              addier_zustand <= EINS;
30
              if (sax1_done = '1') then
31
            fertig_gerechnet <= '1';      
32
          end if;           
33
        end if;          
34
          when others =>
35
            addier_zustand    <= IDLE;       
36
        end case; 
37
      end if;
38
    end if;
39
  end process ADDIERE_PROCESS;

  

von Falk B. (falk)


Lesenswert?

Passt soweit. Aber die Formatierung ist grausam.

MfG
Falk

von Der A. (vimes_ankh)


Lesenswert?

Ja, weiss ich, war auf die schnelle gemacht. Nochmal danke!

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.