mikrocontroller.net

Forum: FPGA, VHDL & Co. Verständnisproblem Signalzuweisung


Autor: christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Habe ein Verständnisproblem:
Ein Counter addressiert ein RAM-Baustein:

Mit der ersten steigenden Flanke wird PCinc auf 1 gesetzt.
Dadurch wird der Prozess im Counter getriggert und PCout
gesetzt.PCout ist mit dem Eingang des Memory Bausteins verbunden.
In diesem ersten Takt wird daher Address auf den Wert von PCout
gesetzt.Im Simulator geschieht das alles im ersten Takt.
Erst im 2.Takt wird im Simulator data_out mit der neuen addresse
belegt.

Das vertehe ich nicht:
Warum erhält data_out seinen neuen Wert nicht schon im ersten Takt?
Schließlich ändert sich ja auch  address (in der sensitivy list)
im ersten Takt.Und damit wäre ja die Bedingung erfüllt um
den Prozess in memory zu aktivieren.

--clock generation
    process
    begin
  clock <= '0';
  wait for 5 ns;      -
        clock<= '1';
  wait for 5 ns;
    end process;

--end clock generation

--counter
entity PC is
port(
  PCinc:  in std_logic;
  PCout:  out std_logic_vector(15 downto 0)
);
end PC;

signal tmp_PC: std_logic_vector(15 downto 0);
begin
  process(PCinc)
  begin
          if (PCinc'event and PCinc = '1') then
      tmp_PC <= tmp_PC + "1";
    end if;
  end process;
  PCout <= tmp_PC;
--end counter

--memory
entity memory is
port (   clock  :   in std_logic;
  address  :  in std_logic_vector(7 downto 0);
  data_out:  out std_logic_vector(15 downto 0)
);
end memory;
        process(clock, address)
  begin
          if (clock'event and clock = '1') then
      data_out <= tmp_ram(to_integer(unsigned(address)));
    end if;
  end process;
--end memory

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
christian schrieb:
> Warum erhält data_out seinen neuen Wert nicht schon im ersten Takt?
> Schließlich ändert sich ja auch  address (in der sensitivy list)
> im ersten Takt.
Nur ist eben die address in der Sensitivliste unnötig und fehl am 
Platz.
Denn wenn du das hier ansiehst:
    if (clock'event and clock = '1') then
      data_out <= tmp_ram(to_integer(unsigned(address)));
    end if;
Dann muss erst mal ein Takt kommen, bevor die Zuweisung ausgeführt 
wird!

So ginge das:
--memory
entity memory is
port (   clock  :   in std_logic;
  address  :  in std_logic_vector(7 downto 0);
  data_out:  out std_logic_vector(15 downto 0)
);
end memory;
:
 process(address)
  begin
      data_out <= tmp_ram(to_integer(unsigned(address)));
  end process;
:
--end memory

Oder gleich so:
--memory
entity memory is
port (   clock  :   in std_logic;
  address  :  in std_logic_vector(7 downto 0);
  data_out:  out std_logic_vector(15 downto 0)
);
end memory;
:
architecture... begin...

      data_out <= tmp_ram(to_integer(unsigned(address)));

end architecture...;
--end memory

Autor: christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich verstehe das vor der Signalzuweisung das Ereignis
erst stattfinden muss.Aber das Ereignis ist ja im ersten
Takt die Veränderung von PC_out und damit address.
Warum lässt sich der Simulator Zeit bis zur nä. Flanke?
Gruß
Christian

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
christian schrieb:
> Aber das Ereignis ist ja im ersten
> Takt die Veränderung von PC_out und damit address.
> Warum lässt sich der Simulator Zeit bis zur nä. Flanke?
Mal angenommen, der simulierte clock geht sowohl auf clock und auf 
PCinc, dann wird beim ersten Takt
1. address auf PC_out zugewiesen   und
2. mit der bisherigen address Daten aus dem RAM auf data_out 
zugewiesen

Diese beiden Zuweisung passieren dann ja genau zum selben Zeitpunkt, und 
erst beim nächsten Takt kann die zuvor zugewiesene Adresse zum Auslesen 
aus dem RAM verwendet werden.

> Warum lässt sich der Simulator Zeit bis zur nä. Flanke?
Das ist nicht der Simulator, der sich hier "Zeit lässt", das ist genau 
dein Design... :-o

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.