Forum: FPGA, VHDL & Co. VHDL Takt erzeuegen


von Igor (Gast)


Lesenswert?

Hallo Forenmitglieder,

nach langer Abstinenz versuche ich mich wieder am FPGA/VHDL und sehe wie 
viel ich leider vergessen habe. Am Beispiel möchte ich gerne die 
Impulszeit am Eingang messen. Hierzu der Code:
1
entity Main is
2
    Port ( Clk_100Mhz : in STD_LOGIC;
3
           Reset: in std_logic;
4
           Input_1 : in STD_LOGIC;
5
           Output_2 : out STD_LOGIC;
6
           Output_3 : out STD_LOGIC;
7
           led : out STD_LOGIC);
8
end Main;
9
10
architecture Behavioral of Main is
11
12
13
signal cnt1: integer range 0 to 1000000000 :=0;
14
signal cnt2: integer range 0 to 1000000000 :=1;
15
signal trig: std_logic;
16
signal trig2: std_logic;
17
18
begin
19
20
process (Clk_100Mhz, Reset) begin
21
if (Reset = '1') then
22
    cnt1<=0;
23
 else
24
     if rising_edge(Clk_100Mhz) then
25
        if Input_1 = '1' then
26
            cnt1 <= cnt1 + 1;
27
        end if;
28
     end if;
29
end if;   
30
    end process;
31
32
process (Clk_100Mhz) begin
33
 if rising_edge(Clk_100Mhz) then
34
        if cnt2<= cnt1 then
35
            cnt2<=cnt2+1;
36
        else
37
        cnt2 <=0;
38
        trig<= '0';
39
      end if;
40
 end if;
41
end process;
42
 
43
 
44
45
Output_3<=trig;
46
Output_2<='1';
47
led <= Input_1;
48
49
end Behavioral;

Dies klappt auch soweit (am Oszi). Meine Frage:

Wie kann ich den Wert des Zählers cnt1 ausgeben. Also wenn der Wert Cnt1 
640000 hat, dann möchte ich gerne den Ausgang Output_3 mit der Frequenz 
640000 takten?


Erst dachte ich an ein Schieberegister (std_logic_vector) aber mein 
Ausgang ist nur 1Bit (std_logic)?

Über Hilfe würde ich mich sehr freuen.

Danke
Gruß
Igor

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


Lesenswert?

Igor schrieb:
> Dies klappt auch soweit (am Oszi).
Da gibt es doch fast gar nichts zu sehen: die LED folgt dem Eingang und 
Ouput_2 ist statisch high. Und wenn ich der Synthesizer wäre, dann würde 
ich nichtmal am trig wackeln, sondern den hart auf '0' verdrahten, weil 
er sich nie ändert...

> Am Beispiel möchte ich gerne die Impulszeit am Eingang messen.
Die Impulszeit im Sinne von Periodendauer? Oder die Zeit für die high 
und low Dauer des Signals?

> Also wenn der Wert Cnt1 640000 hat, dann möchte ich gerne den Ausgang
> Output_3 mit der Frequenz 640000 takten?
640000 was? Kartoffeln, Bananen?
Oder meinst du, du willst ihn mit der selben Frequenz takten, also mit 
fosc/640000?

> Wie kann ich den Wert des Zählers cnt1 ausgeben.
Was oder wofür willst du das ausgeben? Zur Diagnose?


Ein wichtiger Tipp:
1
 if rising_edge(Clk_100Mhz) then
2
         if Input_1 = '1' then
3
             cnt1 <= cnt1 + 1;
Du musst das externe Signal Input_1 unbedingt vor der Abfrage 
einsynchonisieren. Sonst bekommst du garantiert spordische Probleme.
Siehe dort:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

: Bearbeitet durch Moderator
von Igor (Gast)


Lesenswert?

Hallo Lothar und Danke für die Rückmeldung,

1
Da gibt es doch fast gar nichts zu sehen: die LED folgt dem Eingang und 
2
Ouput_2 ist statisch high. Und wenn ich der Synthesizer wäre, dann würde 
3
ich nicht mal am trig wackeln, sondern den hart auf '0' verdrahten, weil 
4
er sich nie ändert...

Output_2 habe ich auf high gemacht, damit ich den auf Input 
kurzschließen kann. Somit will den Impuls am Eingang simulieren (kurz 
hinhalten / lang hinhalten)
1
Die Impulszeit im Sinne von Periodendauer? Oder die Zeit für die high 
2
und low Dauer des Signals?

Im Prinzip beides, Periodendauer funktioniert auch (z. M am Ozsi).
Die Zeit für die High und low Dauer würde ich gerne auch noch messen und 
ausgeben - darauf komme ich nicht....

1
 640000 was? Kartoffeln, Bananen?
2
Oder meinst du, du willst ihn mit der selben Frequenz takten, also mit 
3
fosc/640000?

Genau, der cnt1 wird solange hochgezählt wie ein high auf dem Input ist. 
Wenn der eben einen Wert von 6400000 erreicht hat für die Dauer, möchte 
ich gerne diese Anzahl als Takt rausgeben. (Später möchte ich die 
Impulsbreite gerne als ein Wert vom Fpga auf PC übergeben)

Die restlichen Anmerkungen werde ich mir nochmals genau anschauen- 
DANKE!


Danke & Gruß

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


Lesenswert?

Igor schrieb:
> Genau, der cnt1 wird solange hochgezählt wie ein high auf dem Input ist.
> Wenn der eben einen Wert von 6400000 erreicht hat für die Dauer, möchte
> ich gerne diese Anzahl als Takt rausgeben. (Später möchte ich die
> Impulsbreite gerne als ein Wert vom Fpga auf PC übergeben)
Die "Anzahl"? Du willst also 640000 Pulse ausgeben?
Oder willst du ein Signal mit einer Frequenz ausgeben, deren 
Periodendauer der Zeit der zuvor gemessenen High-Dauer entspricht?
Kannst du das mal als Timing-Diagramm aufzeichnen?

> will den Impuls am Eingang simulieren (kurz hinhalten / lang hinhalten)
Das ist aber nicht so richtig nachvolziehbar und extrem zufällig.
Richtige "Simulation" funktioniert bei FPGAs durch eine Beschreibung in 
VHDL und Ausführung derselben im Simulator mit definierten und 
reproduzierbaren Stimuli...

> Die restlichen Anmerkungen werde ich mir nochmals genau anschauen
Ja. Dein asynchroner Reset ist auch extrem unsauber. Der wird dir auch 
Probleme machen.

> - DANKE!
Keine Ursache.
Als Tipp: du kannst Posts einfach zitieren, indem du eine spitze Klammer 
'>' an den Zeilenanfang stellst oder einfach auf den Link "Antwort mit 
Zitat" klickst.

: Bearbeitet durch Moderator
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.