Signal lässt sich nicht beschreiben(VHDL)

OP #389780
Lesenswert?
• ▲
▼
Hallo,

ich habe folgenden Prozess:

counter: for x in 0 to bandwidth generate
process(clk)
begin
if rising_edge(clk) then

  if cnt_trigger(x) = '1' then
    if decoded(x) = '1' then
      high_counters(x) <= high_counters(x) +1;
    else
      low_counters(x) <= low_counters(x) +1;
    end if;
  else
     if low_reset(x) = '1' then
      low_counters(x)  <= (others => '0');
    end if;

    if high_reset(x) = '1' then
      high_counters(x)  <= (others => '0');
    end if;

  end if;

end if;
end process;
end generate;


cnt_trigger ist ein Triggersignal für die Zähler high_counters und
low_counters.
Decoded beinhaltet die Information, welche Zähler inkrementiert werden
sollen. D.h. wenn decoded(x) 0 ist wird low_counters(x) inkrementiert.
Wenn decoded(x) 1 ist, wird high_counters(x) inkrementiert.

Nun soll es auch möglich sein, diese Zähler zu resetten.
Dazu habe ich separate Resetleitungen für jeden Zähler(nämlich
low_reset und high_reset).
Wie im Code ersichtlich ist soll derjenige Zähler resettet werden,
dessen Resetleitung high ist.
In der Simulation passiert absolut gar nichts, wenn eine Resetleitung
auf high geht(es wird nur in diesem einen Prozess auf das Signal
geschrieben)
Woran könnte das liegen?

Danke!

Daniel
Gast #389782
Lesenswert?
• ▲
▼
würde zuerst die Abfrage nach Reset machen:

am besten, du beschreibst die beiden Zähler getrennt:

if rising_edge(clk) then

  if low_reset(x) = '1' then...
  elsif cnt_trigger(x) = '1' and decoded = '1' then...
  end if;

  if high_reset(x) = '1' then...
  elsif cnt_trigger(x) = '1' and decoded = '0' then...
  end if;

end if;

in der Form hat der Reset auf jeden Fall "Vorrang"
OP #389785
Lesenswert?
• ▲
▼
In meinem letzten Beitrag habe ich mich verschrieben...
Es sollte heißen: ...sondern bleibt auf dem aktuellen Wert.


Das Signal wird einfach nicht auf 0 gesetzt, obwohl die anderen Signale
in der Simulation so sind, wie sie sein sollen. Es treten keine
Undefinierten Zustände auf... Ich habe keine Ahnung was daran falsch
sein könnte.

Daniel
#389787
Lesenswert?
• ▲
▼
Das Reset-Signal braucht nicht in die sensitivity list, da mit diesem
VHDL ein synchroner Reset beschrieben wird.
Aber man brauchst natürlich eine Taktflanke, damit das Reset Signal
erkannt wird.
Wenn ein asynchroner Reset gewünscht wird, dann müßte man
folgendermasen beschreiben :
1
process(clk,low_reset(x))
2
begin
3
if (if low_reset(x) = '1' then
4
    low_counters(x)  <= (others => '0');
5
elsif rising_edge(clk) then
6
  if cnt_trigger(x) = '1' then
7
    if decoded(x) = '1' then
8
      low_counters(x) <= low_counters(x) +1;
9
    end if;
10
  end if;
11
end if;
12
end process

Dabei könnte es passieren, daß das (x) in der sensitivity liste nicht
akzeptiert wird.
Für "high_counters" ist ein getrenntes generate nötig.
Grüße
Klaus
Gast #389789
Lesenswert?
• ▲
▼
Na das ist klar! Aber ich geh davonaus, dass der Reset absichtlich
synchron ist. Daher wollte ich auch nix anderes vorschlagen.

Ich selber hatte jedenfalls schon mal das Problem, dass ein
Vergleichssignal in einer synchronen IF-Abfrage nicht in der
sensitivity-List stand und Modelsim dannn diese Abrage komplett
ignoriert hat.
#389793
Lesenswert?
• ▲
▼
>>Für "high_counters" ist ein getrenntes generate nötig.
>>Ein getrennter Prozess genügt auch.

> Warum sowas?
> Wenn ich einen weiteren Prozes habe gibts ne Multisource.

Das braucht es nur für meine Variante mit dem asynchronen Reset.
Multisource gibt es, wenn Du aus 2 verschieden Prozessen das gleiche
Signal setzt. Wenn Du 2 getrennte Prozesse jeweils für low_counters und
für high_counters hast, dann gibts kein multisource.

Klaus
Gast #389802
Lesenswert?
• ▲
▼
Wie sieht die Definition der Reset-Signale und Counter-Signale aus? Ein
Fehler könnte noch sein, dass zB. der Reset mit msb downto lsb und die
Counter mit lsb to msb definiert wurden. Sonst müsste der Code oben
funzen, da is erstmal kein Fehler drin.


T.M.


=============================
http://editthis.info/freefpga
=============================
OP #389803
Lesenswert?
• ▲
▼
Alle Signale sind std_logic_vector mit MSB downto LSB. Keine Ahnung,
warum ModelSim das in dem Fall andersrum darstellt...

Ich weiß echt nicht mehr weiter.
Ich glaube ich teste das mal direkt in der Hardware. Wenn es nuu an der
Simulation liegt, dann ist der ganze Aufwand nach dem Fehler zu suchen
umsonst.


Daniel
Gast #389809
Lesenswert?
• ▲
▼
Aaaaalso fassen wir zusammen:
Der Zählerausgang verändert sich, ohne dass die entsprechenden
Eingangssignale anliegen.
Du schreibst, dass du den mit "force" änderst.
Allerdings wird der Zähler ja getrieben (von deiner Logik) udn wenn du
da mit force dagegenhältst, dann gibt es keine "sinnvollen"
Zählerstände, sondern "xxx". Du hast aber gültige Zählerstände.
Das iist nur dann möglich, wenn du das Zählersignal gar nicht treibst.

Simulierst du überhaupt dein Design oder was ganz was anderes?

Sorry, dass ich so frage, aber ich hab langsam den Eindruck, dass dein
Problem wo ganz anders liegt
OP #389810
Lesenswert?
• ▲
▼
Wie Du willst: Ich mache Dir einen Screenshot vom ganzen Design und den
kompletten Quellcode gibts auch dazu. Ich wollte nur nicht den ganzen
Käse, der unnötig ist in der Simulation haben, damit jeder den
Überblick behält.

>>Allerdings wird der Zähler ja getrieben (von deiner Logik) udn wenn
du
>>da mit force dagegenhältst, dann gibt es keine "sinnvollen"
>>Zählerstände, sondern "xxx".

Ist mir noch gar nie passiert.

>>Simulierst du überhaupt dein Design oder was ganz was anderes?
Es ist tatsächlich das richtige Design.

Bis später..

Daniel
OP #389811
Lesenswert?
• ▲
▼
Hallo,

Asche auf mein Haupt. Ich Schlafmütze hatte die ganze Zeit mit force
simuliert, anstatt die Zähler regulär zählen zu lassen(ging zu lang).
Force lässt sich dann leider nicht mit der treibenden Logik
überschreiben. Dafür gibt’s ja „no force“, welches ich vergessen hatte
anzuklicken.
Jetzt funktioniert alles.

Trotzdem vielen Dank, dass Ihr mir geholfen habt.


Daniel
Gast #389812
Lesenswert?
• ▲
▼
Was soll ich dazu noch sagen???????

Na ja, ich verstreu mal nen ganzen Laster Asche auf deinem Haupt und
das nächste mal einfach die beiträge richtig lesen!

"Allerdings wird der Zähler ja getrieben (von deiner Logik) udn wenn
du
da mit force dagegenhältst, dann gibt es keine "sinnvollen"
Zählerstände, sondern "xxx""


Na ja, sei´s drum.. hauptsache es tut jetzt
Gast #389815
Lesenswert?
• ▲
▼
Jaja, ob sorum oder sorum... das ist doch völlig wurscht!
Kannst ja mal zwei IC´s mit den Ausgängen zusammenschalten und dann
sagen, welcher Schuld ist, dass es nicht tut.
Isdt einfach so, dass du immer mit Problemen rechnen musst, wenn du an
zwei Stellen auf ein Signal treibst, ob mit force , aus dem Design an
sich oder aus dem Tester.
Das mit den x-en passiert, wenn du ein signal bereits aus VHDL treibst
(z.B. mit '0' und dann das signal mit force 1 überschreibst, dann
weiss der simulator nimmer, was er machen soll und zeigt x an).
wenn das signal natürlich vorher auf "unassigned" steht, weil dein
system gar nich läuft (z.B. kein resetwert, vondem der zähler loslaufen
kann, dann kann dieses natürlich schon mit force überschrieben werden.
Dumm nur, wenn dann das Design was machen soll. Und das ist bei dir
passiert.


Nun, aber wenn´s jetzt funzt, dann ist ja alles prima... hab schon an
meinem Verstand gezweifelt ;-)

@Dirk

mit force kann man ein Signal in Modelsim auf einen pegel "zwingen"
"force trigger 1" setzt das signal "trigger" auf '1' und das ganz
ohne testbench. Allerdings gefährlich, weil es dann eben, wie oben
passieren kann, dass ein Signal, das von einem Prozess getrieben wird,
einen komischen Zustand einnimmt.

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