Forum: FPGA, VHDL & Co. Programmprobleme Register CF Karte auslesen


von hi (Gast)


Lesenswert?

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;

von Falk B. (falk)


Lesenswert?

@ 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

von hi (Gast)


Lesenswert?

@ 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

von Falk B. (falk)


Lesenswert?

@ 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.


von hi (Gast)


Lesenswert?

@ 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;

von Falk B. (falk)


Lesenswert?

@ 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

von Roger S. (edge)


Lesenswert?

> 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

von Hi (Gast)


Lesenswert?

@ 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.

von Roger S. (edge)


Lesenswert?

> 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


von Hi (Gast)


Lesenswert?

@ Roger
Warum ist True Ide am besten zum auslesen geeignet?

von Roger S. (edge)


Lesenswert?

> 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

von Hi (Gast)


Lesenswert?

@ 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

von Roger S. (edge)


Lesenswert?

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