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
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
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.