Forum: FPGA, VHDL & Co. If Anweisung - Sram Problem


von Alex F. (alex86)


Angehängte Dateien:

Lesenswert?

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
case we_oe_change is
2
  
3
  when "000" =>           
4
    if write_counter < "00001100" then
5
      write_counter <= write_counter + 1;  
6
      sram_data_led <= "00000";          
7
    else
8
      we_oe_change <= "011";
9
    end if;
10
    
11
  when  "001" =>
12
    sram_data_led <= "01010";
13
    
14
  when others =>
15
    sram_data_led <= "01110";  
16
  
17
end case;
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

von Mathi (Gast)


Lesenswert?

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 Morin (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Morin (Gast)


Lesenswert?

Okay danke! Hätte mir ja denken können, dass es einen Artikel darüber 
gibt...

von Alex F. (alex86)


Angehängte Dateien:

Lesenswert?

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

von Mathi (Gast)


Lesenswert?

Welchen Wert hat we_oe_change am Anfang?

Poste wirklich mal mehr Quellcode. So sind die Zusammenhänge nicht 
erkennbar.

von Roger S. (edge)


Lesenswert?

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

von Alex F. (alex86)


Lesenswert?

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.

von Roger S. (edge)


Lesenswert?

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

von Mathi (Gast)


Lesenswert?

Dann kann es nicht richtig funktionieren. Du hast keine Initialwerte für 
Deine Signale.
Füge dem Modul einen Reset hinzu.
1
entity sram_modul is
2
  port(
3
      clk : in std_logic;
4
                        Reset: in std_logic;
5
      clk_led: out std_logic;      
6
      
7
      sram_data_led : out std_logic_vector(0 to 4)
8
            
9
     );
10
end sram_modul;

Benutze den Reset um den internen Signalen Werte zuzuweisen.
1
process(Reset, clk)
2
begin
3
        if Reset = '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
  elsif rising_edge(clk) then
10
            sig_clk_led  <= not sig_clk_led;
11
12
            case we_oe_change is
13
                 when "000" =>           
14
                      if write_counter < 6 then  
15
                             write_counter <= write_counter + 1;
16
                             sram_data_led <= "00000";  
17
                      else
18
                             we_oe_change <= "011";
19
                      end if;
20
          
21
                 when  "001" =>
22
                      sram_data_led <= "01010";
23
          
24
                 when others =>
25
                      sram_data_led <= "01110";  
26
        
27
            end case;
28
      
29
         end if;
30
end process;

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

von Mathi (Gast)


Lesenswert?

Roger hat übrigens recht ;)

von Alex F. (alex86)


Lesenswert?

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

von Mathi (Gast)


Lesenswert?

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
entity sram_cntrl is
2
port( clk: IN std_logic;
3
      Reset: IN std_logic;
4
      CS: OUT std_logic;
5
      read_not_write: OUT std_logic;
6
      Data_bus: INOUT std_logic_vector(7 downto 0)
7
     );
8
end entity sram_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
type sram_cntrl_type is (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

von Alex F. (alex86)


Lesenswert?

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

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.