Forum: FPGA, VHDL & Co. Takt durch FPGA leiten


von Gast (Gast)


Lesenswert?

Hallo,

ich würde gerne einen am FPGA anliegenden Takt durch ihn durchschleusen 
an einen Ausgang. An diesem Ausgang ist ein Transceiver mit einem High 
aktivem OE geschaltet. Hintergrund ist: Ich möchte zum einem den 
externen Takt am FPGA anliegenden Takt überprüfen von der Frequenz her 
und den Transceiver gleich mit. Am besten wäre es wenn der außen 
anliegende Takt noch durch 1000 geteilt würde, da ich das besser mit dem 
Oszilloskop messen kann.

Ich habe versucht das Ganze in vhdl zu formulieren, aber leider passts 
noch nicht ganz, bekomme immer parse error...

entity CLKTEST is
port ( clk1 : in std_logic;
        OE1 : out std_logic:= '1';
         Q1 : out std_logic);
end entity CLKTEST;

architecture Behavioral of CLKTEST is
signal counter: integer range 0 to 99 := 99;

begin process (clk1)
if rising_edge(clk1) then
   if(counter = 0) then
    counter := 99;
    Q1 <='1';
   else
       counter := counter - 1;
               Q1 <='0';
  end if;
end if;
end process;
end architecture Behavioral;

Hm, programmiere sonst nur in c, denke da stecken Denkfehler drin...

Danke, Fred

von Falk B. (falk)


Lesenswert?

@ Gast (Gast)

>ich würde gerne einen am FPGA anliegenden Takt durch ihn durchschleusen

Welche Frequenz?

>anliegende Takt noch durch 1000 geteilt würde, da ich das besser mit dem
>Oszilloskop messen kann.

macht ein einfacher Zähler.
1
entity CLKTEST is
2
port ( clk1 : in std_logic;
3
        OE1 : out std_logic:= '1';
4
         Q1 : out std_logic);
5
end entity CLKTEST;
6
7
architecture Behavioral of CLKTEST is
8
9
signal counter: integer range 0 to 99;
10
11
begin process (clk1)
12
  if rising_edge(clk1) then
13
    if(counter = 0) then
14
      counter <= 99;
15
      Q1 <='1';
16
    else
17
      counter <= counter - 1;
18
      Q1 <='0';
19
    end if;
20
  end if;
21
end process;
22
end architecture Behavioral;


MFG
Falk

von Gast (Gast)


Lesenswert?

Habs gelöst bekommen denke ich, mit ein wenig Recherche im Imternet:

entity clktest is
port( clk1:in bit;
       OE1: out bit;
       Q1:out bit);
end clktest;

architecture behavior of clktest is
begin
process(clk1)
variable cnt : integer range 0 to 999;
begin
OE1<='1';
if(clk1'event and clk1='1') then
if(cnt=999)then
cnt:=0;
Q1<='1';
else
cnt := cnt+1;
Q1<='0';
end if;
end if;
end process;
end behavior;


Wobei die aus einem Beispiel stammt wo aus 25MHZ 1Hz generiert wird, der 
Teiler ist bei diesem Beispiel aber nur 12500 und nicht wie von mir 
erwartet 25000. Wie kann dies sein?

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


Lesenswert?

>    counter := 99;
ist eine Zuweisung an eine Variable.
Variablen werden im Prozess definiert und ändern ihren Wert sofort bei 
der Zuweisung.

Übelicherweise solltest du Signale verwenden (wie schon von dir 
definiert).
>   counter <= 99;
Die Zuweisung an Signale erfolgt im getakteten Prozess mit der nächsten 
aktiven Flanke (steigend oder fallend).

>anliegende Takt noch durch 1000 geteilt würde, da ich das besser mit dem
so wird der Takt aber erst durch 100 geteilt ;-)

von Falk B. (falk)


Lesenswert?

@ Gast (Gast)

>Teiler ist bei diesem Beispiel aber nur 12500 und nicht wie von mir
>erwartet 25000. Wie kann dies sein?

Der Teiler im Beispiel ist 1000, nämlich von 0...999.
wobei dein Ausgangstakt messtechnisch eher ungünstig ist, da er nur 
einen Takt HIGH, danach aber 999 LOW ist. Besser so.
1
entity CLKTEST is
2
port ( clk1 : in std_logic;
3
        OE1 : out std_logic:= '1';
4
         Q1 : out std_logic);
5
end entity CLKTEST;
6
7
architecture Behavioral of CLKTEST is
8
9
signal counter: integer range 0 to 499;
10
signal Q1_int: std_logic; 
11
12
begin process (clk1)
13
  if rising_edge(clk1) then
14
    if(counter = 0) then
15
      counter <= 499;
16
      Q1_int <= not Q1_int;
17
    else
18
      counter <= counter - 1;
19
    end if;
20
  end if;
21
end process;
22
23
Q1 <= Q1_int;
24
25
end architecture Behavioral;

MFG
Falk

von Gast (Gast)


Lesenswert?

Und noch etwas anderes dazu was mir nicht sinnig erscheint:

Nur alle 1000 clks geht der Ausgang Q1 auf High-Pegel um gleichzeitig 
auf 0 zurückgesetzt zu werden und beim nächsten clk schon wieder auf 
Low-Pegel.
D.H doch das ich 999xclk eine Low-Pegel am Ausgang Q1 sehe und nur alle 
1000xclk einen High-Pegel.

Ich hätte ja gerne 500xclk nen High-Pegel und 500xclk nen Low-Pegel am 
Ausgang Q1...

von Gast (Gast)


Lesenswert?

ups, da war beim tippen schon jemand schneller...
vielen Dank, werde mir deinen code mal zu Gemüte führen jetzt.

von Gast (Gast)


Lesenswert?

@Falk: ich bekomm den code nicht sythetisiert... kann das am ISE 10.1 
liegen?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
library UNISIM;
use UNISIM.VComponents.all;

entity CLKTEST is
port ( clk1 : in std_logic;
        OE1 : out std_logic:= '1';
         Q1 : out std_logic);
end entity CLKTEST;

architecture Behavioral of CLKTEST is

signal counter: integer range 0 to 499;
signal Q1_int: std_logic;

begin process (clk1)
  if rising_edge(clk1) then        <-Line 42. parse error, unexpected IF
    if(counter = 0) then
      counter <= 499;
      Q1_int <= not Q1_int;
    else                           <-Line 46. parse error, unexpected 
ELSE
      counter <= counter - 1;
    end if;
  end if;
end process;

Q1 <= Q1_int;

end architecture Behavioral;




Und muß die letzt Q1 Signalzuweisung nicht vor das "end process"?

von Falk B. (falk)


Lesenswert?

@ Gast (Gast)

>@Falk: ich bekomm den code nicht sythetisiert... kann das am ISE 10.1
>liegen?

Nein, es fehlt ein begin.
1
entity CLKTEST is
2
port ( clk1 : in std_logic;
3
        OE1 : out std_logic:= '1';
4
         Q1 : out std_logic);
5
end entity CLKTEST;
6
7
architecture Behavioral of CLKTEST is
8
9
signal counter: integer range 0 to 499;
10
signal Q1_int: std_logic; 
11
12
begin
13
14
process (clk1)
15
begin
16
  if rising_edge(clk1) then
17
    if(counter = 0) then
18
      counter <= 499;
19
      Q1_int <= not Q1_int;
20
    else
21
      counter <= counter - 1;
22
    end if;
23
  end if;
24
end process;
25
26
Q1 <= Q1_int;
27
28
end architecture Behavioral;

>Und muß die letzt Q1 Signalzuweisung nicht vor das "end process"?

Nein, das ist eine concurrent Anweisung. Wenn man es in den Prozess 
innerhalt der if rising_edge() schreiben würde, wäre der Taktausgang 
nochmal um einen Takt verzögert. Wäre in diesem Fall egal, im 
allgemeinen aber nicht.

MFG
Falk

von Gast (Gast)


Lesenswert?

Ah, ok das mit dem Prozess habe ich verstanden.

Das begin muß hinter die architecture anweisung oder?

architecture Behavioral of clktest is
begin

signal counter: integer range 0 to 499;
signal Q1_int: std_logic;

begin process (clk1)

  if (clk1'event and clk1='1') then <-parse error, unexpected SIGNAL
    if(counter = 0) then



Obwohl das immernoch Fehler bringt, jetzt sogar 4, versteh ich nicht?!

von Falk B. (falk)


Lesenswert?

So gehts, ich hatte einfach mal angenommen, dass die 
Standarsbibliotheken schon in deinem Code drinstehen.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entity CLKTEST is
7
port ( clk1 : in std_logic;
8
        OE1 : out std_logic:= '1';
9
         Q1 : out std_logic);
10
end entity CLKTEST;
11
12
architecture Behavioral of CLKTEST is
13
14
signal counter: integer range 0 to 499;
15
signal Q1_int: std_logic; 
16
17
begin
18
19
process (clk1)
20
begin
21
  if rising_edge(clk1) then
22
    if(counter = 0) then
23
      counter <= 499;
24
      Q1_int <= not Q1_int;
25
    else
26
      counter <= counter - 1;
27
    end if;
28
  end if;
29
end process;
30
31
Q1 <= Q1_int;
32
33
end architecture Behavioral;

MFg
Falk

von Gast (Gast)


Lesenswert?

Die Libs standen ka uch drin, wie Du im Posting von 20:33 erkennen 
kannst.

Ich hab jetzt einfach alles mal mit STRG+A ENTF rausgeschmissen und 
deinen code eingefügt, siehe da, lässt sich synthetisieren. Sehr 
merkwürdig, da war von der Syntax her eigentlich nichts anders... der 
Parser scheint empfindlich zu sein...

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

hallo,

versuch mal mit:
signal counter: integer range 0 to 499:=499;
oder besser statt signal einfach variable.
 tschüß

von mac4ever (Gast)


Lesenswert?

>Ich hab jetzt einfach alles mal mit STRG+A ENTF rausgeschmissen und
>deinen code eingefügt, siehe da, lässt sich synthetisieren. Sehr
>merkwürdig, da war von der Syntax her eigentlich nichts anders... der
>Parser scheint empfindlich zu sein...

Falsch! Dein Code hat im Vergleich zu Falks folgende Fehler:
1
architecture Behavioral of clktest is
2
begin
3
4
signal counter: integer range 0 to 499; -- muss vor das obrige begin
5
signal Q1_int: std_logic; -- das gleich auch hier
6
7
begin process (clk1) -- begin kommt NACH der process-Deklaration
8
...

Korrigiert:
1
architecture Behavioral of clktest is
2
3
signal counter: integer range 0 to 499;
4
signal Q1_int: std_logic;
5
6
begin
7
8
process (clk1)
9
begin
10
...

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.