Hallo, habe VHDL Code geschrieben, mit dem ich die Register der CF Karte auslesen möchte. Die Karte habe ich im True IDE Mode angeschlossen und der Takt ist 100 Mhz. Leider funktioniert das auslesen der Register nicht. Wo liegt der Fehler? Danke für die Hilfe. -- -- Entity Status auslesen -- -- 03.04.2007 -- -- LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ein_aus IS PORT ( CLK, RESET : IN STD_LOGIC; IORD ,IOWR,rest : OUT STD_LOGIC; A : OUT std_logic_vector (2 downto 0); CS : OUT std_logic_vector (1 downto 0); LED : OUT std_logic_vector (7 downto 0); SiebenSegment : OUT std_logic_vector (7 downto 0); DatenCFCard : INOut std_logic_vector (7 downto 0); a10,a9,a8,a7,a6,a5,a4,a3,ata,csel,we,reg :out std_logic ); END ein_aus; ARCHITECTURE Verhalten OF ein_aus IS type zustand is (Z0, Z1,Z2, Z3); SIGNAL Akt_Zustand, Naechster_Zustand : zustand; Signal takt : std_logic; Signal hilf : natural; Begin a10<='0'; a9<='0'; a8<='0'; a7<='0'; a6<='0'; a5<='0'; a4<='0'; a3<='0'; ata<='0'; csel <='0'; we <= '1'; reg<='1'; rest<='1'; -- Takthilfe Th: process (CLK,reset) begin if RESET = '0' then hilf <=0; elsif CLK = '1' and CLK'event then hilf <= hilf +1; if hilf =50000000 then takt <= '1'; elsif hilf = 100000000 then hilf <= 0; takt <= '0'; end if; end if; end process th; -- Zustandspeicher Zs: process (CLK, RESET) begin if RESET = '0' then Akt_Zustand <= Z0; elsif CLK = '1' and CLK'event then Akt_Zustand <= Naechster_Zustand; end if; end process Zs; -- Eingangskombinatorik Ek: process (takt, Akt_Zustand) begin case Akt_Zustand is when Z0 => if takt = '1' then Naechster_Zustand <= Z1; else Naechster_Zustand <= Z0; end if; when Z1 => if takt = '0' then Naechster_Zustand <= Z2; else Naechster_Zustand <= Z1; end if; when Z2 => if takt = '1' then Naechster_Zustand <= Z3; else Naechster_Zustand <= Z2; end if; when Z3 => if takt = '0' then Naechster_Zustand <= Z3; else Naechster_Zustand <= Z3; end if; end case; end process Ek; SiebenSegment <= DatenCFCard; -- Ausgangskombinatorik AK: process (Akt_Zustand) begin if Akt_Zustand = Z0 then -- inaktiver Zustand IORD <= '1'; LED <= "00000001"; CS <= "11"; A <= "001"; --SiebenSegment <= DatenCFCard; elsif Akt_Zustand = Z1 then -- gewünschtes Register adressieren IORD <= '1'; LED <= "00000010"; CS <= "01"; A <= "110"; elsif Akt_Zustand = Z2 then -- Lesefreigabe IORD <= '0'; LED <= "00000100"; elsif Akt_Zustand = Z3 then -- Daten bereit IORD <= '1'; LED <= "00001000"; end if; end process AK; END Verhalten;
@ hi >habe VHDL Code geschrieben, mit dem ich die Register der CF Karte >auslesen möchte. Die Karte habe ich im True IDE Mode angeschlossen und >der Takt ist 100 Mhz. Leider funktioniert das auslesen der Register >nicht. Wo liegt der Fehler? Das ist wie immer die grosse Frage. ;-) Warum bäckst du für den Anfang nicht ein paar kleinere Brötchen und taktest das Ganze mal mit 1 MHz? Bei 100 Mhz muss man schon SEHR genau wissen was man tut. Dann kannst du dir das mit dem Oszi anschauen. Noch ein Tip. Deine Steuersignale IORD, IOWR, CS sollten NICHT kombinatorisch erzeugt werden sondern direkt aus einem FlipFlop gespeist werden. Stichwort Glitch. MFG Falk
@ falk Habe den Takt Process TH (siehe VHDL Code oben) verlangsamt. Kann man einen Glitch auf dem Oszi sehen? Habe jetzt auch mal in Quartus eine Simulation durchgeführt. Es wurden über 1000 Glitches gefunden. In der Simulation werden IORD und die Adressen und CS aber zum richtigen Zeitpunkt gesetzt. Können die Glitches trotzdem schuld an dem Problem mit dem auslesen der Register sein? Wie wahrscheinlich ist das? Danke Mathias
@ hi >Habe den Takt Process TH (siehe VHDL Code oben) verlangsamt. Das klingt nur bedingt gut. Taktverteilung ist ein zentrales Thema und wird immer wieder gern falsch gemacht. >Kann man einen Glitch auf dem Oszi sehen? Wenn du weisst wie man SEHR schnelle Signale misst und ein SEHR schnelles Oszi hast. http://www.geocities.com/jacquesmartini/digital/glitch/glitch.html Aber man sollte, nein MUSS! sowas von vornherein verhindern, durch die richtige Designmethode. >Habe jetzt auch mal in Quartus eine Simulation durchgeführt. Es wurden >über 1000 Glitches gefunden. In der Simulation werden IORD und die Aha. >Adressen und CS aber zum richtigen Zeitpunkt gesetzt. Das ist dann fast egal. Durch die Glitches "sieht" das IDE Interface mehrer Taktflanken und verschluckt sich. >Können die Glitches trotzdem schuld an dem Problem mit dem auslesen der >Register sein? Ja. >Wie wahrscheinlich ist das? Sehr.
@ Falk Es funktioniert immer noch nicht richtig. Ich möchte einfach die Register einer CF Karte auslesen. Dazu habe ich die Signale A10...A3, Ata Sel, Csel auf Gnd gelegt. DMACK(Reg), Reset und IOWR liegen auf VCC. Jetzt müsste die Karte doch im True IDE Mode arbeiten, oder habe ich ein Signal vergessen? D0..D7 habe ich auf externe LED's gelegt. Takt ist im Moment 1Hz. Diesen Takt erzeuge ich mit dem Process TH (Signalteiler). - Im Zustand Z0 befinde ich mich im Standby Mode. (Cs1= 1 und CS0 = 1). - Im Zustand Z1 schalte ich die gewünschte Adresse auf die CF Karte (hier möchte ich das Error Register lesen) - Im Zustand Z2 schalte ich das IORD=0 - Im Zustand Z3 schalte ich das IORD=1 Wenn ich diesen Code auf das Board lade, ist im Zusand Z1 das Error Bit 0 auf 1 gesetzt. Dieses Bit bleibt auch im Zustand Z2 und Z3 gesetzt. Warum ist dieses Bit schon gesetzt, obwohl ich noch gar keine Lesefreigabe erteilt habe? (erkenne den Zustand der Bits durch die Leds) Habe ich immer noch ein Glitch Problem? Wenn ich mit dem Code das Status Register adressiere, sind Bit 4 und Bit 6 ab Zustand Z1 gesetzt. Das Alternate Register kann ich kann nicht adressieren. Was könnte der Grund sein? Die Compact Flash Karte ist von Scandisk (32MB). VHDL Code: -- -- Entity Status auslesen -- -- 03.04.2007 -- -- LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ein_aus IS PORT ( CLK, RESET : IN STD_LOGIC; IOWR,rest : OUT STD_LOGIC; A : OUT std_logic_vector (2 downto 0); CS : OUT std_logic_vector (1 downto 0); LED : OUT std_logic_vector (7 downto 0); SiebenSegment : OUT std_logic_vector (7 downto 0); DatenCFCard : INOut std_logic_vector (15 downto 0); iord : out std_logic; a10,a9,a8,a7,a6,a5,a4,a3,ata,csel,we,reg :out std_logic ); END ein_aus; ARCHITECTURE Verhalten OF ein_aus IS type zustand is (Z0, Z1,Z2, Z3); SIGNAL Akt_Zustand, Naechster_Zustand : zustand; Signal count : natural; Signal takt :std_logic; Begin -- Signale entsprechend True IDE gesetzt a10<='0'; a9<='0'; a8<='0'; a7<='0'; a6<='0'; a5<='0'; a4<='0'; a3<='0'; ata<='0'; csel <='0'; we <= '1'; reg<='1'; rest<='1'; IOWR <='1'; -- Signalteiler um 100 MHz Takt zu verlangsammen Th: process (CLK,reset) begin if RESET = '0' then count <= 0; takt <= '0'; else if CLK = '1' and CLK'event then if count < 100000000 then count <= count +1; if count < 50000000 then takt <= '1'; else takt <='0'; end if; else count <= 0; end if; end if; end if; end process th; -- Zustandspeicher (springt mit steigender Taktflanke in den nächsten Zustand) Zs: process (takt, RESET) begin if RESET = '0' then Akt_Zustand <= Z0; elsif takt = '1' and takt'event then Akt_Zustand <= Naechster_Zustand; end if; end process Zs; -- Eingangskombinatorik (schaltet auf den nächsten Zustand) Ek: process (Akt_Zustand) begin case Akt_Zustand is when Z0 => Naechster_Zustand <= Z1; when Z1 => Naechster_Zustand <= Z2; when Z2 => Naechster_Zustand <= Z3; when Z3 => Naechster_Zustand <= Z0; end case; end process Ek; -- Legt Datenleitung Bit 0 .. Bit 7 auf die LED des Boards led <= DatenCFCard(7 downto 0); -- Ausgangskombinatorik (schaltet entprechen Zustand die Ausgänge) AK: process (takt) begin if clk = '0' and clk'event then if Akt_Zustand = Z0 then -- inaktiver Zustand IORD <= '1'; SiebenSegment <= "11000000"; CS <= "11"; A <= "001"; elsif Akt_Zustand = Z1 then -- gewünschtes Register adressieren (im Moment Error Register) SiebenSegment <= "11111001"; CS <= "10"; A <= "001"; elsif Akt_Zustand = Z2 then -- Lesefreigabe erteilen SiebenSegment <= "10100100"; IORD<='0'; elsif Akt_Zustand = Z3 then -- Lesefreigabe rücksetzen IORD<='1'; SiebenSegment <= "10110000"; end if; end if; end process AK; END Verhalten;
@ hi >Dazu habe ich die Signale A10...A3, Ata Sel, Csel auf Gnd gelegt. >DMACK(Reg), Reset und IOWR liegen auf VCC. Jetzt müsste die Karte doch >im True IDE Mode arbeiten, oder habe ich ein Signal vergessen? Keine Ahnung, so sehr kenn ich mich mit den Details von CompactFlash nicht aus. >Habe ich immer noch ein Glitch Problem? Keine Ahnung. >Das Alternate Register kann ich kann nicht adressieren. >Was könnte der Grund sein? Dito. -- Ausgangskombinatorik (schaltet entprechen Zustand die Ausgänge) AK: process (takt) begin if clk = '0' and clk'event then Hier steckt ein kleiner Fehler. Das müsste sicher heissen if takt='0' and takt'event then Tut mit leid dass ich dir nicht wirkliche Tips geben kann. MFG Falk
> Dazu habe ich die Signale A10...A3, Ata Sel, Csel auf Gnd gelegt. > DMACK(Reg), Reset und IOWR liegen auf VCC. Jetzt müsste die Karte doch > im True IDE Mode arbeiten, oder habe ich ein Signal vergessen? Das Problem ist eher dass der Mode beim Powerup der Karte gesetzt wird. Da nuetzt es dir nichts wenn dein FPGA versucht den Mode zu setzen ausser du legst danach die Spannung an die Karte - das ist in deinem Code jedoch nicht ersichtlich. Auch Hotplug wenn dein FPGA Image laeuft nutzt nichts, da die Karte SPannung kriegt, bevor die anderen Signale anliegen. Du musst also dein Board design ueberpruefen, oder halt den PCMCIA mode nehmen. Falls du dir sicher bist, dass der wechsel in den True-IDE mode klappen sollte, dann probiers mit einer anderen CF Karte. Zudem ist dein Prinzip vom Takten deiner CF Statemachine crap! Nimm den Takt welcher auch der rest deines designs braucht und implementiere konfigurierbare waitstates. Cheers, Roger
@ roger Habe nun versucht die Register in PC Memory Mode auszulesen. Das hat soweit funkioniert. Warum funktioniert True Ide nicht, wenn man den Ata Sel auf GND legt? Kannst du mir die Unterschiede von PC Memory Mode, True Ide, PC I/O Mode erklären? Welcher der drei ist am besten geeignet um mit einem FPGA Daten auszulesen? Kannst du mir das mit den waitstates noch ein bisschen genauer erklären? Bin nämlich Anfänger im VHDL programmieren. Warum ist mein Taktteiler Schrott? Danke.
> Habe nun versucht die Register in PC Memory Mode auszulesen. Das hat > soweit funkioniert. > Warum funktioniert True Ide nicht, wenn man den Ata Sel auf GND legt? wie schon vorher geschrieben muessen die Signale fuer den True IDE mode select schon anliegen bevor! du die Spannung an die CF Karte anlegst. Hast du das auch gemacht? Ums vorweg zu nehmen, True IDE mode und Karte im Betrieb reinstecken funktioniert nur dann wenn die Karte in einen 'kalten' Slot gesteckt wird. Also Spannung applizieren wenn die Karte schoen im Slot sitzt. > Kannst du mir die Unterschiede von PC Memory Mode, True Ide, PC I/O Mode > erklären? Steht in der CF Spec! Kurz: In den beiden PC Modes verhaelt sich die CF Karte wie eine PCMCIA Karte, schlussendlich hast du auch dort ein IDE interface du kannst einfach waehlen obs in den Memory oder I/O space gemappt wird. Im True IDE mode ist das interface eben IDE, wie eine PATA Harddisk, somit auch einfach an einen PATA bus eines alten PC's anzuklemmen. > Welcher der drei ist am besten geeignet um mit einem FPGA Daten > auszulesen? True IDE. > Kannst du mir das mit den waitstates noch ein bisschen genauer erklären? Naja, du verweilst halt solange im Lesefreigabe state bis ein waitstate counter abgelaufen ist. > Bin nämlich Anfänger im VHDL programmieren. Warum ist mein Taktteiler > Schrott? Als Anfaenger bleib vorerst bei einem clock fuer dein design und wenn du deine statemachine drosseln must, nimm clock enables. Cheers, Roger
@ Roger Warum ist True Ide am besten zum auslesen geeignet?
> Warum ist True Ide am besten zum auslesen geeignet? Ich praezisiere "... am besten geeignet um mit einem FPGA Daten auszulesen" Weil dann sparst du dir das parsen der Attribute und konfiguration der Karte. Der FPGA kann somit gleich mit IDE loslegen. Falls du jedoch noch Software in deinem Projekt am laufen hast, dann wuerde ich einen der anderen Modi bevorzugen. Man kann natuerlich das PCMCIA Brimborium auch in VHDL machen, aber die Zeit dies dazu braucht kann man in nuetzlichere Dinge stecken. Cheers, Roger
@ Roger Ich habe noch einige Fragen: PC Memory Mode: Was muss ich beim Spannung einschalten beachten? Was muss ich beachten wenn ich einen Hardware Reset mache? Was muss ich in den Attribute Register ändern? Was muss ich konfigurieren? Danke
> Ich habe noch einige Fragen: > > PC Memory Mode: > [snip] http://www.compactflash.org/ http://www.pcmcia.org/pccard.htm http://www.pcmcia.org/book-sapcm.htm Cheers, Roger
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.