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;
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;
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
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.
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
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
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)
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
> 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
>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.
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 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.
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... :-)
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
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
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.