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
@ 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
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?
> 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 ;-)
@ 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
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...
ups, da war beim tippen schon jemand schneller... vielen Dank, werde mir deinen code mal zu Gemüte führen jetzt.
@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"?
@ 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
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?!
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
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...
hallo, versuch mal mit: signal counter: integer range 0 to 499:=499; oder besser statt signal einfach variable. tschüß
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.