Takt selbst erzeugen

Gast #3213269
Lesenswert?

Hallo,

nur eine Verständnisfrage.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4

5
entity keinQuarz is
6
    Port
7
    (
8
        clk    : in  STD_LOGIC := '0';
9
        clkOut : out STD_LOGIC := '0'
10
    );
11
end keinQuarz;
12

13
architecture Behavioral of keinQuarz is
14
    signal clkCounter : unsigned(31 downto 0) := (others=>'0');
15
begin
16
    process (clkCounter) begin
17
        clkCounter <= clkCounter + 1;
18
    end process;
19
    
20
    process begin
21
        wait until rising_edge(clk);
22
        ...
23
    end process;
24
    
25
    clkOut <= clkCounter(15);
26
end Behavioral;

Wenn die Genauigkeit des Takts keine Rolle spielt, könnte man dann sowas 
machen?
Der clk-Pin wird auf dem PCB mit dem clkOut-Pin verbunden.

Jittert wahrscheinlich ohne Ende, und die ersten 1-2 FFs werden 
wahrscheinlich ständig in irgendwelchen metastabilen Zuständen 
verbringen, müsste aber doch eigentlich gehen, oder?
Gast #3213341
Lesenswert?

Thomas schrieb:
> die ersten 1-2 FFs werden
> wahrscheinlich ständig in irgendwelchen metastabilen Zuständen

dummerweise sehe ich in deinem Counter überhaupt keine (getakteten) 
Flipflops:

Thomas schrieb:
> process (clkCounter) begin
>         clkCounter <= clkCounter + 1;
>     end process;



Es werden nicht nur ein paar LSB Unsinn anzeigen, sondern alle Stellen 
deines Zählers: die niederwertigsten bits werden ja auch direkt für die 
Berechnung der höchstwertigen Bits verwendet.
Moderator (Firma: Titel) Persönliche Seite #3214192
Lesenswert?

Thomas schrieb:
1
 process (clkCounter) begin 
2
     clkCounter <= clkCounter + 1; 
3
 end process;
Das könnte abgekürzt genauso auch so beschrieben werden:
1
 -- process (clkCounter) begin 
2
     clkCounter <= clkCounter + 1; 
3
 -- end process;
Und damit auch so:
1
  clkCounter <= clkCounter + 1;
Und das alles ist letztlich nichts anderes als eine in der Praxis meist 
nutzlose kombinatorische Schleife: 
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html
Gast #3217439
Lesenswert?

Gemeint ist wahrscheinlich
1
process (clk)
2
begin
3
   if rising_edge(clk) then
4
        clkCounter <= clkCounter + 1;
5
   end if;
6
end process;

Dann kann man in der Tat das MSB von clkCounter abgreifen.
Gast #3218230
Lesenswert?

Ich habe mir gerade überlegt: Eigentlich könnte es doch laufen. Die 
Zählerei = Addition um 1 wird ja immer mittels JK-FFs realiert. 
Abgebildet auf DFFs braucht es nur einen Übergriff zwischen einem FF und 
seinem Nachbarn. Das ist auch asynchron Hazardfrei. Bleibt nur das 
Problem des Umspringens. Ohne ausdrücklichen Reset und nur mit den FF 
könnte es gehen.
Gast #3219795
Lesenswert?

Lothar Miller schrieb:
> Es gibt in einem FPGA keine JK-Flipflops.
Klar, deshalb sprach ich ja davon, dass man sie auf DFFs abbilden muss. 
Ausschlaggebend ist mit Bezug auf das Thema, dass ein FF immer nur von 
einem Vorgänger gespeist wird und es damit keine diskrepanten 
Interpretationen von Zuständen gibt / geben muss - bis eben auf einen 
Resetfall, den man aber nicht unbedingt braucht.
Moderator (Firma: Titel) Persönliche Seite #3220145
Lesenswert?

E. M. schrieb:
> Du weisst, wie ein JK-FF funktioniert?
Ja. Du meinst die "Schwingungen", die ein JK-FF (theoretisch) machen 
wird, wenn J=K=1 sind.
> Das lässt sich mit etwas Logik abbilden.
Ja, mach doch. In einem FPGA. Mit LUTs und DFFs. So, dass dahinter ein 
verwertbarer Takt rauskommt (darum geht es letztlich) und nicht 
irgendein "halbanaloges" Signal (das bekommst du nämlich mit üblichen 
kombinatorischen Schleifen)...

Ich habe das nur mit dem Ringoszillator geschafft. Und das war schon mal 
soweit nachvollziehbar, dass Andere das auch hinbekommen haben: 
http://dangerousprototypes.com/docs/CPLD_ring_oscillator

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