Hallo
Ich habe mit dem „IP CORE Generator & Architecture Wizard“, speziell mit
dem „Fifo Generator 8.2“ der „ISE 13.2“ von Xilinx, einen FIFO für einen
Spartan3 FPGA erzeugt. Der FIFO hat unabhängige lese und schreib Clocks
eine eingangsbreite von 32Bit und am Ausgang 16Bit. Die Option
First-Word Fall-Through habe ich aktiviert, ansonsten wurde mit Fifo mit
Standard Einstellungen generiert.
Das Lesen und schreiben funktioniert soweit auch, über die Enable
Eingänge. Mein Problem ist, dass der FIFO nach dem einschalten nicht
leer ist sondern beim einschalten mit Default-Werten (bzw. mit dem
Initialisiertn Wert der Übergabevariablen) vollständig gefüllt wird. Ich
frage mich nun ob das ein normales verhalten ist, ob das ein
Programmierfehler von mir sein kann oder ob es irgendwo einen Schalter
gibt um einen lehren FIFO nach dem Programmhochladen zu haben.
Ich beschäftige mich noch nicht lange mit FPGAs, genaugenommen ist es
mein erstes VHDL Projekt. Ich bin daher für alle konstruktiven
Vorschläge und Ideen dankbar. Wahrscheinlich ist mein Problem trivial
aber es ist auch schon späht und kann meinen Denkfehler einfach nicht
finden.
Ein FIFO-RESET vor meinem Programmstart hilft seltsamerweise auch nicht.
Danke
Mit diesem Prozess schreibe ich in FIFO:
(zum testen werden Werte von 0 bis 655359 in den FIFO geschrieben, wenn
die Messung über den externen Pin START angefordert wurde. Nach dem
auslesen der Daten hab ich dann aber abhängig von der FIFO Größe 0-Werte
vor der eigentlichen Messung)
1 | DATA_recording: process (CLK0, RESET, START)
|
2 | begin
|
3 | -- reset
|
4 | if RESET = '1'
|
5 | then
|
6 | MESS_RUN_FLAG <= '0';
|
7 | FIFO_WRITE_EN <= '0';
|
8 |
|
9 | elsif START = '1'
|
10 | then
|
11 | GEN_CNT <= ( others => '0' );
|
12 | INT_CNT <= ( others => '0' );
|
13 | MESS_RUN_FLAG <= '1';
|
14 | FIFO_WRITE_EN <= '1';
|
15 |
|
16 | -- CLK0
|
17 | elsif rising_edge(CLK0)
|
18 | then
|
19 | -- Write
|
20 | if FIFO_FULL = '0' and MESS_RUN_FLAG = '1' then
|
21 | GEN_CNT <= GEN_CNT + '1';
|
22 |
|
23 | if INT_CNT >= conv_std_logic_vector(655359,20) then
|
24 | FIFO_WRITE_EN <= '0';
|
25 | MESS_RUN_FLAG <= '0'; -- close measurement
|
26 | else
|
27 | INT_CNT <= INT_CNT + '1'; -- measurement counter
|
28 | end if;
|
29 |
|
30 | end if;
|
31 |
|
32 | end if;
|
33 | end process DATA_recording;
|