(signal1 downto signal2) - geht das doch irgendwie?

Gast #2997939
Lesenswert?

Hallo,

ich bekomme in einer Testbench von einem anderen Block einen real-Wert 
übergeben.

Diesen real-Wert wollte ich nun dazu verwenden, um den Start und das 
Ende eines Vektors zu definieren, oder zwei Bit aus einem Vektor zu 
vergleichen o.Ä. und natürlich um auch diese Angaben zur Laufzeit der 
Simulation ändern zu können.

Ich wollte z.B. folgendes tun:
1
entity test is
2
  port (
3
    ...
4
    INPUT        : in real;
5
    ... );
6
end test;
7

8
architecture rtl of test is
9
  signal s_input : integer;
10
begin
11
  s_input <= integer(INPUT);
12
  process begin
13
     if Vektor(s_input) = Vektor(s_input + 1) then
14
        ...
15
  end process;
16
end architecture rtl;

Nun haut mir der Simulator einen "fatal error" um die Ohren. Der 
Compiler hingegen hat keine Probleme damit...
Ich denke mich zu erinnern, dass man bei diesen variablen Ranges immer 
konstante Werte verwenden muss, also z.B. ein Generic, aber keine INs 
oder Signale zugelassen sind.

Gibt es einen Weg, wie ich mit meinem Eingangssignal dennoch die Range 
eines Vektors verändern kann?

Danke!

Viele Grüße,
fpga_student
Gast #2998022
Lesenswert?

Hallo,

Klaus schrieb:
> Und die Fehlermeldung ist ein Betriebsgeheimnis, das du nicht
> veröffentlichen darfst? ;-)
Nein, netürlich nicht!
Sie enthält meiner Meinung nach nur keine sinnvollen Angaben, außer die 
Zeilenangabe im Code.
1
# ** Fatal: (vsim-3421) Value -2147483648 is out of range 0 to 127.
2
#    Time: 0 ps  Iteration: 0  Process: /sim_dut/i0_modell/gen_modell File: MODELL.vhd
3
# Fatal error in ForLoop loop at MODELL.vhd line 89
4
# 
5
# HDL call sequence:
6
# Stopped at MODELL.vhd 89 ForLoop loop
7
#

Zeile 88 und zeile 89 sehen wie folgt aus:
1
   for n in 0 to 16 loop                                 -- Zeile 88
2
      if    table(s_input)(n) = table(s_input+1)(n) then -- Zeile 89
3
         ...
table ist dabei ein 128x17 array, in dem je nach dem INPUT, der die 
Zeile auswählt, die einzelnen Bits der Zeile verglichen werden sollen.

Die Simulation läd noch vernünftig, aber nach einem "run 100us" im 
Modelsim kommt dann der Fehler.

Vielen Dank!
fpga_student
Gast #2998031
Lesenswert?

Beim Kopieren ist mir gerade etwas aufgefallen:
1
signal s_input : integer;

Das zu
1
signal s_input : integer := 0;
abgeändert und die Sache läuft... mhm... nicht sauber deklariert!

Gut, dass wir darüber gesprochen haben! :)
Gast #2998957
Lesenswert?

Hallo,

Lothar Miller schrieb:
> So wärs sofort gegangen:
1
if    table(integer(input))(n) = table(integer(input)+1)(n) then

Das habe ich davor versucht, aber da spuckt mir der Simulator den 
gleichen Fehler aus. Der Eingang wird außerhalb des Blockes sauber 
initialisiert mit real := 0.0

Mit dem Umweg über das Signal geht es dann... hat mich auch gewundert?!

Vielen Dank!

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