mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL Programm zur CPLD Programmierung


Autor: Markus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich brauche ein Programm für einen Zähler, der nur jeden 2 Takt zählen
soll. Habe bereits ein Programm geschrieben, das aber leider nicht
funktioniert. Währe nett, wenn sich jemand den Code anschauen könnte
und mir sagen kann, wie es richtig geht. Der Zähler zählt zwar,
allerdings unregelmäßig.
Danke im vorraus!

Markus


library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity versuch is
  port( CLK: in bit;
      Q: out std_logic_vector (15 downto 0));
end versuch;

architecture verhalten of versuch is

signal QINT: std_logic_vector (15 downto 0);
signal AUXILIARY_VARIABLE: std_logic;

begin

CTR: process (CLK, AUXILIARY_VARIABLE)

  begin

    AUXILIARY_VARIABLE <= '1';

    if ( AUXILIARY_VARIABLE = '1') then

      if CLK='1' and CLK'event then
        QINT <= QINT + 1;
      end if;

      AUXILIARY_VARIABLE <= '0';

    elsif ( AUXILIARY_VARIABLE = '0') then

      AUXILIARY_VARIABLE <= '1';

    end if;
    end Process CTR;
  Q <= QINT;
end verhalten;

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
signal ena_q : std_logic;

process(clk)
begin
   if rising_edge(clk) then

      ena_q <= not ena_q;

      if ena_q = '1' then
         QINT <= QINT +1;
      end if;

   end if;
end process;

Q <= QINT;

Autor: John-Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dieses signal (AUXILIARY_VARIABLE) ist immer 1.
das ist klar das das nicht geht.
probiers so:


CTR: process (CLK, AUXILIARY_VARIABLE)

  begin

      if CLK='1' and CLK'event then
         AUXILIARY_VARIABLE <= not AUXILIARY_VARIABLE;

         if ( AUXILIARY_VARIABLE = '1') then
            QINT <= QINT + 1;
         end if;
      end if;
  end Process CTR;
====================
müsste so laufen.
bei jedem clk tackt verändert sich diese AUXILIARY_VARIABLE.
daurch erhält mann einen tackteiler wie du ihn haben willst.
und den wird dieses signal noch einmal als enable signal für deinen
zähler abgefragt.
denke das ich dir geholfen habe.
mfg

Autor: ups (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm, irgendwie das gleiche wie von fpga-user. ich würde das Signal
AUXILIARY_VARIABLE allerdings nicht nochmal in die sensitivity list
schreiben, ändert sich ja eh nur mit dem clk takt und das wohl auch nur
in diesem prozess. man sollte das ise nicht unnütz überfordern.

Autor: high_speed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum so umständlich?
Das Zähler Signal einfach um ein Bit vergrößern und nur die oberen Bits
Übergeben.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity versuch is
  port( CLK: in bit;
      Q: out std_logic_vector (15 downto 0));
end versuch;

architecture verhalten of versuch is
signal QINT: std_logic_vector (16 downto 0);
begin

  CTR: process (CLK)
  begin
      
    if CLK='1' and CLK'event then
       QINT <= QINT + 1;
    end if;
      
  end Process CTR;
  
  Q <= QINT(16 downto 1);
end verhalten;


MfG
Holger

Autor: ups (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na ja man versucht ja zähler schon so klein wie möglich zu halten, aber
wenn man genug ressourcen hat und schnell genug ist, geht das auch so

Autor: Markus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Danke erst einmal! Habe die Änderungen vorgenommen und jetzt läuft
alles!

Eine Frage habe ich allerdings noch:

Ich habe in der ENTITY einen Port deklariert mit STD_LOGIC. Im weiterem
Programm würde ich auf dieses Signal aber gerne eine 1 addieren.

   Signal <= Signal + 1

welche Bibliothe brauche ich also, um einen Wert addieren zu können?
Die Struktur müßte irgendwie so aussehen:

Signal <= (???????(Signal+1)

Autor: J. Z. (zennehoy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine 1 zu einem STD_LOGIC Signal dazu addieren macht keinen Sinn...
STD_LOGIC ist schliesslich nur ein einzelnes Bit (Leitung). Probier es
mal mit STD_LOGIC_VECTOR. Wenn du dann auch noch
IEEE.STD_LOGIC_UNSIGNED.ALL "usest", sollte es einfach klappen.
Zen

Autor: J. Z. (zennehoy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> na ja man versucht ja zähler schon so klein wie möglich zu halten,
aber
> wenn man genug ressourcen hat und schnell genug ist, geht das auch
so

Die Synthese duerfte aus beidem das Gleiche machen. Schliesslich ist
AUXILIARY_VARIABLE nichts anderes als das unterste Bit im Zaehler.
Zen

Autor: ups (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Synthese duerfte aus beidem das Gleiche machen. Schliesslich ist
>AUXILIARY_VARIABLE nichts anderes als das unterste Bit im Zaehler.


hmmm, das denke ich nicht. eigentlich müsste einmal wirklich ein Zähler
mit 17bit implementiert werden, welcher aus 9 Slices gebildet wird.
Mit dem AUXILIARY_VARIABLE wird ein CE-Signal gebildet, welches am CE
Eingang des jeweiligen Ausgangs-FF angeschlossen wird.

9 Slices braucht man allerdings auch, da noch ein FF für das
CE-Hilfssignal notwendig ist.

Autor: J. Z. (zennehoy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verwechsle nicht Zaehler mit Addierer!
Ein gescheites Synthese-Tool macht aus CNT <= CNT + 1 einen Zaehler und
keinen Addierer, also (auf Hoch-Denglish): jedes Bit wird Getoggelt wenn
alle Bits mit niedrigerer Ordnung ´1´ sind, also das CE fuer jedes Bit
ist die Ver-Undung von allen Bits davor. Das CE-Signal
AUXILIARY_VARIABLE ist also nichts anderes als das niedrigst-geordnete
Bit im 17-bit Zaehler.
Zen

Autor: ups (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
von addierer hat keiner geredet. und soweit ich weiss braucht man für
nen Zähler auch FF. Und wie sollen die implementiert werden?
Einen Eingang vom LUT und das dahinter sitzende FF. Damit ist das Ding
noch kein Addierer!

Das ander bleibt ein 17bit Zähler, der mit dem normalen Takt arbeitet.
Und welches Synthesetoll sollte so nen 17bit Zähler so wie oben
beschrieben umwandeln?

aber ich werde es mal ausprobieren und schauen wie das ISE das alles so
andrahtet.

Autor: ups (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so habe es jetzt mal durchs ISE geschickt und wie gesagt wird ein 17bit
Zähler eingebaut und das ISE erkennt das LSB nicht als Hilfssignal und
bastelt daraus nen chip enable.

Mit AUXILIARY_VARIABLE wird ein Hilfssignal gebildet und an das CE von
den Ausgangs FF gehängt.

Aber vielleicht ist ja das ISE nur nicht gut genug oder sagt sich bei
leerem CHIP warum die ganze Arbeit machen... :-)

Autor: J. Z. (zennehoy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, das spart natuerlich pro Bit ein AND-Eingang wenn AUX_VAR direkt
an die CEs der Register angeschlossen wird. Mich wundert aber, dass das
Synthesetool bei einem Zaehler ohne globalen CE nicht die CE Eingaenge
der Register zur optimierung benutzt. Vielleicht machen das auch
unterschiedliche Synthesetools anders.
Zen

Autor: Markus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Auch wenn ich Euch mit meinem Zähler wahrscheinlich bereits auf die
Nerven gehe... eine Frage hätte ich noch:

Kann ich eigentlich auch meinen Takt einfach reduzieren, so daß er nur
noch jeden "eigentlich zweiten" Takt, taktet? Ihn quasi irgenwie
halbieren?

Gruß Markus

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus:

Beide obigen Vorschläge machen exakt das was du nachfragst. Sie
halbieren den Takt aus Sicht des Zählers.

Aber mal ne andere Frage, kann es sein das du aus Thüringen kommst ?
Ein alter Schulkamerad von mir hieß nämlich auch Markus Müller.

Gruß Hagen

Autor: ups (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wen es nervt, der brauch es ja nicht lesen :-)

die lösung von fpga user halbiert doch den takt schon

      ena_q <= not ena_q;

mit jedem flankenwechsel wechselt das signal ena_q und hat somit den
halben takt.

würde diesen aber nur als en signal benutzen und die prozesse weiter
mit dem normalen takt betreiben, ausser du willst dafür wirklich ne clk
leitung spendieren.

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.