Hallo.
Ich bin VHDL-Neuling und habe zwei Probleme beim unten stehenden
Automaten. Ich nutze folgenden Baustein: Xilinx XC9572XL.
1. Kommen mehrere Warnungen darüber, dass ich Latches eingebaut habe:
Found 8-bit latch for signal <data_to_CPLD>. Latches may be generated
from incomplete case or if statements. We do not recommend the use of
latches in FPGA/CPLD designs, as they may lead to timing problems.
Bei dem ersten Problem weiß ich nicht ob das wirklich zum nicht
Funktionieren meines Automaten führt oder ob der Fehler woanders liegt.
2.Zum Testen habe ich einen Ausgang angelegt (test_data_out) und auf
LEDs gelegt. Nur leider scheint noch irgendwtwas nicht zu funktionieren,
denn Ich sehe nicht die gewünschten Bytes die ich generiere.
Meine Frage nun also: Wenn ihr euch den Automaten anschaut, seht ihr
irgendwelche groben Fehler?
Wie ihr seht habe ich den Ablauf in 2 Prozesse geteilt, wovon einer
nicht taktflankengesteuert ist aber laut einigen Quellen soll das
trotzdem gehen.
Ich würde mich sehr über Antworten von euch freuen, weil ich grad
absolut nicht drauf komm, was da schiefläuft.
MfG Laura
1
LIBRARYieee;
2
USEieee.std_logic_1164.all;
3
4
ENTITYusb_automatIS
5
PORT(
6
clk:INSTD_LOGIC;
7
reset:INSTD_LOGIC;
8
RXF:INSTD_LOGIC;--RXF low: at least 1 byte in recieve buffer
Lst schrieb:> PROCESS (clk,next_state,reg_WR,reg_RD, data_to_CPLD, data_to_PC, data)> BEGIN> IF rising_edge(clk) THEN
Dieser Prozess ist nur auf clk sensitiv. Deshalb muss auch nur clk
in die Liste...
Lst schrieb:> WHEN OTHERS =>> reg_WR <= 'X';> reg_RD <= 'X';> report "Reach undefined state";
Unnötig. Weil du alle definierten Zustände verwendet hast, kann dieser
Zustand NIEMALS erreicht werden.
> reg_WR <= '0'; -- ist das gut? Fallende Flanke wird produziert
Warum wird hier eine fallende Flanke produziert?
> Found 8-bit latch for signal <data_to_CPLD>.
Das ist klar, denn da wird in einem nicht getakteten Prozess was
gespeichert:
WHEN toCPLD1 =>
data_to_CPLD <= data;
> Meine Frage nun also: Wenn ihr euch den Automaten anschaut, seht ihr> irgendwelche groben Fehler?
Ausser den gemeldeten Latches nicht. Allerdings deuten Latches, die du
nicht UNBEDINGT WILLST, gern auf eine Designschäche. Und zwar nicht
wegen des VHDL-Codes, sondern wegen der zugrundeliegenden Überlegungen.
Ich würde dir raten:
Mach einfach mal eine Simulation. Das ist eine schöne übersichtliche
FSM, also das ideale Beispiel, mal mit einer Simulation anzufangen.
OT: warum schreibst du deine Kommentare nicht einfach auf Deutsch in den
Code?
BTW:
> RD : OUT STD_LOGIC; --When pulled low, RD# takes
Wenn ein Signal LOW-aktiv ist, dann solltest du dieses Signal auch so
benennen. Hier würde sich nRD oder RDn anbieten...
Lothar Miller schrieb:> Dieser Prozess ist nur auf clk sensitiv. Deshalb muss auch nur clk> in die Liste...
Jo stimmt, die anderen kann man rausnehmen. Mach ich auch gleich mal
>> reg_WR <= '0'; -- ist das gut? Fallende Flanke wird produziert> Warum wird hier eine fallende Flanke produziert?
Das bezieht sich auf den FTDI, der da später mal dranhängen soll
(http://www.ftdichip.com/Support/Documents/DataSheets/DLP/dlp-usb245mv15.pdf).
Dieses Kommentar hatte ich nicht speziell für diesen Forenbeitrag
geschireben. Ich bin mir an der Stelle unsicher ob, wenn ich die
Ausgänge an dieser Stelle low schalte ob dann nicht der FTDI in dem
moment reagiert (sind ja Handshake-Signale) und Daten anlegt, die ich in
dem moment verpasse.
>>> Found 8-bit latch for signal <data_to_CPLD>.> Das ist klar, denn da wird in einem nicht getakteten Prozess was> gespeichert:> WHEN toCPLD1 =>> data_to_CPLD <= data;>
Das ist ja interessant, daran liegt das also. Danke!
Wenn ich den Process taktgesteuert mache brauche ich mehr Macrozellen,
deshalb war ich ganz froh, dass es auch so gehen soll. Meinst du ich
sollte da doch nochmal drüber nachdenken an der Process-Struktur was zu
ändern (z.B. den zweiten Process auch taktgesteuert machen)?
> Ich würde dir raten:> Mach einfach mal eine Simulation. Das ist eine schöne übersichtliche> FSM, also das ideale Beispiel, mal mit einer Simulation anzufangen.
Mach ich.
> OT: warum schreibst du deine Kommentare nicht einfach auf Deutsch in den> Code?
Keine Ahnung. Dachte das ist besser so :). Ich geb den Signalen auch
keine deutschen Namen. Man weiß ja nie ob man den Code z.B. mal in einem
englischsprachigem Forum hochlädt.Zudem ich hab auch englischsprachige
Mitarbeiter.
> BTW:>> RD : OUT STD_LOGIC; --When pulled low, RD# takes> Wenn ein Signal LOW-aktiv ist, dann solltest du dieses Signal auch so> benennen. Hier würde sich nRD oder RDn anbieten...
Gut zu wissen.
Vielen Dank auch für deine schnelle Antwort. Ich mache mich jetzt ans
simulieren.
Bei der Simulation hab ich festgestellt:
test_data_out <= data_toCPLD <= "00001010" (Verbingundgsschema, kein
VDHL-Code)
führt zum gewünschten Ergebnis, also dass in test_data_out mit der
nächsten Taktflankte "00001010" steht.
Während
test_data_out <= data_toCPLD <= data <= "00001010"
dazu führt dass in test_data_out unknown (xxxxxxxx) steht. Und auch in
data~result.
Jetzt bin ich am überlegen ob ich den inout port überhaupt richtig
verwende.
Eigentlich muss ich bei CLPDs die Treiber doch nicht selber steuern wie
bei einem Mikroprozessor die DDRs oder?
Momentan mach ich damit ja dies:
1
-- in der Entity:
2
data:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);
3
4
-- architecture:
5
SIGNALdata_to_PC:STD_LOGIC_VECTOR(7DOWNTO0);-- Daten, die über bidirektionalen Port an PC geschickt werden
6
SIGNALdata_to_CPLD:STD_LOGIC_VECTOR(7DOWNTO0):="00000000";-- daten die vom PC in den CPLD geschrieben werden
7
8
--im getakteten Prozess:
9
test_data_out<=data_to_CPLD;
10
11
-- Zustand in dem Daten vom inout Port entgegengenommen werden:
12
WHENtoCPLD1=>
13
data_to_CPLD<=data;
14
next_state<=toCPLD2;
15
-- Zustand in dem Daten an den inout Port gelegt werden:
Lst schrieb:> Eigentlich muss ich bei CLPDs die Treiber doch nicht selber steuern wie> bei einem Mikroprozessor die DDRs oder?
Oh doch. Du mußt die Tristate-Treiber aktiv in den hochohmigen Zustand
schalten.
Wenn das RDn- und das WRn-Signal von aussen kommen, sieht das etwa so
aus:
Oh man, das hat ich doch eigentlich auch so geplant...wieso habe ich das
wieder ruasgeworfen?
Naja, ich probiers gleich mal aus. Danke nochmal für deine Hilfe!