Hallo zusammen,
ich habe ein wahrscheinlich typisches Anfängerproblem. Ich habe schon
alles versucht, komme aber nicht weiter.
Ich möchte ein Sram ansteuern, habe aber Probleme bei einer If-Schleife.
Mein Code ist bis auf die Ursache stark reduziert.
Mein Problem:
Gleich zu Beginn arbeitet mein GPLD(XC9572) den "else"- Teil ab, obwohl
der write_counter noch kleiner 12 ist. Wenn ich die ganze "Case"-Sache
weg lasse, dann funktioniert es wieder.
1
casewe_oe_changeis
2
3
when"000"=>
4
ifwrite_counter<"00001100"then
5
write_counter<=write_counter+1;
6
sram_data_led<="00000";
7
else
8
we_oe_change<="011";
9
endif;
10
11
when"001"=>
12
sram_data_led<="01010";
13
14
whenothers=>
15
sram_data_led<="01110";
16
17
endcase;
Ich hoffe mir kann kurz einer einen Typ geben, da ich sonst noch
verzweifle. Der komplette Code im Anhang.
Schon mal danke im vorraus.
Gruss
Alex
Zunächst einmal benutzt Du unschöne Bibliotheken. Von std_logic_arith
und std_logic_unsigned sollte man die Finger lassen. Benutze an deren
Stelle die numeric_std. Dann mach aus write_counter einen unsigned.
Des weiteren musst Du schon mehr vom Quellcode angeben.
Auch sollte clk_led kein INOUT sein. Sicher soll es nicht gelesen
werden. Ein Out und ein internes Signal genügen da.
> Von std_logic_arith und std_logic_unsigned sollte man die Finger lassen.
Könntest du das näher ausführen? Beim Xilinx ISE werden Imports für
dieses Paket automatisch eingefügt, und ich hatte bis jetzt keine
Probleme damit. Welche Probleme können auftreten, und was sollte man
alternativ benutzen um diese zu lösen?
Erst einmal vielen Dank, dass Ihr mir geholfen habt!
Ich bin leider heute erst dazu gekommen meinen Code zu überarbeiten.
Habe alles so gut es geht umgesetzt, jedoch funktioniert es noch immer
nicht.
Noch immer springt der CPLD zuerst in den "Else"-Teil (Sichtbar anhand
der LEDs).
Ich bin mit meinem Anfänger- VHDL am Ende. Es wäre super, wenn ihr mir
nochmal helfen könntet.
Der komplette Code habe ich mit angehängt.
Gruss
Alex
Alex F. wrote:
> Noch immer springt der CPLD zuerst in den "Else"-Teil (Sichtbar anhand> der LEDs).
welchen else Teil? Und sonst tut sich was?
Bei dem Konstrukt steht es der Synthese frei sram_data_led fest auf
"01110" zu verdrahten.
> Der komplette Code habe ich mit angehängt.
Nicht wirklich oder? Wenn du das mal durch ModelSim jagst, dann wirst du
sehen was dein Problem ist -> Deine Signale sind uninitialisiert, somit
hat die Synthese Spielraum diese festzulegen um die kompakteste Logik zu
erzeugen.
Cheers, Roger
Hi Mathi,
ich habe dir meinen ganzen Code geschickt. Aus mehr besteht er nicht.
Im endeffekt will ich nur eine gewisse Anzahl von Zyklen ( in when "000"
) durchlaufen, danach soll der CPLD dann zu - when "011" - springen.
Aus irgendeinem Grund springt er aber, obwohl write_counter < 6 ist, in
den "Else Teil" und setzt somit we_oe_change auf "011" .
Außerdem kommen auch diese Warnungen:
WARNING:Xst:646 - Signal <write_counter> is assigned but never used.
WARNING:Cpld:310 - Cannot apply TIMESPEC TS1000 =
PERIOD:PERIOD_clk:0.000 nS
WARNING:Cpld:2 - Cannot apply TIMESPEC AUTO_TS_F2F =
ob man die vernachlässigen kann, weiss ich nicht.
Alex F. wrote:
> Aus irgendeinem Grund springt er aber, obwohl write_counter < 6 ist, in> den "Else Teil" und setzt somit we_oe_change auf "011" .
das ist deine Vermutung, weil du
1
sram_data_led<="00000";
nicht siehst sondern direkt
1
sram_data_led<="01110";
weil es deine Konstrukte in
1
when"000"=>
2
when"001"=>
nicht in die Hardware geschafft haben -> es gibt da keinen Else Teil.
> WARNING:Xst:646 - Signal <write_counter> is assigned but never used.> ob man die vernachlässigen kann, weiss ich nicht.
alle Logik die mit write_counter zu tun hat wurde wegoptimiert.
Cheers, Roger
Dann kann es nicht richtig funktionieren. Du hast keine Initialwerte für
Deine Signale.
Füge dem Modul einen Reset hinzu.
1
entitysram_modulis
2
port(
3
clk:instd_logic;
4
Reset:instd_logic;
5
clk_led:outstd_logic;
6
7
sram_data_led:outstd_logic_vector(0to4)
8
9
);
10
endsram_modul;
Benutze den Reset um den internen Signalen Werte zuzuweisen.
1
process(Reset,clk)
2
begin
3
ifReset='1'then
4
we_oe_change<="000";
5
sig_clk_led<='0';--mit initialisierung kannst Du jetzt
6
--das notverwenden
7
write_counter<=(others=>'0');--alle bits 0
8
sram_data_led<=(others=>'0');
9
elsifrising_edge(clk)then
10
sig_clk_led<=notsig_clk_led;
11
12
casewe_oe_changeis
13
when"000"=>
14
ifwrite_counter<6then
15
write_counter<=write_counter+1;
16
sram_data_led<="00000";
17
else
18
we_oe_change<="011";
19
endif;
20
21
when"001"=>
22
sram_data_led<="01010";
23
24
whenothers=>
25
sram_data_led<="01110";
26
27
endcase;
28
29
endif;
30
endprocess;
Damit haben alle Signale einen Initialwert. Allerdings wird das so noch
nicht funktionieren. Erklär mal genauer den Sinn Deines Designs. Welche
Signale brauchst Du zur Ansteuerung des SRAM. Wozu dient sram_data_led?
Das case-Konstrukt soll eine Zustandsmaschine realisieren. Ist so aber
nicht wirklich korrekt. Sie würde im others-Teil hängen bleiben...
nochmals danke für Eure antworten.
Ich habe den Code umgeändert, aber so richtig funktionieren will er
nicht.
Mein Ziel: Einen SRAM anzusteuern. Hat auch bis jetzt gut funktioniert.
Mein erstes Programm hat solange auf den SRAM (mittels STATE MACHINE)
geschrieben, bis ich von außerhalb (also durch einen Schalter oder
sontiges) auf Lesen umgestellt habe. Dafür war immer we_oe_change
verantworlich (in).Es ging somit mehr oder weniger manuel.
Nun will ich eine gewisse Anzahl von Schreibzyklen automatisch laufen
lassen (State 1). Deshalb die IF-Konstruktion. Danach soll auf State 2
umgeschalten werden. In diesem Fall wollte ich irgendwelche Daten aus
dem SRAM lesen (vorerst mal solange bis der Stecker gezogen wird:) ).
Es geht also nur um den Wechsel zwischen Schreiben und Lesen und das
möchte ich mit dem "Case Konstrukt" machen.
Sram_data_led dient nur zur Ausgabe der Daten des Lesevorganges bzw.
Bestätigung, dass ich in die zweite Case-Bedingung komme.
Ich hoffe ich habe alles genau erklärt.
Tut mir leid, wenn ich mich nicht genau ausgedrückt habe. Bin aber nur
von einem kleinen Syntaxfehler ausgegangen.
Gruss
Alex
Muss Dir nix leid tun :) Das "Problem" ist das Du scheinbar keinen
genauen Entwurf gemacht hast.
Zum Beispiel hättest Du die Signale in der Port-Beschreibung einzeln
aufspalten können. Ich nehme mal an Dein SRAM hat ein
read-write-Eingang, ein Chipselect und einen bidirektionalen Datenbus.
Die könntest Du in die Portbeschreibung übernehmen.
1
entitysram_cntrlis
2
port(clk:INstd_logic;
3
Reset:INstd_logic;
4
CS:OUTstd_logic;
5
read_not_write:OUTstd_logic;
6
Data_bus:INOUTstd_logic_vector(7downto0)
7
);
8
endentitysram_cntrl;
Damit hättest Du alle Signale die für das sram wichtig sind.
Benutze am Besten für die State-machine einen eigenen Typ. Das macht es
besser lesbar.
1
typesram_cntrl_typeis(s_init,--einfach n Zustand für den Init
2
s_write,--hier werden dann die Wörter geschrieben,
3
s_read--die Wörter werden gelesen
4
);
In s_write würdest Du dann die Daten für das SRAM generieren und eine
Menge Daten schreiben. Wie Du es ja vor hast.
Mit welchem Takt arbeitest Du?
das sram_led steuert LEDs an?
Wenn Du interesse und Fragen hast, kann ich Dir mal ne pn schreiben und
meine icq-Nummer geben.
Gruß,
Mathi
Wenn Du mir Deine ICQ Nummer geben könntest, wäre das echt klasse und
natürlich einfacher.
Ich arbeite gerade mit einem langsamen Takt (ca. 14Hz), damit ich alles
genauer verfolgen kann. Der CPLD sitzt auf einem eigenem Board mit ein
paar LEDs. Sram_led steuert 8 LEDS an.
Gruss
Alex