VHDL Programm zur CPLD Programmierung

Gast #251477
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;
Gast #251479
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
Gast #251480
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.
Gast #251481
Lesenswert?

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

5
entity versuch is
6
  port( CLK: in bit;
7
      Q: out std_logic_vector (15 downto 0));
8
end versuch;
9

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

14
  CTR: process (CLK)
15
  begin
16
      
17
    if CLK='1' and CLK'event then
18
       QINT <= QINT + 1;
19
    end if;
20
      
21
  end Process CTR;
22
  
23
  Q <= QINT(16 downto 1);
24
end verhalten;

MfG
Holger
Gast #251483
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)
#251485
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
Gast #251486
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.
#251487
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
Gast #251488
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.
Gast #251489
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... :-)
#251490
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
Gast #251491
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
Gast #251492
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
Gast #251493
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren