Forum: FPGA, VHDL & Co. ModelSim Problem 'X' anstatt '1' in std_logic_vector signal


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christian G (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin da auf ein Problem mit dem ModelSim Simulator gestoßen und zwar 
sieht er in einem Signal (std_logic_vector) anstelle von den '1'sen 
immer ein 'X'.
Das hat zur Folge das in dem Prozess der mit diesem Signal arbeitet ein 
case nicht mehr funktioniert da er da anstelle von z.B. "00010000" ein 
"000X0000" sieht.
Ich habe meine Dateien mal angehängt, es geht um das Signal 
"instruction" in "gcpu_soc.vhd".
Das ROM aus dem die Daten kommen wird mit dem Inhalt von "ROM.BIT" 
(evtl. in der Version noch "ROM.HEX") initialisiert. Das Funktioniert 
auch in der Simulation, ich sehe das im ROM die std_logic_vector richtig 
sind '1'sen und '0'en aber "instruction" bekommt nur 'X'e und '0'en.
Woran könnte das wohl liegen?

von daniel__m (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hi,

"multiple drivers": instruction wird aus einem prozess und bei einer 
Instanziierung beschrieben.

Entferne den Reset (oder verschiebe ihn ins Registerfile)

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
1
  rom_inst : rom port map(
2
    clk => clk100,
3
    addr => pc,
4
    data => instruction     --- hier wird auf instruction geschrieben
5
  );
6
  
7
  process
8
  begin
9
    wait until rising_edge(clk100);
10
    if (reset = '1') then
11
      pc <= (others => '0');
12
      instruction <= (others => '0'); --- und hier auch --> Kollision
13
    else
14
      ...

BTW:
Das hier geht kürzer:
1
      if (to_integer(unsigned(pc)) < 1) then
2
        pc <= std_logic_vector(to_unsigned(to_integer(unsigned(pc)) + 1, 11));
Denn auch mit unsigned Vektoren kann man rechnen. Und man kann sie mit 
positiven integer Zahlen vergleichen:
1
      if (unsigned(pc) < 1) then
2
        pc <= std_logic_vector(unsigned(pc)+1);
Siehe dazu die Operatoren in der numeric_std:
https://www.csee.umbc.edu/portal/help/VHDL/packages/numeric_std.vhd
Und in logischer Konsequenz könnte man den pc gleich als unsigned Vektor 
definieren...

: Bearbeitet durch Moderator
von Christian G (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank daniel__m und Lothar Miller! Ich übe halt noch und das mit 
dem mehrfachem Zugriff auf instruction ist mir hier leider durchgegangen 
:(

Vielen Dank auch für den Tipp mit den unsigned Vektoren, hast völlig 
recht, warum nicht gleich nutzen anstatt der rum-caste / 
konvertiererei!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [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 Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.