Forum: FPGA, VHDL & Co. (signal1 downto signal2) - geht das doch irgendwie?


von fpga_student (Gast)


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

von Klaus (Gast)


Lesenswert?

fpga_student schrieb:
> Nun haut mir der Simulator einen "fatal error" um die Ohren.

Und die Fehlermeldung ist ein Betriebsgeheimnis, das du nicht 
veröffentlichen darfst? ;-)

von fpga_student (Gast)


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

von fpga_student (Gast)


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! :)

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


Lesenswert?

Richtig, denn ein nicht initialisiertes Signal erhält erstmal den 
"linkesten" Wert. Und das ist bei integer dann INT_MIN=–2_147_483_647. 
Und dieser Index gilt sofort beim Initialisieren der Simulation (mow=0). 
So wärs sofort gegangen:
1
if    table(integer(input))(n) = table(integer(input)+1)(n) then

von fpga_student (Gast)


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!

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.