Forum: FPGA, VHDL & Co. zähler programmieren


von Sandra T. (tsandra)


Angehängte Dateien:

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Sandra T. (tsandra)


Lesenswert?

danke ich hatte schon gedacht dass etwas nicht stimmt.ich versuche 
nochmal

von Sandra T. (tsandra)


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.

von Schrotty (Gast)


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.

von Sandra T. (tsandra)


Lesenswert?

der muss aber 0,5s laufen.dieser aufgabe macht mich schon fertig ich 
weiss est nicht mehr weiter.wenn eine weiss wie das geht bitte hilfe.

von Schrotty (Gast)


Lesenswert?

Na wenn du deine LED für 0,25 sekunden an und dann für 0,25 sekunden aus 
hast, dann ist doch eine Periode 0,5s = 2 Hz lang.

von Schrotty (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
:

von Schrotty (Gast)


Lesenswert?

Ganz genau so mein ich es, Lothar ;-)

von Sandra T. (tsandra)


Angehängte Dateien:

Lesenswert?

so hatte ich eben geschrieben.

von Sandra T. (tsandra)


Lesenswert?

ich danke euch, dass ihr mir hilft

von Schrotty (Gast)


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";

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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  :-(

von Schrotty (Gast)


Lesenswert?

ok, Lothar, das wusste ich auf die Schnelle nicht mehr.

von Sandra T. (tsandra)


Lesenswert?

ok der Reset_n ist auf low-aktiv hatte ich vergessen aber was mir noch 
stört ist diese übergabe weil mein count ist ein Vector und LED variable 
und habe gelesen das mann die so nicht konvertieren kann.
danke

von Schrotty (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> versuch dir das mal in Hardware mit Gattern aufgebaut vorzustellen
Diese Abstraktion der Beschreibung ist überhaupt das wichtigste.

z.B. Hardwareentwicklung:
Ich zeichne einen Schaltplan, aber ich denke in ICs und Bauteilen.

entsprechend FPGA-Design:
Ich schreibe VHDL, aber ich denke in Gattern und Logik.

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.