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
|
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.
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.
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?