mikrocontroller.net

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


Autor: Alex F. (alex86)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
case we_oe_change is
  
  when "000" =>           
    if write_counter < "00001100" then
      write_counter <= write_counter + 1;  
      sram_data_led <= "00000";          
    else
      we_oe_change <= "011";
    end if;
    
  when  "001" =>
    sram_data_led <= "01010";
    
  when others =>
    sram_data_led <= "01110";  
  
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

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Morin (Gast)
Datum:

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

Autor: Alex F. (alex86)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Wert hat we_oe_change am Anfang?

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

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex F. (alex86)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht 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
sram_data_led <= "00000";
nicht siehst sondern direkt
sram_data_led <= "01110";
weil es deine Konstrukte in
when "000" =>
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

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann kann es nicht richtig funktionieren. Du hast keine Initialwerte für 
Deine Signale.
Füge dem Modul einen Reset hinzu.
entity sram_modul is
  port(
      clk : in std_logic;
                        Reset: in std_logic;
      clk_led: out std_logic;      
      
      sram_data_led : out std_logic_vector(0 to 4)
            
     );
end sram_modul;

Benutze den Reset um den internen Signalen Werte zuzuweisen.
process(Reset, clk)
begin
        if Reset = '1' then
            we_oe_change <= "000";
            sig_clk_led <= '0'; --mit initialisierung kannst Du jetzt
                                --das notverwenden
            write_counter <= (others => '0'); --alle bits 0
            sram_data_led <= (others => '0');
  elsif rising_edge(clk) then
            sig_clk_led  <= not sig_clk_led;

            case we_oe_change is
                 when "000" =>           
                      if write_counter < 6 then  
                             write_counter <= write_counter + 1;
                             sram_data_led <= "00000";  
                      else
                             we_oe_change <= "011";
                      end if;
          
                 when  "001" =>
                      sram_data_led <= "01010";
          
                 when others =>
                      sram_data_led <= "01110";  
        
            end case;
      
         end if;
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...

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Roger hat übrigens recht ;)

Autor: Alex F. (alex86)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
entity sram_cntrl is
port( clk: IN std_logic;
      Reset: IN std_logic;
      CS: OUT std_logic;
      read_not_write: OUT std_logic;
      Data_bus: INOUT std_logic_vector(7 downto 0)
     );
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.
type sram_cntrl_type is (s_init, --einfach n Zustand für den Init
                         s_write, --hier werden dann die Wörter geschrieben,
                         s_read --die Wörter werden gelesen
                        );

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

Autor: Alex F. (alex86)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.