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