Dynamische Zuweisung VHDL

Gast #3020919
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!
#3020941
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.
Gast #3020943
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.
Gast #3020958
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!
Gast #3020972
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;
Moderator (Firma: Titel) Persönliche Seite #3021132
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"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren