Forum: FPGA, VHDL & Co. Dynamische Zuweisung VHDL


von Gilles (Gast)


Lesenswert?

Hallo!

Ich habe folgendes Problem:

Innerhalb meiner VHDL Architektur möchte ich innerhalb einer 
case-when-Abfrage eine Variable/ein Signal anders belegen. Also zum 
Beispiel:
1
begin
2
switchmu: PROCESS(clk)
3
BEGIN
4
  IF clk'EVENT AND clk='1' THEN
5
    CASE mu(7 downto 4) IS
6
      WHEN "0000" => 
7
        temp_old <=  0;
8
      WHEN "0001" => 
9
        temp_old <= 15;
10
      WHEN "0010" => 
11
        temp_old <= 14; 
12
      WHEN "0011" => 
13
        temp_old <= 13; 
14
      WHEN "0100" => 
15
        temp_old <= 12; 
16
      WHEN "0101" => 
17
        temp_old <= 11;
18
      WHEN "0110" => 
19
        temp_old <= 10;
20
                        WHEN OTHERS => 
21
        temp_old <= 0;
22
 
23
    END CASE;
24
  END IF;
25
END PROCESS;

Dann später innerhalb dieser Architektur möchte ich folgende Zuweisung 
machen:
1
 process(clk)
2
 begin
3
if (clk'event and clk='1') then
4
  sxtxemu_out(24-temp downto 0) <= sxtxemu_hi(24 downto temp);
5
  sxtxemu_out(23 downto 25-temp) <= (others => sxtxemu_hi(24));
6
end process;

ISim spuckt mir aber leider ohne weitere Erklärung einen "fatal Error" 
aus. Wenn ich temp jedoch durch nen Wert, also z.B. 10, ersetze, dann 
klappts.

Meine Fragen:

1) Welche Libraries muss ich einfügen damit das klappt?
2) Welchen Datentyp muss "temp" haben?

Vielen vielen Dank!

von Gilles (Gast)


Lesenswert?

NACHTRAG:

Temp_old ist das gleiche wie Temp nur nochmal durch den clk-process um 
einen Takt verzögert:

temp <= temp_old;

von P. K. (pek)


Lesenswert?

1
sxtxemu_out(24-temp downto 0) <= sxtxemu_hi(24 downto temp);

Das würde genau für den Fall temp = 12 funktionieren, in allen anderen 
Fällen wäre das Signal nicht gleich breit...

...vielleicht gehts' wenn Du links und rechts immer gleich breit bist, 
das kann aber u.U. in Riesenmuxen enden, wenn Du nicht aufpasst.

von Horst (Gast)


Lesenswert?

Hi,

wo bekommt denn temp seinen Wert zugewiesen?

--> Zu Typ und Bibliothek:

Wenn du so mit temp rechnest, muss das ein "integer" sein, kannst du 
über
1
signal temp : integer range 0 to 15;
 zuweisen.

Dazu solltest du mit der numeric_std arbeiten.

Bedenke aber beim zweiten Prozess, dass sich temp nicht in der 
sensitivity-list befindet und sich während des Prozesses ändern kann.

von Gilles (Gast)


Lesenswert?

Ha! Danke Horst!

Das Thema Sensitivity-List hatte ich bei all dem Post-Route-Simulieren 
schon längst wieder vergessen...

Hm also mit numeric_std und integer hab ichs schon versucht..

Wie gesagt:

temp_old kriegt erstmal (als integer...) seinen Wert in der 
case-when-Verzweigung.

"temp <= temp_old;" passiert dann wieder synchron einen Takt später.

Dann im dritten Takt wieder ein einem extra clk-Process wird dieses 
temp(auch integer...) verwendet, um eben diese dynamische Zuweisung zu 
ermöglichen.

@Peter K. :
Ich glaube du verrechnest dich da... Ich sehe bei dieser Zeile immer die 
Gleiche Länge... Steh ich so dermaßen aufm Schlauch?^^

Danke!

von Gilles (Gast)


Lesenswert?

Es klappt nun!!

Problem war die zweite Zeile:

sxtxemu_out(23 downto 25-temp) <= (others => sxtxemu_hi(24));

Die würde ja bei temp < 2 eine unsinnige Auswahl des sxtxemu_out-Vektors 
bewirken weil die rechts Zahl größer als die linke Zahl wäre...

Ich habs nun folgendermaßen:
1
 process(clk)
2
 begin
3
  if (clk'event and clk='1') then
4
    if temp > 1 then
5
      sxtxemu_out(24-temp downto 0) <= sxtxemu_hi(24 downto temp);
6
      sxtxemu_out(23 downto 25-temp) <= (others => sxtxemu_hi(24));
7
    elsif temp = 1 then
8
      sxtxemu_out(23 downto 0) <= sxtxemu_hi(24 downto 1);
9
    elsif temp = 0 then
10
      sxtxemu_out <= sxtxemu_hi(23 downto 0);
11
    end if;
12
end process;

von Klaus (Gast)


Lesenswert?

Wenn du das nachher auch synthetisieren möchtest, sollte du allerdings 
von der Beschreibungsweise Abstand nehmen ;-)  Da gehen variable 
Vektorgrenzen nämlich nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Gilles schrieb:
<vhdl>
  process(clk)
   ...
</vhdl>

Nimm besser eckige Klammern [ ] . Dann klappt das auch mit den Tokens:
1
  process(clk)
2
   ...

Klaus schrieb:
> Wenn du das nachher auch synthetisieren möchtest, sollte du allerdings
> von der Beschreibungsweise Abstand nehmen ;-)  Da gehen variable
> Vektorgrenzen nämlich nicht.
Doch, das wird hier allerdings ein Monstermultiplexer...
Siehe auch den Beitrag "Re: Vektorinhalt variabel zuweisen"

von P. K. (pek)


Lesenswert?

Gilles schrieb:
> Ich glaube du verrechnest dich da... Ich sehe bei dieser Zeile immer die
> Gleiche Länge... Steh ich so dermaßen aufm Schlauch?

Nep, hatte wohl gestern schwache 5 Minuten...

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.