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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.