www.mikrocontroller.net

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


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
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;

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;


MFG
Falk

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
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
    if(counter = 0) then
      counter <= 499;
      Q1_int <= not Q1_int;
    else
      counter <= counter - 1;
    end if;
  end if;
end process;

Q1 <= Q1_int;

end architecture Behavioral;

MFG
Falk

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Gast (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Gast (Gast)

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

Nein, es fehlt ein begin.
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)
begin
  if rising_edge(clk1) then
    if(counter = 0) then
      counter <= 499;
      Q1_int <= not Q1_int;
    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"?

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So gehts, ich hatte einfach mal angenommen, dass die 
Standarsbibliotheken schon in deinem Code drinstehen.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.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)
begin
  if rising_edge(clk1) then
    if(counter = 0) then
      counter <= 499;
      Q1_int <= not Q1_int;
    else
      counter <= counter - 1;
    end if;
  end if;
end process;

Q1 <= Q1_int;

end architecture Behavioral;

MFg
Falk

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Hallo Hallo (Firma: gast) (hamdou)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

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

Autor: mac4ever (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
architecture Behavioral of clktest is
begin

signal counter: integer range 0 to 499; -- muss vor das obrige begin
signal Q1_int: std_logic; -- das gleich auch hier

begin process (clk1) -- begin kommt NACH der process-Deklaration
...

Korrigiert:
architecture Behavioral of clktest is

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

begin

process (clk1)
begin
...


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.