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


von christian (Gast)


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

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


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:
1
    if (clock'event and clock = '1') then
2
      data_out <= tmp_ram(to_integer(unsigned(address)));
3
    end if;
Dann muss erst mal ein Takt kommen, bevor die Zuweisung ausgeführt 
wird!

So ginge das:
1
--memory
2
entity memory is
3
port (   clock  :   in std_logic;
4
  address  :  in std_logic_vector(7 downto 0);
5
  data_out:  out std_logic_vector(15 downto 0)
6
);
7
end memory;
8
:
9
 process(address)
10
  begin
11
      data_out <= tmp_ram(to_integer(unsigned(address)));
12
  end process;
13
:
14
--end memory

Oder gleich so:
1
--memory
2
entity memory is
3
port (   clock  :   in std_logic;
4
  address  :  in std_logic_vector(7 downto 0);
5
  data_out:  out std_logic_vector(15 downto 0)
6
);
7
end memory;
8
:
9
architecture... begin...
10
11
      data_out <= tmp_ram(to_integer(unsigned(address)));
12
13
end architecture...;
14
--end memory

von christian (Gast)


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

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


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

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.