FJ S. schrieb:
> Hat jemand vielleicht eine Idee wo der Fehler liegt?
Dein erster Fehler ist, ein VHDL-File von 10kB rar-komprimiert
hochzuladen. Wenn man dir helfen will, muss man erst runterladen und
entpacken, bevor man den Code tatsächlich sieht ;-)
Was das Latch angeht:
in folgendem Teil setzt du FMC in zwei Fällen entweder auf 0 (im elsif)
oder auf Z (im else). Aber in der ersten if-Abfrage machst du keine
Zuweisung an FMC (sollte auf Z gehen). Also muss sich in diesem Fall der
Wert von FMC "gemerkt" werden. Und weil dieses merken nicht in einem
getakteten Prozess abläuft, findet es nicht in einem Flip-Flop statt
sondern in einem Latch.
1 | -- if µC wants to write data, write from FMC to FMC_in
|
2 | if ( FMC_WR = '0' and FMC_RD = '1' )then
|
3 | FMC_in <= FMC;
|
4 | -- if µC wants to read data, write from FMC_out to FMC
|
5 | elsif ( FMC_WR = '1' and FMC_RD = '0' )then
|
6 | FMC <= FMC_out;
|
7 | FMC_in <= (others => '0');
|
8 | else
|
9 | FMC_in <= (others => '0');
|
10 | FMC <= (others => 'Z');
|
11 | end if;
|
Also: wenn du es wirklich unbedingt ohne Takt machen willst, dann muss
auch im ersten Teil eine Zuweisung an FMC rein (FMC<= (others => 'Z'))
Auch bei der Flankendetektion hast du noch Probleme. Deine eigentliche
Flankendetektion nach Lothars Vorlage ist schon mal ganz gut:
1 | EdgeDetection : process
|
2 | variable Shiftreg : std_logic_vector (1 downto 0) := "00";
|
3 | begin
|
4 | wait until rising_edge(clk_read);
|
5 | Rise <= not shiftreg(1) and shiftreg(0); -- detect edge
|
6 | --Fall <= not shiftreg(0) and shiftreg(1);
|
7 | Shiftreg := Shiftreg(0) & not WR; -- read input shift register
|
8 | end process EdgeDetection;
|
Aber dann benutzt du in einem anderen Prozess Rise als Takt, und das ist
Quatsch: Rise ist ein normales Signal, dessen Pegel du abfrägst. Es geht
bei einer Flanke von WR genau für einen Takt (von clk_read) auf high.
Also nutze in ReadCheck_func ebenfalls clk_read als Takt und bau dann
eine Abfrage "if Rise='1' then..." ein.