mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL verschiedene Takte gleichzeitig benutzen


Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin absoluter VHDL-Anfänger. Wir arbeiten mit Quartus für ein
CycloneII-Board. Es geht darum einen Leuchtpunkt zum Wandern zu bringen.
Das funktioniert soweit auch ganz gut. Es geht darum, dass der
Leuchtpunkt beim kurzen Drücken der Taste ein Feld weiter springen soll.
Beim langen Drücken der Taste, soll der Punkt erst nach 2 sek weiter
laufen. Mein Prof. meinte, dass für das kurze Drücken der Taste immer
ein schneller Takt laufen muss und wenn die Taste lange gedrückt wird,
soll sich ein Zustand durchsetzen, der sich auf einen langsameren Takt
bezieht, wobei der schnellere Takt im Hintergrund weiterläuft.
Ich habe mir das so gedacht, dass ich einer Zustandsvariable einen
bestimmten Wert zuweise (z.B. 0). Dann lasse ich in dem langsamen Takt
einen Zähler bis 2 sek hochzählen. Wenn die 2 sek erreicht sind, wird
die Zustandsvariable auf z.B. 1 gesetzt. Nur wenn die Taste gedrückt
wird UND die Zustandsvariable 1 ist, soll der Punkt nach 2 sek
weiterlaufen.
Ist das soweit richtig? Mit der programmiertechnischen Umsetzung haberts
auch bei mir. Was passiert dann mit dem Fall, dass ich nur kurz drücke?
Ich weiß nicht, wie ich den dann einbinden soll...

Ich danke euch schonmal im Voraus :)
Gruß Cutty

Autor: andz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bisschen heftig für nen totalen anfägner...

glaub du musst dir erstmal klar werden, dass VHDL keine 
Programmiersprache sondern n hardwarebeschreibungssprache is...also 
zeichne erstmal nen Plan auf RTL Ebene und setzt das dann in VHDL um...

Soweit ichs vestanden habe hast du 2 zustände: einen wo der Punkt bleibt 
wo er ist und im anderen springt er eins weiter. in den zwieten zustand 
kommtst du auf 2 wege: entweder durch LOSLASSEN des tasters, oder wenn 
ein Zähler so weit hochgezählt hat das er 2sec erreicht hat.

In den ersten zustand kannst du dann normal sofort 
zurückspringen...wobei dann wenn du den taster weiterhind drückst, nach 
2sec der punkt wieder ins weitergeht...

Gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cutty schrieb:
> Es geht darum einen Leuchtpunkt zum Wandern zu bringen.
> Das funktioniert soweit auch ganz gut.
Lass doch mal sehen, wie das aussieht.

Autor: Cutty (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

noch zum Verständnis: Leuchtpunkt wandert auf einer 5x7 Matrix per 
Tastendruck entweder nach rechts, links, oben oder unten. bei reset 
sollen alle punkte leuchten. auf 7-segmentanzeigen werden die 
koordinaten angezeigt.

code fürs schieben des punktes ist zu finden unter "reset", "spalten" 
und "zeilen" (kommentierte textüberschrift).

gruß Cutty

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso: @andz: bei kurzem drücken soll der punkt immer nur ein feld pro 
tastendruck weiterspringen, bei langem drücken soll der punkt, solange 
gedrückt wird, aller 2 sek eins weiterspringen...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  process (c_in, taste_reset, taste_rechts, taste_links, taste_oben, taste_unten)    
Der ist echt böse...
Denn in dem Prozess werden mehrere getaktete Konstrukte und zudem noch 
asynchron was beschrieben. In welchem Buch hast du das gesehen?

Ihr habt diesen Code nicht wirklich in Hardware laufen, oder?
Dann könnte der Synthesizer wieder mal mehr als ich ihm zutrauen 
würde...

Die Beschreibung gehört aufgeteilt in einen getakteten Prozess
process (c_in, taste_reset) begin
   if( taste_reset = '0')then 
  Spalte <= "11111";
  Zeile <= "0000000";
  count_Spalte <= 0;
  count_Zeile <= 0;  
   elsif rising_edge(c_in) begin
        if (taste_rechts = '1')then   
    if(count_Spalte = 4)then  count_Spalte <= 0;
    else        count_Spalte <= count_Spalte + 1;
    end if;
  end if;
  if(taste_links = '1')then
        :
  end if;
  if(taste_oben = '1')then
  :
  end if;
  if(taste_unten = '1')then
        :
  end if;
    end if;
end process;
und in einen kombinatorischen Prozess bzw. der Concurrent-Zuweisung.
signal count_Spalte : ...  
signal count_Zeile : ...  

process (count_Spalte) begin
  case count_Spalte is
        :
end process;  
process (count_Spalte) begin
  case count_Zeile is
        :  
end process;  
Dann hast du nämlich auch noch die absolut unnötigen Variablen weg...

> Das funktioniert soweit auch ganz gut.
if(rising_edge(c_in) and taste_rechts = '1')
Welche Frequenz hat c_in? Wenn das der bei FPGA übliche 50MHz-Takt ist, 
dann donnerst du während einem kurzen Tastendruck von 200ms etwa 10000 
mal nach rechts...  :-o


BTW: meine VHDL-Dateien enden nicht auf *.TXT
Probier mal hier im Forum eine *.VHD-Datei anzuhängen. Du wirst 
staunen...

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

> Denn in dem Prozess werden mehrere getaktete Konstrukte und zudem noch
> asynchron was beschrieben. In welchem Buch hast du das gesehen?

das hat uns unser prof so gesagt...so viel dazu ;)...wir hatten zunächst 
nur den takt c_in im prozess,das lief auch, gab aber n haufen warnungen

> Ihr habt diesen Code nicht wirklich in Hardware laufen, oder?

yep, haben wir ^^. da sieht man mal wieder, was so alles entsteht, wenn 
man nichtwissende studenten vor so eine aufgabe stellt :)

> Welche Frequenz hat c_in? Wenn das der bei FPGA übliche 50MHz-Takt ist,
> dann donnerst du während einem kurzen Tastendruck von 200ms etwa 10000
> mal nach rechts...  :-o

ja, es sind die 50 MHz. wir haben aber noch separat einen frequenzteiler 
beschrieben. der teilt uns den takt auf 1 sek oder so runter :). hinzu 
kommt ja noch, dass die tasten noch nicht mal entprellt sind...das ist 
auch noch so ne aufgabe, die erledigt werden muss. haben schon tausend 
möglichkeiten probiert (d-ff, rs-ff, per vhdl...), aber es verändert 
sich nichts...tut immer genau dasselbe...naja.

ist es jetzt überhaupt möglich noch einen takt ins spiel zu bringen, der 
für das langsame wandern des punktes benutzt werden kann? oder ist das 
absoluter frevel? :)

vielen dank schonmal für die antworten

gruß Cutty

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wir haben aber noch separat einen frequenzteiler
> beschrieben. der teilt uns den takt auf 1 sek oder so runter :)
D.h. der c_in ist auf 1 Hz runtergeteilt? Das wäre sehr ungünstig. 
Besser ist es, das ganze Design auf 50MHz laufen zu lassen, und nur noch 
mit Clock-Enables zu arbeiten. Was du also machen mußt, ist, einen 
wiederkehrenden Taktimpuls (der bei 50MHz dann genau 20ns lang gilt) zu 
erzeugen. So etwas also wie der clken beim Lauflicht: 
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html

> ist es jetzt überhaupt möglich noch einen takt ins spiel zu bringen, der
> für das langsame wandern des punktes benutzt werden kann? oder ist das
> absoluter frevel? :)
Du tust dir garantiert keinen Gefallen, wenn du einen zweiten Takt (also 
eine Abfrage auf rising_edge()) ins Spiel bringst.

Ein Anfängerdesign
- hat genau 1 Takt
- reagiert nur auf die steigende Flanke
- hat keinen asynchronen Reset (und schon gar keinen kombinatorischen)

Der dritte Punkt ist übrigens auch bei deinem Design problematisch. Du 
hast nur wegen der geringen Taktfrequenz noch kein Problem damit...  :-o
http://www.lothar-miller.de/s9y/categories/34-Geta...
http://www.lothar-miller.de/s9y/archives/64-State-...

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

> D.h. der c_in ist auf 1 Hz runtergeteilt? Das wäre sehr ungünstig.

was hat denn unser prof dann erzählt? das war das erste, was er sagte: 
ihr braucht einen frequenzteiler...hm...jetzt bin ich total verwirrt :)

> Du tust dir garantiert keinen Gefallen, wenn du einen zweiten Takt (also
> eine Abfrage auf rising_edge()) ins Spiel bringst.

dann hab ich jetzt absolut keinen plan, wie ich das mit dem langsamen 
laufen des leuchtpunktes machen soll...

> Ein Anfängerdesign
> - hat genau 1 Takt
> - reagiert nur auf die steigende Flanke
> - hat keinen asynchronen Reset (und schon gar keinen kombinatorischen)

das hätte uns mal jemand eher sagen sollen :).

> Der dritte Punkt ist übrigens auch bei deinem Design problematisch. Du
> hast nur wegen der geringen Taktfrequenz noch kein Problem damit...  :-o

also hab ich jetzt einen asynchronen reset im programm? ich weiß noch 
nicht mal was das ist, geschweige denn, wie ich das ändern kann :)

fazit: unser programm ist für die katz und nicht mehr zu retten? :)
vielen dank schonmal für die antworten

gruß Cutty

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
am besten du kaufst dir erstmal das buch vhdl-synthese von reichardt und 
lernst im selbststudium. Das was ihr machen müsst ist nicht schwer, aber 
man muss schon etwas Bescheid wissen was man eigentlich tut

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> fazit: unser programm ist für die katz und nicht mehr zu retten? :)
Nein, das geht nach ein paar Aufräumarbeiten schon, du mußt nur erst mal 
die Taktung auf Clock-Enables umstellen. Und dann ein Konzept für diese 
Clock-Enables aufstellen.

BTW: Das mit dem Buch ist nicht die schlechteste Idee... ;-)

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

danke für die antworten...das problem ist nur: bis zum 01.07. muss das 
fertig sein. dieses forum war mein allerletzter ausweg so kurz vor 
schluss :)
im grunde genommen funktioniert es...nur halt nicht besonders schön. das 
kommt dann einfach in die doku mit rein und dann ist jut. ich hab nach 
den ganze eskapaden keine lust mehr, mich ausgiebig mit vhdl zu 
beschäftigen :)
ich glaub der prof hats uns versaut ;)
ich probier das auf jeden fall mit den clock enables...

gruß Cutty

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hätte das (basierend auf dem Originalansatz) in etwa so wie im 
Anhang gelöst... ;-)

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

das nenn ich mal ein schönes Programm :)
wenn ich jetzt aber beim reset folgendes einfügen will (zum aufleuchten 
lassen aller leds):

Zeile<="0000000";
Spalte<="11111";

bringt er eine fehlermeldung: Error (10028): Can't resolve multiple 
constant drivers for net "Spalte[4]" at Schieberegister.vhd(198)

warum nur für spalte und nicht für zeile?

gruß Cutty

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso, noch eine frage:
process begin -- Schieberegister zum Einsynchronisieren und für Flankenerkennung
     wait until rising_edge(clk);
    resetsr <= resetsr(1 downto 0) & taste_reset; -- Schieberegister
    usr <= usr(1 downto 0) & taste_unten;
    osr <= osr(1 downto 0) & taste_oben;
    rsr <= rsr(1 downto 0) & taste_rechts;
    lsr <= lsr(1 downto 0) & taste_links;
end process;

hier werden mit einem Verkettungsoperator, wenn ich mich richtig 
informiert habe, felder angelegt, mit dem Inhalt des rechten Operanden, 
gefolgt von dem Inhalt des linken Operanden. wozu dient das?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wozu dient das?
Das ist die Beschreibung eines Scheiberegisters, in das von rechts der 
Tasterpegel eingetaktet wird.
Z.B. ist usr 3 Bit breit, davon werden dann die rechten 2 Bits 
genommen, um ein Bitt nach links gerückt, und der taster_unten 
dazuverknüpft.

> bringt er eine fehlermeldung: Error (10028): Can't resolve multiple
> constant drivers for net "Spalte[4]" at Schieberegister.vhd(198)
Ein Klassiker: du kannst nicht aus mehreren Prozessen auf 1 Signal 
treiben.

Mach einen Umweg und definiere statt:
signal count_Zeile  : integer range 0 to 6 := 0;
signal count_Spalte : integer range 0 to 4 := 0;
einfach einen Zustand mehr:
signal count_Zeile  : integer range 0 to 7 := 0;
signal count_Spalte : integer range 0 to 5 := 0;
Und definiere: der Wert 0 ist dein Resetwert.
Dann mußt du natürlich die Tabellen und die Zähler entsprechend 
anpassen:
  process begin -- Zählerverwaltung
     wait until rising_edge(clk);
    --   steigende Flanke    oder    Wiederholung aktiv
    if (rsr(2 downto 1)="01") or (rsr(2)='1' and repeat='1') then 
      if(count_Spalte = 5)then  -
        count_Spalte <= 1;
      else
        count_Spalte <= count_Spalte + 1;
      end if;
    end if;
    if (lsr(2 downto 1)="01") or (lsr(2)='1' and repeat='1') then 
      if (count_Spalte = 1)then 
        count_Spalte <= 5;
      else
         count_Spalte <= count_Spalte - 1;
      end if;
    end if;
    :
    :
  end process;
  
  process (count_Zeile) begin
    case count_Zeile is  
    when 0 =>  -- Resetwert
      Zeile <= "1111111";
      h<='1';
      i<='1';
      j<='1';
      k<='1';
      l<='1';
      m<='1';
      n<='1';
    when 1 =>
      Zeile <= "0111111";
      h<='1';
      i<='0';
      j<='1';
      k<='1';
      l<='0';
      m<='1';
      n<='1';
    when 2 =>
      Zeile <= "1011111";
      h<='0';
      i<='0';
      j<='1';
      k<='0';
      l<='1';
      m<='0';
      n<='0';
    when 3 =>
      Zeile <= "1101111";
  :
  : 

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Supi, danke schön. bin jetzt erstmal nicht im labor, schreibe übers we 
an meinem bericht. ich meld mich dann nächste woche nochmal und berichte 
:)

danke danke danke fürs helfen :)))

gruß Cutty

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

es funktioniert alles super. Vielen Dank nochmal für die Hilfe. Falls 
ich noch Verständnisprobleme habe, melde ich mich wieder ^^. Ich habe in 
den paar Tagen im Forum mehr gelernt, als in 3 Monaten qualvollem 
Selbststudiums...;)

gruß
Cutty

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> als in 3 Monaten qualvollem Selbststudiums...;)
Kauf dir das Buch "VHDL-Synthese" von Reichardt/Schwarz, oder leih es 
aus.
Ich vermute sehr stark, dass du es noch nicht hast...  ;-)

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
falls ich jemals wieder mit vhdl in kontakt komme, hab ich mir dieses 
buch auf jeden fall vorgemerkt ;)

Autor: Cutty (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

jetzt müssen wir dieses schöne programm auch in modelsim testen ^^
nur leider funktioniert das gar nicht...der rennt immer in einen 
undefinierten zustand bei spalte und zeile (siehe anhang)
muss ich irgendwas besonderes beachten bei modelsim?

gruß
Cutty

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es könnte hilfreich sein, die signale für die tasten 
vorzuinitialisieren. dadurch sind die in der simulation nicht mehr 
unbekannt ('X') sondern vielleicht '0'. Dadurch kann die Simulation dann 
auch damit rechnen.

z.B.

signal teste_xxx : std_logic := '0';

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> jetzt müssen wir dieses schöne programm auch in modelsim testen
Zeig mal deinen Code und die zugehörige Testbench...

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

habs schon hingekriegt :)
es lag daran, dass ich den code fürs 2s tasten drücken noch drin 
hatte...
da hätte ich mich ja wulig simuliert ^^

so reicht es völlig aus und ist richtig schön geworden
danke trotzdem :)

gruß cutty

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach und ich hatte vergessen, dass reset auf dem board lowaktiv 
ist...hatte somit einen völlig falschen zustand definiert ^^

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)
process begin -- Schieberegister zum Einsynchronisieren und für Flankenerkennung
     wait until rising_edge(clk);
    resetsr <= resetsr(1 downto 0) & taste_reset; -- Schieberegister
    usr <= usr(1 downto 0) & taste_unten;
    osr <= osr(1 downto 0) & taste_oben;
    rsr <= rsr(1 downto 0) & taste_rechts;
    lsr <= lsr(1 downto 0) & taste_links;
end process;
warum dient dieses Schieberegister zum Einsynchronisieren und für die 
Flankenerkennung?

gruß Cutty

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> warum dient dieses Schieberegister zum Einsynchronisieren und für die
> Flankenerkennung?
Dies Schieberegister, so wie sie da stehen, dienen zuerst nur mal zum 
Eintakten/Einsynchronisieren.

Eine Flankenerkennung wird daraus, wenn irgendwo steht
brocess begin
   wait until rising_edge(clk);
   if usr(2 downto 1) = "10" then -- fallende Flanke (von 1 nach 0)
      :
   end if;
   if osr(2 downto 1) = "01" then -- steigende Flanke (von 0 nach 1)
      :
   end if;
end process;

> warum dient dieses Schieberegister zum Einsynchronisieren und für die
> Flankenerkennung?
Damit z.B. sowas nicht passiert:
http://www.lothar-miller.de/s9y/archives/64-State-...

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

ich versteh noch nicht so 100%ig, was diese CE-Verwaltung hier 
macht...*aufdemSchlauchsteh*
Bitte nochmal mit ganz einfach Worten? Danke im Voraus :).

gruß Cutty
process begin -- Clock-Enable-Verwaltung
     wait until rising_edge(clk);
    onesecond <= '0';
      repeat    <= '0';
    if (counter1s<50000000-1) then
       counter1s <= counter1s+1;
    else
       counter1s <= 0;
     onesecond <= '1';
    end if;
    if (onesecond='1') then
       if (counter2s<1) then
          counter2s <= counter2s+1;
      else
         repeat <= '1';
      end if;
    end if;
    if (untensr(2)='0' and obensr(2)='0' and rechtssr(2)='0' and linkssr(2)= '0') then -- keine Taste gedrückt
       counter1s <= 0;
       counter2s <= 0;
    end if;
     if (resetsr(2) = '0') then -- Reset betätigt
       counter1s <= 0;
       counter2s <= 0; 
   end if;
  end process;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
process begin -- Clock-Enable-Verwaltung
    wait until rising_edge(clk);    -- warten bis zur nächsten steigenden Taktflanke des FPGA-Takts

    -- hier wird aus einem 50MHz Takt ein Clock-Enable für jede Sekunde erzeugt
    onesecond <= '0';               -- Defaultwert
    if (counter1s<50000000-1) then  -- Zählerende noch nicht erreicht erreicht? 
       counter1s <= counter1s+1;    -- ja: dann weiterzählen
    else                            -- Zählerende erreicht.
       counter1s <= 0;              -- Zähler zurücksetzen
       onesecond <= '1';            -- Defaultwert vom Enalbe mit '1' überschreiben
    end if;

    -- Hier das Repeat-Signal nach 2 Sekunden Tastendruck erzeugt
    repeat    <= '0';               -- Defaultwert für Repeat-Signal
    if (onesecond='1') then         -- wieder eine Sekunde vergangen?
       if (counter2s<1) then        -- Zähler für Enable 2 Sekunden prüfen
          counter2s <= counter2s+1; -- Zählerende noch nicht erreicht: weiterzählen
      else                          -- Zählerende erreicht:
         repeat <= '1';             -- Repeat aktivieren
      end if;
    end if;
    
    -- Zähler zurücksetzen, wenn keine Taste gedrückt
    if (untensr(2)='0' and obensr(2)='0' and rechtssr(2)='0' and linkssr(2)= '0') then -- keine Taste gedrückt
       counter1s <= 0;              -- Zähler zurücksetzen
       counter2s <= 0;              -- --> Zähler und Repeat beginnen von vorn
    end if;
    -- Zähler zurücksetzen, wenn Reset-Taste gedrückt
    if (resetsr(2) = '0') then      -- Reset betätigt
       counter1s <= 0;              -- Zähler zurücksetzen
       counter2s <= 0;              -- --> Zähler und Repeat beginnen von vorn
   end if;
end process;

In einer Simulation kannst du den Ablauf schön erkennen... ;-)

Autor: Cutty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo :)

habe das quartus-projekt hinter mir und wollte nur nochmal DANKE sagen 
für die vielen lieben Hilfestellungen. Hat mich sehr weiter 
gebracht...DANKE :)!!!

gruß
Cutty

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.