zähler programmieren

OP #1124214
Lesenswert?

Hallo,
ich bin neu in VHDL und muss ein zähler mit FPGA programmieren.ich muss 
ein VHDL-block erstellen, der die Takt-frequenz des FPGA-board(25Mhz)auf 
2hz herunter teilt und der ausgangssignal soll dabei zur kontrolle mit 
einer LED verknüpft werden,so dass die generierte frequenz sichtbar 
gemacht wird.ich habe schon etwas gemacht aber klappt nicht.ein freund 
meinte ich soll der cnt bis 28 zählen warun verstehe ich gar nicht.bitte 
helfen sie mir.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1124225
Lesenswert?

> ich habe schon etwas gemacht aber klappt nicht.
Ich könnte das schon schnell hinschreiben, aber damit wäre dir nicht 
unbedingt geholfen. Lass doch sehen, was du schon hast.

Ein Tipp:
Du brauchst einen Zähler, der von 0 bis (25000000/2)-1  zählt.
1
   signal counter : integer range 0 to (25000000/2)-1:
Der wird jetzt mit jedem Takt (25MHz) hochgezählt und beim Endwert 
wieder auf 0 gesetzt. Das MSB davon schließt du an die LED an. Fertig.
Moderator (Firma: Titel) Persönliche Seite #1124292
Lesenswert?

Ok, ich habe den Anhang übersehen :-/
(Aber docx ist numal auch kein gängiges vhdl-Fileformat)

Ich verbessere mich:
Mit dem Integer ist die Rückwandlung des MSB etwas umständlich. 
Einfacher geht es mit dem Vektortyp unsigned aus der numeric_std Lib.
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;
4
:
5
:
6
signal   count : unsigned (23 downto 0); -- (25000000/2)-1 
7
:
8
begin
9

10
    process(clk)
11
    begin
12
        if clk'event and clk = '1' then
13
            if  count < to_unsigned((25000000/2)-1,24)  then 
14
               count <= count + 1;
15
            else                                  
16
               count <= to_unsigned(0,24);
17
            end if;
18
        end if;
19
    end process;
20
    
21
    LED_1 <= count(23);
22
:
23
:

28 Bit scheinen mir etwas zuviel, damit kannst du auf fast 270Mio 
zählen, das ist nicht nötig.
OP #1124434
Lesenswert?

ich gerade auch eine schnittstelle von der aufgabe bekommen und die 
lautet so:
eingänge: clk, reset_n(werden alle ausgangssignale auf null gesetz)
ausgänge: clk_out selbst erzeugte frequenz von 2hz
interne signal : count--zähler und clk_temp
es kann auch ein interne signal verwenden, dass die fpga-taktzyklen 
zählt.beim erreichen durch die vorgegeben frequenzen zu bestimmenden 
zeipunktes wird das interne signal "clk_temp" invertiert.dann wird 
clk_temp an das ausgangssignal clk_out übergeben welches mit der LED auf 
der board verknüpfen ist.
Gast #1124448
Lesenswert?

Wenn das Puls-Pausen Verhältnis des Ausgangstaktest 50% sein soll, würde 
ich einen Counter machen, der nicht 0,5s lang läuft, sondern 0,25s.
Dann jedesmal wenn der Counterwert erreicht ist, den Ausgang für die LED 
toggeln.
Gast #1124480
Lesenswert?

also mal ganz ausführlich:
2Hz ist eine Zeit von 0,5 Sekunden. In dieser Zeit muss das Signal 
einmal High und dann Low sein. Das heisst dann eine Periode.
Und wenn du willst, dass das Signal ein Rechteck ist, in dem die Zeit, 
wo es Hig und die Zeit, wo es low ist, gleich lang sind.. also sowas

--      ----      --                        --    ------    --
  |    |    |    |                            |  |      |  |
   ----      ----         und NICHT sowas:     --        --

dann ist doch die LED für 0,25s an und für 0,25s aus.

Und dann ist es doch recht naheliegend, einen Zähler zu bauen, der auf 
0,25s zählt, dann den Zustand der LED umdreht und wieder von vorne 
anfängt zu zählen usw..

Dein Zähler läuft mit 25MHz. Das heisst, er zählt alle 40ns um eins 
weiter.
Wie oft muss man um 40ns zählen, um auf 0,25 sekunden zu kommen?
--> 0,25s / 40 ns = 6 250 000. Und da der Zähler üblicherweise bei null 
anfängt, zählst auf 6 249 999.

Also: Ein Zähler, der von 0 auf 6249 999 zählt. Und immer, wenn er 
diesen Wert erreicht hat, schaltet er den Zustand der LED um, setzt sich 
selbst wieder auf 0 zurück und beginnt von vorne.

Ich hoff, ich konnte dir helfen.
Moderator (Firma: Titel) Persönliche Seite #1124483
Lesenswert?

So etwa:
(jetzt darfs wieder integer sein, das ist einfacher ;-)
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;
4
:
5
:
6
signal   count : integer range 0 to (25000000/4)-1 := 0
7
signal   led : std_logic := '0';
8
:
9
begin
10

11
    process(clk)
12
    begin
13
        if rising_edge(clk) then
14
            if (count<(25000000/4)-1)  then 
15
               count <= count + 1;
16
            else                      
17
               led <= not led;            
18
               count <= 0;
19
            end if;
20
        end if;
21
    end process;
22
    
23
    LED_1 <= led;
24
:
25
:
Gast #1124539
Lesenswert?

im Prinzip richtig, wenn ich das auf die Schnelle seh.
Allerdings geh ich davon aus, dass reset_n low-aktiv ist, also sollte 
auch die Abfrage auf '0' erfolgen.
Ausserdem glaub ich nicht, dass du count <= count + 1 schreiben kannst, 
wenn count std_logic_vector ist. Könnte sein, dass du dann den vollen 
Vektor addieren musst.

Also count <= count + "000000000000000000000000001";
Moderator (Firma: Titel) Persönliche Seite #1124542
Lesenswert?

Das geht:
> count <= count + '1';

EDIT:
6249999 sind bei mir x"5F5E0F"
Das korreliert gar nicht mit
"10111110101111000010000000"


So wird das mit dem Vektor nicht gehen:
1
signal   count    :   std_logic_vector(0 downto (25000000/2)-1 );
Du kannst nicht nur die Sahnehäubchen aus meinem Code naschen, nein das 
geht nicht ;-)
Versuch mal zu verstehen, was ich da hingeschrieben habe.

Und der Vergleich wäre so etwas übersichtlicher:
>  if count = "10111110101111000010000000" then
>  if count = "10" & x"FAF080" then
Aber wie oben schon gesagt: sowieso die falsche Zahl  :-(
Gast #1125218
Lesenswert?

Hmm, Sandra, ich glaub, bei dir müssen wir ein wenig weiter ausholen.
Woher kommt die Aufgabe eigentlich, die du da lösen sollst? Also ist das 
im Rahmen einer Vorlesung oder Unterricht?

Ich schau mir grad deinen Code nochmal an. Also ich weiss nicht, wie du 
drauf kommst, dass LED ne Variable ist. Die LED ist ein Port vom Typ 
std_logic, so wie alle Signale auch, die du verwendest. Daher gibt es da 
keine Probleme bei irgendwelchen "Übergaben".

Ausserdem übergibst du ja eh nicht den Zähler an die LED, sondern du 
machst Folgendes (versuch dir das mal in Hardware mit Gattern aufgebaut 
vorzustellen):

Du nimmst einen Zähler. (count <= count + '1'). Diesen Zähler 
vergleichst du über einen Vergleicher mit deinem Grenzwert (if count = 
xxxxxx then...)
Wenn der Zähler also den Wert erreicht hat, dann wird der Zähler 
zurückgesetzt und gleichzeitig wird das SIGNAL clk_temp invertiert.
Du "übergibst" also nirgends irgendwelche Signale oder Variablen, 
sondern führst in Abhängigkeit des Zustandes des Zählers  Veränderungen 
am Signal clk_temp durch. Dieses Signal wird am Ende auf deinen Port 
LEDx verdrahtet.

uffz. ich hoff, das hat dir geholfen

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