Forum: FPGA, VHDL & Co. Auswahl Taktausgang


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Meth J. (arren)


Angehängte Dateien:

Lesenswert?

Guten Abend,

als Teil einer Ausarbeitung, kümmere ich mich zur Zeit um eine 
'Frequenzauswahl', welche nur einen Teil eines ganzen Projekts abbildet 
um anschließend auf Spartan dargestellt zu werden.

Durch Auswahl von 'TONF1K' bzw. 'TONF05K' kann zwischen zwei Frequenzen 
(1kHz und 0,5kHz) gewählt werden. Die ausgewählte Frequenz wird als 
'Ton' ausgegeben, um es als akustisches Signal auszugeben. Die 
Eingangsfrquenz 'clk' ist 50MHz.

Als Anfänger habe ich mich bestmöglichst in das Thema eingearbeitet, das 
Resultat seht ihr im folgenden als Quellcode.

Als Grundlage für die Frequenzdarstellung dient Lothar Miller's 'Hello 
World' (lothar-miller.de/s9y/archives/80-Hello-World!.html)

Im ISE Project Navigator hab den Synthesizer über den Quellcode laufen 
lassen, der mir einiges an Fehlern ausgegeben hat, die ich soweit, bis 
auf die unter dem Quellcode aufgeführten, beseitigen konnte.

Meine Gedanken zu den restlichen Fehlern, habe ich unten aufgeführt.


1
1  library IEEE;     
2
2  use IEEE.STD_LOGIC_1164.ALL;     
3
3  use IEEE.NUMERIC_STD.ALL;     
4
4       
5
5  entity Tonbaustein is     
6
6      Port ( clk, TonF1K, TonF05K : in  bit;     
7
7             Ton : out  STD_LOGIC);     
8
8  end Tonbaustein;     
9
9       
10
10  architecture Verhalten of Tonbaustein is     
11
11      
12
12  signal TonF1K_INT, TonF05K_INT: bit;    
13
13  signal c : integer range 0 to 49999 := 0;    
14
14  signal d : integer range 0 to 99999 := 0;    
15
15  signal x : std_logic:= '0';      
16
16  signal y : std_logic:= '0';      
17
17      
18
18  begin     
19
19      
20
20  FT1:   process (clk, TonF1K_INT, c, x)    
21
21      
22
22   begin      
23
23      
24
24  wait until rising_edge(clk);        -- warten bis zum nächsten Takt   
25
25        if (c<49999) then            -- 0…49999 = 50000 Takte = 20µs Sekunde bei 50MHz     
26
26            c <= c+1;                -- wenn kleiner: weiterzählen     
27
27        else                         -- wenn Zählerende erreicht:     
28
28            c <= 0;                  -- Zähler zurücksetzen     
29
29            x <= not x;              -- und Signal x togglen     
30
30        end if;     
31
31     end process FT1;    
32
32     TONF1K_INT <= x;                -- Signal x an Frequenzteiler ausgeben     
33
33      
34
34      
35
35  FT2:   process (clk, TonF05K_INT, d, y)    
36
36      
37
37   begin      
38
38      
39
39  wait until rising_edge(clk);        -- warten bis zum nächsten Takt   
40
40        if (d<99999) then            -- 0…99999 = 100000 Takte = 10µs Sekunde bei 50MHz     
41
41            d <= d+1;                -- wenn kleiner: weiterzählen     
42
42        else                         -- wenn Zählerende erreicht:     
43
43            d <= 0;                  -- Zähler zurücksetzen     
44
44            y <= not y;              -- und Signal y togglen     
45
45        end if;     
46
46     end process FT2;    
47
47     TONF05K_INT <= y;                -- Signal y an Frequenzteiler ausgeben     
48
48      
49
49      
50
50  UND: process (TONF1K_INT, TONF05K_INT, TONF1K, TONF05K,Ton)    
51
51      
52
52  begin      
53
53      
54
54      
55
55    if   TONF1K='1' and TonF05K='0' then Ton <= TonF1K_INT;
56
56    else if  TONF1K='0' and TonF05K='1' then Ton <= TonF05K_INT;
57
57    else if  TONF1K='0' and TonF05K='0' then Ton <= '0';
58
58    else if  TONF1K='1' and TonF05K='1' then Ton <= '0';
59
59        end if;     
60
60      
61
61      
62
62     end process UND;    
63
63      
64
64      
65
65  end Verhalten;

1
Compiling vhdl file "F:/Xilinx/TAKT/TAKTBeispiel.vhd" in Library work.
2
Entity <tonbaustein> compiled.
3
ERROR:HDLParsers:808 - "F:/Xilinx/TAKT/TAKTBeispiel.vhd" Line 24. rising_edge can not have such operands in this context.
4
ERROR:HDLParsers:1405 - "F:/Xilinx/TAKT/TAKTBeispiel.vhd" Line 24. statement WAIT not allowed in a process with a sensitivity list
5
ERROR:HDLParsers:800 - "F:/Xilinx/TAKT/TAKTBeispiel.vhd" Line 32. Type of TONF1K_INT is incompatible with type of x.
6
ERROR:HDLParsers:808 - "F:/Xilinx/TAKT/TAKTBeispiel.vhd" Line 39. rising_edge can not have such operands in this context.
7
ERROR:HDLParsers:1405 - "F:/Xilinx/TAKT/TAKTBeispiel.vhd" Line 39. statement WAIT not allowed in a process with a sensitivity list
8
ERROR:HDLParsers:800 - "F:/Xilinx/TAKT/TAKTBeispiel.vhd" Line 47. Type of TONF05K_INT is incompatible with type of y.
9
ERROR:HDLParsers:800 - "F:/Xilinx/TAKT/TAKTBeispiel.vhd" Line 55. Type of Ton is incompatible with type of TonF1K_INT.
10
ERROR:HDLParsers:800 - "F:/Xilinx/TAKT/TAKTBeispiel.vhd" Line 56. Type of Ton is incompatible with type of TonF05K_INT.
11
ERROR:HDLParsers:164 - "F:/Xilinx/TAKT/TAKTBeispiel.vhd" Line 62. parse error, unexpected PROCESS, expecting IF

1
 Zu Linie 24 und 39:
 An dieser Stelle reichen meine Kenntnisse nicht aus um die 
Ungereihmtheit zu verstehen. 'rising_edge' dürfte hier in einer 
abgeänderten Konstelation richtig sein, 'wait until' scheint hier das 
Problem darzustellen.
1
 Zu Linie 32 und 47:
 Wie anfangs erwähnt ist der Qeullcode zur Frequenzgenerierung von 
Lothar Miller übernommen und weitestgehend angepasst. Die Konstelation 
der Zeile 32 ist soweit übernommen, macht hier jedoch keinen Sinn, was 
ich nicht ganz nachvollziehen kann. Ein Einschub hinter die Zeile 31 
bzw. 46 bringt kein Ergebnis.
1
 Zu Linie 50,55,56:
 Die Überlegung hier ist: Liegt das Signal 'TONF1K' an (und an TONF05K 
nicht), so soll 1kHz an 'Ton' ausgegeben werden. Das Gegenteil gilt für 
0,5kHz. Liegen beide Signale gleichzeitig am Eingang an bzw. nicht an, 
so wird nichts ausgegeben. Das war soweit die Überlegung, die sich 
jedoch nicht umsetzten lässt.


Könnt ihr mir bei den offenen Fehlern behilflich sein?

von Duke Scarring (Gast)


Lesenswert?

Jack J. schrieb:
> 20  FT1:   process (clk, TonF1K_INT, c, x)
> 21
> 22   begin
> 23
> 24  wait until rising_edge(clk);

Wenn Du 'wait until' im process verwendest, muss die Sensitivity-Liste 
leer bleiben:
1
...
2
16  signal y : std_logic:= '0';   
3
17      
4
18  begin     
5
19      
6
20  FT1:   process
7
21      
8
22   begin      
9
23      
10
24  wait until rising_edge(clk);        -- warten bis zum nächsten Takt   
11
25        if (c<49999) then            -- 0…49999 = 50000 Takte = 20µs Sekunde bei 50MHz     
12
26            c <= c+1;           
13
...

Duke

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


Lesenswert?

Jack J. schrieb:
1
:
2
FT2:   process (clk, TonF05K_INT, d, y)
3
:
4
UND: process (TONF1K_INT, TONF05K_INT, TONF1K, TONF05K,Ton)
5
:
Es sit keine gute Idee, ohne Nachzudenken einfach mal alle irgendwie 
beteiligten Signale in die Sensitivlisten zu schreiben.

Ich würde statt des zweiten Prozesses mit der felherhafterweise 
überlangen Sensitivliste ("Ton" ist da zu viel) sowas "concurrent" oder 
"nebenläufig" schreiben:
1
    Ton <= TonF1K_INT   when  TONF1K='1' and TonF05K='0'  else
2
           TonF05K_INT  when  TONF1K='0' and TonF05K='1'  else
3
           '0';
Das liest sich m.E. wesentlich flüssiger und es gibt sicher kein Problem 
mit der Sensitivliste...

Duke Scarring schrieb:
> Wenn Du 'wait until' im process verwendest, muss die Sensitivity-Liste
> leer bleiben
So sagt es auch ie Fehlermeldung:
>>> statement WAIT not allowed in a process with a sensitivity list
Siehe auch
http://www.lothar-miller.de/s9y/archives/16-Takt-im-Prozess.html
http://www.lothar-miller.de/s9y/archives/47-wait-im-Prozess.html
http://www.lothar-miller.de/s9y/archives/43-Ein-oder-Zwei-Prozess-Schreibweise-fuer-FSM.html

BTW: in diese Fall hier würde man nicht 2 komplette unterschiedliche 
Zähler aufbauen, sondern einfach nur den Ladewert des Zählers ändern.

: Bearbeitet durch Moderator
von PurlsOf (Gast)


Lesenswert?

There is a mapping file serwehome (each FPGA board has its own) that 
maps certain features to known ports. That way you can just refer to clk 
and not worry about which physical pin its on. This also makes it much 
easier to work with peripherals because you can use the writing on the 
board to match up the pins, again without having to know which one goes 
where.Still, if you really want to know, you can dig up the mapping 
file. I haven't touched it for months but it should be relatively 
painless

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.