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


von Markus Müller (Gast)


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;

von FPGA-User (Gast)


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;

von John-Eric (Gast)


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

von ups (Gast)


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.

von high_speed (Gast)


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

von ups (Gast)


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

von Markus Müller (Gast)


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)

von J. Z. (zennehoy)


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

von J. Z. (zennehoy)


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

von ups (Gast)


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.

von J. Z. (zennehoy)


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

von ups (Gast)


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.

von ups (Gast)


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

von J. Z. (zennehoy)


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

von Markus Müller (Gast)


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

von Hagen (Gast)


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

von ups (Gast)


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.

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.