Forum: FPGA, VHDL & Co. Pinbelegung Notenerzeugung mit FPGA (Altera DE2-115) mit VHDL Code


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 Marcel S. (fpga_user)


Angehängte Dateien:

Bewertung
2 lesenswert
nicht lesenswert
Servus liebe FPGA-Freunde...

Ich habe einen VHDL-Code gefunden, mit dem sich Töne über ein FPGA Board 
erzeugen lassen.

Den Code habe ich auch eingegeben. Beim Kompilieren treten keine Fehler 
auf, aber beim Überspielen auf das Board kommt bei 82% ein Fehler.

Ich bin mir auch nicht sicher, wie ich die Pinbelegung vornehmen soll.
Kennt sich da jemand aus und kann mir weiterhelfen?

Hier mal der VHDL-Code, ich hoffe den habe ich richtig aus der 
Präsentation (liegt als Anhang bei) übernommen:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity PlayNote is
6
Port ( clk : in STD_LOGIC;
7
note : in integer;
8
audio : out STD_LOGIC
9
);
10
end PlayNote ; 
11
12
architecture Behavioral of PlayNote is
13
signal c: integer range 0 to 24999999 := 0; -- 0,25s bei 100MHz f_osc
14
signal x : std_logic := '0';
15
type note_type is array(0 to 12)of integer;
16
signal notes: note_type;
17
18
begin
19
-- 12 half tones starting from C0
20
notes <= ( 382219, 360773, 340529, 321409, 303370, 286344,
21
270277, 255102, 240789, 227272, 214518, 202478, 191113 );
22
23
process begin
24
wait until rising_edge(clk ); --warten bis zum nächsten Takt
25
if (c<notes(note)/2) then -- 100 MHz-Zähler bis zum Max.-wert für Note laufen lassen
26
c<= c+1; -- wenn kleiner :weiterzählen
27
else --  wenn Zählerende erreicht:
28
c<= 0; -- Zähler zurücksetzen
29
x <= not x ; -- und Signal x togglen -> Rechtecksignal
30
end if;
31
end process;
32
audio <=x; -- Signal x ausgeben 
33
end Behavioral;
34
35
library IEEE;
36
use IEEE.STD_LOGIC_1164.ALL;
37
use IEEE.NUMERIC_STD.ALL;
38
39
entity GenerateNotes is
40
Port (clk : in STD_LOGIC; -- Eingabe: 100 MHz-Takt
41
note : out integer -- Ausgabe:aktuellzuspielendeNote
42
);
43
end GenerateNotes;
44
45
architecture Behavioral of GenerateNotes is
46
47
type melody_type is array(0 to 15) of integer;
48
signal melody:melody_type;
49
signal c : integer range 0 to 15 := 0; --Noten C, C#, D, D#, E, ...H
50
signal count : integer range 0 to 199999999 := 0; 
51
52
begin
53
-- C D E F G G A A A A G A A A A G
54
-- melody <= (0, 2, 4, 5, 7, 7, 9, 9, 9, 9, 7, 9, 9, 9, 9, 7);
55
melody <= (12, 10, 12, 7, 3, 7, 0, 0, 12, 10, 12, 7, 3, 7, 0, 0);
56
57
process begin
58
wait until rising_edge(clk ); -- warten bis zum nächsten Takt
59
if (count<25000000) then -- 250000000 = 1/4 Sekunde bei 100MHz
60
count <= count+1; -- wenn kleiner: weiterzählen
61
else -- wenn Zählerende erreicht:
62
count <= 0; --  Zähler zurücksetzen 
63
c<=c+ 1; -- und Notenindex für “melody” hochzählen
64
end if;
65
end process;
66
note <= melody(c); -- aktuellen Notenwert ausgeben
67
end Behavioral;
68
69
library IEEE;
70
use IEEE.STD_LOGIC_1164.ALL;
71
72
entity
73
sound_top is -- Schnittstelle nach “aussen”:externe FPGA-Anschlüsse
74
Port (clk : in STD_LOGIC; -- clk (100MHz)kommt rein
75
audioL : out STD_LOGIC; -- Stereo Audio kommt raus...
76
audioR: out STD_LOGIC);
77
end
78
sound_top;
79
80
architecture Behavioral of sound_top is
81
COMPONENT PlayNote
82
PORT(
83
clk : IN std_logic;
84
note : IN integer;
85
audio : OUT std_logic
86
);
87
END COMPONENT;
88
COMPONENT GenerateNotes
89
PORT(
90
clk : IN std_logic;
91
note : OUT integer
92
);
93
END COMPONENT;
94
95
signal note: integer;
96
-- “Leitung”, um generierte Note an Tongenerator weiterzuleiten
97
begin
98
SoundGen: PlayNote PORT MAP (
99
-- 1. Instanziierung des Tongenerators
100
clk => clk,
101
-- “clk” von “aussen”
102
note => note,
103
-- “note” vom “note-Signal
104
audio => audioL
105
-- “audio” nach “aussen” an linken Kanal
106
);
107
SoundGen2: PlayNote PORT MAP (
108
clk => clk,
109
note => note,
110
audio => audioR
111
-- “audio” nach “aussen” an rechten Kanal
112
);
113
GenNote: GenerateNotes PORT MAP (
114
clk => clk,
115
note => note
116
-- aktuelle Note mit signal “note” verbinden
117
);
118
end Behavioral;

Vielen Dank schonmal für eure Antworten ;)

von Valko Z. (hydravliska)


Bewertung
0 lesenswert
nicht lesenswert
Was für Fehler?
Was heisst "Überspielen"?
Was meinst du mit "Kompilieren" - Synthese?
Wie hast du die Pinbegelegung jetzt realisiert?

Gruss

von Marcel S. (fpga_user)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke Valko Zapalko für deine Antwort.

> Was für Fehler?
> Was heisst "Überspielen"?
> Was meinst du mit "Kompilieren" - Synthese?

Ich arbeite mit "Quartus II" als Software. Damit kann man den Quellcode 
erst kompilieren und dann mit Hilfe des "Programmers" den von der 
Software erstellten Assembler-Code auf den Speicher des Boards 
übertragen.



> Wie hast du die Pinbegelegung jetzt realisiert?
Die Pinbelegung hatte ich bisher realisiert, indem ich für den output 
also für die Tonausgabe den Pin mit der Bezeichnung AUD_XCK genommen. 
Für die clock input hatte ich CLOCK_50 genommen und für die ersten paar 
inputs der noten (also note[0], note[1], note[2] und so weiter, die 
jeweiligen pins für die schalter am board. Das heißt, wenn ich einen von 
den 18 Schaltern am Board bediene, soll er die entsprechende note 
spielen.

Mir erschließt sich aber nicht, warum es dort note[0] bis note[31] als 
input gibt, ich habe ja schließlich nur 12 noten.

Vielen Dank schon mal.

: Bearbeitet durch User
von Valko Z. (hydravliska)


Bewertung
0 lesenswert
nicht lesenswert
Dein Code  sieht so aus als brauchst du 100MHz. Liefert CLOCK_50 die 100 
MHz?

Ich kenne mich mit Quartus nicht aus aber bist du sicher, dass du den 
"sound_top" implementiert hast? Der hat kein Eingang/Ausgang der "note" 
heisst...

von Marten W. (goldmomo) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Nur mal so am Rande, AUD_XCK ist der Master-Clock Eingang vom WM8731 auf 
dem DE2-115 Board.

Wenn du da Sound rausbekommen willst, solltest du vielleicht mal das 
Datenblatt anschauen.

Dem WM8731 konfigurierst du über I2C Interface, für die Audioaten gibt’s 
ein Audiointerface (DACDAT,…).

Funktionieren tut die Soundausgabe schon (ich habe auf dem DE2-115 schon 
einiges gemacht, finde den Thread bloß nicht), du solltest aber dringend 
das Datenblatt studieren bevor du irgendwas anschließt, sonst wirst du 
keinen Erfolg haben.

von Weltbester FPGA-Pongo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ho,ho - da hat einer aber noch einen weiten Weg zu gehen. Ich glaube, 
hier hängt es mindestens am PIN-file / UCF und gfs noch an der 
Ansteuerungsoption der Wandler. Ich würde da etwas einfacher anfangen 
und erst mal PWM machen.

http://embdev.net/topic/202140#new

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
> Das heißt, wenn ich einen von den 18 Schaltern am Board bediene, soll
> er die entsprechende note spielen.
Das gibt deine Top-Level Entity aber nicht her:
1
sound_top is -- Schnittstelle nach “aussen”:externe FPGA-Anschlüsse
2
Port (clk : in STD_LOGIC; -- clk (100MHz)kommt rein
3
      audioL : out STD_LOGIC; -- Stereo Audio kommt raus...
4
      audioR: out STD_LOGIC);
5
end
Wo sind denn da die erwähnten Taster?

Was macht denn die Simulation? Wie sieht deine Testbench aus? Warum 
klebt der ganze Quelltext am linken Rand? Das ist kaum lesbar... :-/

Was hast du denn bisher schon mit FPGAs gemacht? Wenigstens die 
blinkende LED (das "Hello World!" der Hardware) und ein Lauflicht? Mir 
scheint aber, du versuchst diese Melodieerzeugung ganz ohne jegliche 
Vorkenntnisse zu implementieren. Falls das so ist: es wird ein steiniger 
Weg...

Marcel Schmidt schrieb:
> Mir erschließt sich aber nicht, warum es dort note[0] bis note[31] als
> input gibt, ich habe ja schließlich nur 12 noten.
Wo gibt es da note[0] bis [31] als Input?
So wie ich es sehe gibt es einen Integer als Übergabewert. Dieser 
Integer wird zum Indizieren einer Tabelle mit Noten verwendet. Es würde 
aber ein "integer range 0 to 11" ausreichen...

von M. D. (wpmd)


Bewertung
-1 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
> Ich arbeite mit "Quartus II" als Software. Damit kann man den Quellcode
> erst kompilieren und dann mit Hilfe des "Programmers" den von der
> Software erstellten Assembler-Code auf den Speicher des Boards
> übertragen.

Ich kenne mich mit dem Quartus II zwar nicht aus, aber meinst du 
wirklich Assembler? Entweder stehe ich grad total auf dem Schlauch, aber 
ich habe noch nie was von Assembler im zusammenhang mit VHDL gehört. 
Vielleicht kann mich hier ja jemand aufklären?!?

Du solltest bei deinem Top Level eigentlich nur einen Eingang (CLK) und 
zwei Ausgänge (audio L/R) haben die du auf deine physikalischen Pins 
legen musst.

: Bearbeitet durch User
von Fpgakuechle K. (fpgakuechle) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
M. D. schrieb:
> Ich kenne mich mit dem Quartus II zwar nicht aus, aber meinst du
> wirklich Assembler? Entweder stehe ich grad total auf dem Schlauch, aber
> ich habe noch nie was von Assembler im zusammenhang mit VHDL gehört.
> Vielleicht kann mich hier ja jemand aufklären?!?

Ja das ist so, in Quartus II heisst das Tool zum Erzeugen der Files für 
den programmer assembler, bei Xilinx wäre das bitgen.

Siehe Bild 18-1 in

http://www.altera.com/literature/hb/qts/qts_qii53022.pdf

MfG,

von Marcel S. (fpga_user)


Bewertung
-1 lesenswert
nicht lesenswert
Wie kann ich meine clock von 50 MHz auf 100 MHz bringen?

Kann ich dann anstatt
1
entity
2
sound_top is 
3
Port (clk : in STD_LOGIC; 
4
...
5
6
einfach
7
8
entity
9
sound_top is 
10
Port (clk*2 : in STD_LOGIC;

schreiben?

: Bearbeitet durch User
von M. D. (wpmd)


Bewertung
0 lesenswert
nicht lesenswert
Fpga Kuechle schrieb:
> Ja das ist so, in Quartus II heisst das Tool zum Erzeugen der Files für
> den programmer assembler, bei Xilinx wäre das bitgen.
>
> Siehe Bild 18-1 in
>
> http://www.altera.com/literature/hb/qts/qts_qii53022.pdf
>
> MfG,

Ok, Danke für die Erläuterung!

von M. D. (wpmd)


Bewertung
0 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
> Port (clk*2 : in STD_LOGIC;

Das wär zu schön wenn sowas funktionieren würde.
Alternativ zum erzeugen einer 100MHz clock kannst du aber auch einfach 
alle deine Zählerwerte halbieren und mit der 50MHz clock arbeiten.

von Marcel S. (fpga_user)


Bewertung
0 lesenswert
nicht lesenswert
M. D. schrieb:

> Alternativ zum erzeugen einer 100MHz clock kannst du aber auch einfach
> alle deine Zählerwerte halbieren und mit der 50MHz clock arbeiten.

Was genau meinst du mit Zäherwerten?

Kannst du mir das anhand von meinem Quelltext, siehe oben erklären?

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
> Was genau meinst du mit Zäherwerten?
Naja, mit "zäher" hat das nichts zu tun...

> Was genau meinst du
Sowas z.B.:
> if (count<25000000) then -- 250000000 = 1/4 Sekunde bei 100MHz
Oder das hier:
> notes <= ( 382219, 360773, 340529, 321409, 303370, 286344,
> 270277, 255102, 240789, 227272, 214518, 202478, 191113 );
Einfach gesagt: alles, womit eine Zeit oder eine Dauer abgezählt wird. 
Denn Zeiten werden in FPGAs über Zähler gemacht: ein Zähler, der bei 
50MHz auf 50Mio zählt, hat dafür genau 1 Sekunde gebraucht. Wenn Du 
440Hz haben willst, dann darfst du nur auf 1/440 von 50Mio zählen: 
113636 (und was wäre da wohl der Wert für 100MHz? Und: findest du diesen 
Wert irgendwo wieder?)

von Martin (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Ich stelle fest es gibt keinen reset.
Und
wait until rising_edge(clk );

keine Ahnung  ob  die Synthese  das nicht mag, wie wäre
es mit dem guten alten


    process(clk, reset)
    begin
        if reset = '1' then
            counter  <= (others => '0');
        elsif clk'event and clk = '1' then
            counter <= counter+1;

        end if;
    end process;


http://stackoverflow.com/questions/9989913/vhdl-how-to-use-clk-and-reset-in-process

Der reset käme  dann von aussen, vom Taster.

von M. D. (wpmd)


Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> process(clk, reset)
>     begin
>         if reset = '1' then
>             counter  <= (others => '0');
>         elsif clk'event and clk = '1' then
>             counter <= counter+1;
>
>         end if;
>     end process;

Aber auch nur wenn man wirklich einen asynchronen reset haben möchte...

von Kritiker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hat sich mal jemand das Original PDf angesehen? Dort steht bei der 
Frequenzgeneration:

 f = 440 Hz = 1/t => Periodendauer 1/440s = 227,272 ms

Soso! An der Universität Dortmund sind 440Hz also eine Periodendauer von 
227ms. Na Danke. Dass das niemandem auffällt. Die daraus abgeleitetem 
Divs dürften auch nicht stimmen.

Kein Wunder, dass Dortmund gegen Bayern keine Chance hat :-)

von Marcel S. (fpga_user)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt die Werte, die etwas mit count zu tun haben sowie die 
Notenwerte halbiert, da ich ja mit einer 50 MHz Clock arbeite und nicht 
mit einer 100 MHz clock.



Muss ich da den signal count auch halbieren:
1
signal count : integer range 0 to 199999999 := 0;
?

Und @Martin:

Deinen Code
1
process(clk, reset)
2
    begin
3
        if reset = '1' then
4
            counter  <= (others => '0');
5
        elsif clk'event and clk = '1' then
6
            counter <= counter+1;
7
8
        end if;
9
    end process;

würde ich dann anstelle von:
1
 wait until rising_edge(clk );

einsetzen, richtig?

von Marcel S. (fpga_user)


Bewertung
0 lesenswert
nicht lesenswert
Kritiker schrieb:
> Hat sich mal jemand das Original PDf angesehen? Dort steht bei der
> Frequenzgeneration:
>
>  f = 440 Hz = 1/t => Periodendauer 1/440s = 227,272 ms
>
> Soso! An der Universität Dortmund sind 440Hz also eine Periodendauer von
> 227ms. Na Danke. Dass das niemandem auffällt. Die daraus abgeleitetem
> Divs dürften auch nicht stimmen.
>
> Kein Wunder, dass Dortmund gegen Bayern keine Chance hat :-)

Die abgeleiteten Divs stimmen. Ich habe dann anhand meiner Umrechnung 
mit 50 MHz folgende Werte herausbekommen:

191571, 180505, 170648, 160772, 151976, 143266, 135135, 127551, 120482, 
113636, 107296, 101420, 95602.

Das dürfte so stimmen.

Ich höre aber noch keinen Ton von meinem Board. Kann es wirklich sein, 
wie Martin sagt, dass er mit dem wait until rising_edge nicht klar 
kommt?

Wie implementiere ich das reset dann richtig?

von Marten W. (goldmomo) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Ich habe es zwar schon geschrieben, aber nochmal:

Wenn du AUD_XCK als Audiopins nimmst und der geht beim DE2-115 
(Pinassignement von Terasic) zum WM8731, wirst du nie etwas hören ....

Wo hast du deine Lautsprecher/Kopfhörer angeschlossen??

von Uwe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Erklär mal wie ein FPGA intern aufgebaut ist (nur grob).
Weißt du was AND, OR, NOR, NAND, NOT, FlipFlops, Counter, Multiplexer 
sind und wie man Sie benutzt ?
Wenn man das nicht weiß hat man eigentlich keine Chance.
Man kann zwar etwas in VHDL schreiben was eventuel sogar synthetisiert 
wird, aber halt schlicht und ergreifend nicht so funktioniert wie man es 
will (oder nur manchmal).
Bau doch erstmal nen Lauflicht im Schaltplaneditor und versuch (wenn du 
es geschafft hast) das danach in VHDL umzusetzen.

Nein es hängt hier :
>Du solltest bei deinem Top Level eigentlich nur einen Eingang (CLK) und
>zwei Ausgänge (audio L/R) haben die du auf deine physikalischen Pins
>legen musst.

und hier:
> nur mal so am Rande, AUD_XCK ist der Master-Clock Eingang vom WM8731 auf
> dem DE2-115 Board.
> Wenn du da Sound rausbekommen willst, solltest du vielleicht mal das
> Datenblatt anschauen.

und hier:
> Die Pinbelegung hatte ich bisher realisiert, indem ich für den output
> also für die Tonausgabe den Pin mit der Bezeichnung AUD_XCK genommen.
> Für die clock input hatte ich CLOCK_50 genommen und für die ersten paar
> inputs der noten (also note[0], note[1], note[2] und so weiter, die
> jeweiligen pins für die schalter am board.

und hier:
> ohne jegliche Vorkenntnisse

von Uwe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Noch eine Frage hast du Kenntnisse mit Digitalen Schaltungen ?
Könntest du einen Schaltplan Zeichnen aus FlipFlops, Gattern 
Taktgenerator usw. der ein Lauflicht beschreibt.
Wenn nicht, dann fang mal damit an ...

von Marcel S. (fpga_user)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Uwe, das mir den 2 Outputs (Audio L und Audio R) und dem einen 
Input (clk) habe ich schon hinbekommen.

Wir haben auch schon Lauflicht, sowie Flip-Flop Schaltungen und 
verschiedene Gatter realisiert.

Leider komme ich aber mit der Umstellung von 100 MHz auf 50 MHz nicht 
klar.

Ich habe wie gesagt im Code alle Werte, die etwas mit count bzw. der 
Tonhöhe zu tun haben halbiert bzw. umgerechnet. Die Pinbelegung stimmt 
nun auch, wobei ich Audio L frei gelassen habe, da das Board nur einen 
Audio-Ausgang hat. In den Einstellungen habe ich unbenutzte Pins auf 
Masse legen lassen.

Am Board kommt nun aber dennoch kein Ton raus. Woran kann das liegen?

Vielen Dank schon mal für eure Unterstützung ;)

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Der FPGA hat doch 4 PLLs. Nimm doch eine, und mach wieder 100 MHz 
daraus.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Ich stelle fest es gibt keinen reset.
Das ist gut. Wozu braucht so ein stupider Tongenerator auch einen Reset, 
wenn das FPGA Initwerte kann?

> Und
> wait until rising_edge(clk );
> keine Ahnung  ob  die Synthese  das nicht mag,
Das kann der schäbigste Synthesizer seit etlichen Jahren. Und es ist 
eine Garantie für ein synchrones Design.

> wie wäre es mit dem guten alten
>     process(clk, reset)
>     begin
>         if reset = '1' then
>             counter  <= (others => '0');
>         elsif clk'event and clk = '1' then
>             counter <= counter+1;
>
>         end if;
>     end process;
>
> 
http://stackoverflow.com/questions/9989913/vhdl-how-to-use-clk-and-reset-in-process
Designstrategien für ASICs...

> Der reset käme  dann von aussen, vom Taster.
Und wenn man unbedingt wider jede Vernunft so einen Resettaster einbaut, 
dann muss(!) dieses asynchrone Signal auf jeden Fall erst mal 
einsynchronisiert erden!

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
> Am Board kommt nun aber dennoch kein Ton raus. Woran kann das liegen?
Wo ist denn nun der Lautsprecher angeschlossen? Und wie muss dieser 
Baustein angesprochen werden?

Ich möchte an dieser Stelle übrigens nochmal mit allem mir zur Verfügung 
stehenden Nachdruck auf die Simulation verweisen. Dort könnte man dann 
ganz leicht schauen, ob das ausgegebene Protokoll zum DAC passt...

: Bearbeitet durch Moderator
von Uwe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Dort könnte man dann ganz leicht schauen, ob das ausgegebene Protokoll zum
> DAC passt...

Das ist ja das Problem : Er wackelt an irgendeinem Clockpin von Seinem 
DAC und denkt da käme jetzt irgendetwas raus ...
Der DAC hat aber nen I2S Bus und etliche andere Steuereingänge, hab mir 
das Datenblatt jetzt nicht angeguckt, aber seine VHDL beschreibung kann 
maximal an nem Pin rumwackeln mit ner Bestimmten Frequenz.
Er müßte erstmal das Datenblatt lesen und die Register seines DACs 
richtig konfigurieren, das Protokoll des DACs in einer FSM 
implementieren und dann kann er seine Frequenzausgabe machen (die wird 
gegen den rest des Designs ziemlich popelig aussehen).

von M. D. (wpmd)


Bewertung
0 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
> Hallo Uwe, das mir den 2 Outputs (Audio L und Audio R) und dem einen
> Input (clk) habe ich schon hinbekommen.

Uwe schrieb:
>> Dort könnte man dann ganz leicht schauen, ob das ausgegebene Protokoll zum
>> DAC passt...
>
> Das ist ja das Problem : Er wackelt an irgendeinem Clockpin von Seinem
> DAC und denkt da käme jetzt irgendetwas raus ...

Vielleicht hat er ja auch mitlerweile einen ganz anderen Pin genommen 
und den Lautsprecher direkt daran angeschlossen... Hier wäre etwas 
Aufklärung seiten des TOs hilfreich.

: Bearbeitet durch User
von Uwe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> einen ganz anderen Pin genommen und den Lautsprecher direkt daran
> angeschlossen
Das ist natürlich viel besser ... so bekommt er das FPGA viel schneller 
kaputt.

von Jürgen S. (engineer) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Wenn der Lautsprecher 32 Ohm hat, wie bei den Mini-Kristal-Ohrhörern, 
geht das durchaus. Sinnvoll ist es aber nicht, wegen der Oberwellen. 
Zumindest ein Tiefpass muss eingebaut sein.

Der für Audio einigermassen akzeptable Weg ist, eine wenigstens auf 
30MHz basierende PDM zu verwenden und einen guten Analogfilter dahinter 
zu setzen, samt post-Amp. Dann kann man auch 16 Bit ausgeben.

Für das DE2 gibt es übrigens ein DAC-Erweiterungsboard, das weitere 
Audio-IN-Outs enthält.

>Notenerzeugung mit FPGA
Du möchtest den Klang erzeugen, nehme ich an. Notenerzeugung ist noch 
ein anderes Thema.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
> Am Board kommt nun aber dennoch kein Ton raus. Woran kann das liegen?
Ich wiederhole jetzt einfach mal die schon oft gestellte Frage: WO und 
WIE ist der Lautsprecher angeschlossen?

Denk einfach mal nach (das kostet nix): das mit den 50MHz vs. 100MHz 
kann gar nie&nimmer dein Problem sein. Denn mit der falschen 
Taktfrequenz ist der Ton bestenfalls eine Oktave höher oder tiefer. Es 
kommt aber garantiert ein Ton! Klar soweit?

von Marcel S. (fpga_user)


Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Marcel Schmidt schrieb:
>> Am Board kommt nun aber dennoch kein Ton raus. Woran kann das liegen?
> Ich wiederhole jetzt einfach mal die schon oft gestellte Frage: WO und
> WIE ist der Lautsprecher angeschlossen?

Ich habe für audio output AUD_DACDAT, Location, PIN_A4 genommen.
>
> Denk einfach mal nach (das kostet nix): das mit den 50MHz vs. 100MHz
> kann gar nie&nimmer dein Problem sein. Denn mit der falschen
> Taktfrequenz ist der Ton bestenfalls eine Oktave höher oder tiefer. Es
> kommt aber garantiert ein Ton! Klar soweit?

Bist du dir sicher, dass ein Ton kommen würde, den man auch hören würde 
wenn man mit 50 MHz an die Sache rangeht?
Wenn die Teiler der einzelnen Noten einmal mit 100 MHz und einmal mit 50 
MHz berechnet werden, gibt es schon einen gewaltigen Unterschied.

Der Teiler (divs; siehe Präsentation) berechnet sich wie folgt: 
(100*10^6 Hz) / 440 Hz --> Beispiel für den Ton "A", also den Kammerton.

Ich habe wie gesagt die Teiler umgerechnet, ausgehend von einer clock 
Frequenz von 50 MHz, es kommt aber trotzdem kein Ton.

von Marten W. (goldmomo) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
PIN_A4 is bei meinem De2-115 (OTG_WE_N)? Ganz sicher, dass du eine 
DE2-115 hast? Es könnte aber auch sein, dass der Bullshit-Buffer im 
WM8731 überläuft (wenn er den Takt hätte).

Ich will hier nicht irgendwie bösartig rüberkommen, aber es gibt einige 
Antworten in diesem Thread die genau auf den Fehler hinweisen warum du 
nichts hören kannst.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
>> Ich wiederhole jetzt einfach mal die schon oft gestellte Frage: WO und
>> WIE ist der Lautsprecher angeschlossen?
> Ich habe für audio output AUD_DACDAT, Location, PIN_A4 genommen.
Und da ist dann an genau diesen Pin direkt ohne irgendetwas dazwischen 
der Lautsprecher angeschlossen?
Meine Frage war nicht, an welchem Pin du dieses Audiosignal ausgibst, 
sondern WO und WIE der Lautsprecher angeschlossen ist...

Bedenke bitte, dass ich mir nicht den Schaltplan irgendeines Boards 
herunterlade, sondern diese Antwort von dir will. Vielleicht fängst du 
dann endlich mal an, über meine nicht ganz grundlos gestellten Fragen 
nachzudenken...

: Bearbeitet durch Moderator
von Marcel Schmidt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Meine Frage war nicht, an welchem Pin du dieses Audiosignal ausgibst,
> sondern WO und WIE der Lautsprecher angeschlossen ist...
>
> Bedenke bitte, dass ich mir nicht den Schaltplan irgendeines Boards
> herunterlade, sondern diese Antwort von dir will. Vielleicht fängst du
> dann endlich mal an, über meine nicht ganz grundlos gestellten Fragen
> nachzudenken...

Ich habe den Lautsprecher direkt an den Lautsprecher-Ausgang (grüner 
Klinkenausgang) angeschlossen.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Also gut, dann eben mit kleinen Schritten...
WAS ist jetzt noch zwischen dem FPGA und dem Lautsprecher? Und WIE 
muss man diesen Baustein ansprechen?

von Marcel S. (fpga_user)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Also gut, dann eben mit kleinen Schritten...
> WAS ist jetzt noch zwischen dem FPGA und dem Lautsprecher? Und WIE
> muss man diesen Baustein ansprechen?

Zwischen FPGA und Lautsprecher ist noch ein Audio Codec.
Habe anbei mal ein Bild vom Board und ein Bild vom Audio Codec 
hochgeladen.

Habe bisher den audio output immer mit der Pinbelegung DACDAT 
realisiert.

von Markus W. (elektrowagi78) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Ich kenne mich mit diesen Wolfson-CODECs nicht so aus, aber wenn ich das 
Datenblatt so überfliege, sind das doch ganz normale DACs / ADCs, oder?

Worin besteht denn hier die CODEC-Funktion?

Brauchen die ein spezielles Format?

von Peter B. (funkheld)


Bewertung
-1 lesenswert
nicht lesenswert
Hmmm..., warum wurde hier unterbrochen ?
Ich möchte dem DE1 auch mal über den Kopfhörer eine Frequenz als Ton 
entlocken.

Danke.
Gruss

von Beobachter (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Sag mal Du "funkheld", Dir ist schon bewusst, dass es hier um das DEII 
geht? Und sich die Fragestellung um ein ganz bestimmtes Problem dreht? 
Nämlich um die Pinbelegung beim Altera 2 DE 115 FPGA?

Wenn Du unbedingt was Kompliziertes nachbauen willst, warum nimmst Du 
nicht den im PDF beschriebenen Code und arbeitst Dich rein? Und fragst 
dann, wenn ein Punkt unklar ist?

Oder noch besser, warum nimmst Du nicht einen garantiert 
funktionierenden Code, der nicht hier hinterfragt wird, weil er offenbar 
einen issue hat?

Im Bereich Codes und Projekte gibt es tonnenweise Zeug, das funktioniert 
und einen Anfänger 2 Jahre beschäftigen kann. Allein die Miller-HP gibt 
da soviel her, dass einer 3 Monate lernen kann. Und wenn es dann schon 
unbedingt Sound sein soll - warum liest Du nicht erstmal die Artikel von 
den einschlägigen Sound-Profis hier im Forum?

Oder ich schiebe mal besser noch eine Frage davor:

Warum konzentrierst Du Dich nicht auf das Verständnis und die 
Erarbeitung von zunöchst EINER Lösung für EIN Problem und widmest Dich 
dann dem nächsten?

Ich würde vorschlagen, Du wartest, bis das Buch über VHDL kommt, dass Du 
kaufen willst, lernst 3 Monate Basics, dann lässt Du LEDs blinken und 
befasst Dich dann mit PCM, Klangerzeugung und nach 1 Jahr kommst Du dann 
nochmal und generierst Klänge auf dem FPGA.

Wenn Du das hier alles gelesen hast, bist Du fit dafür:

Beitrag "Musik aus dem CPLD ;-)"
Beitrag "Leute für Audio-Projekt gesucht"
Beitrag "FPGA Größe ausreichend für komplexen FM Synthesizer"
Beitrag "FPGA Spartan 3A Audio Ausgang"
Beitrag "Audio DSP mit FPGA"

von Beobachter (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Beobachter (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Peter B. (funkheld)


Bewertung
0 lesenswert
nicht lesenswert
Hallo, danke für die Info.
Ich habe am DE1 die gleichen Signalnamen.

Die PIN-Belegung für mich ist nicht interessant, sondern nur am welchen 
Signal man ein Frequenz zu Lineout senden kann.
Ich möchte keine Wav oder andere Sachen machen.

Danke.
Gruss

von Duke Scarring (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Peter Bierbach schrieb:
> Die PIN-Belegung für mich ist nicht interessant, sondern nur am welchen
> Signal man ein Frequenz zu Lineout senden kann.

Dann schau Dir den Code zum hier erwähnten Beispiel an:
http://www.terasic.com.tw/attachment/archive/83/DE1_UserManual_v1018.pdf
(Seite 49: 5.2 Music Synthesizer Demonstration)

Wenn es dazu Fragen gibt, mach bitte einen neuen Beitrag auf.

Duke

von Rolf S. (audiorolf)


Bewertung
0 lesenswert
nicht lesenswert
Na ob das nicht ein wenig fett ist für einen Anfänger: Einen Audio Codec 
per I2C konfigurieren, ein P/2 IF als Keyboard, eine VGA-Ausgabe der 
Tastendrücke und dann noch duale Tonausgaben - Ich fürchte da sitzt 
Peter in einem Jahr noch daran und weiß noch immer nicht, wo und wofür 
jetzt welcher Pin und VHDL-Zeile da ist.

Warum fängt man nicht einfach mal mit einem wackelnden PIN an, dann 
einer PWM-Ausgabe und danach einem veränderlichen Ton? Dann mehrere 
Töne, dann die Steuerung darum herum, Tastaturinterpretierung, dann 
verschiedene Wellenformungen, dann ADSR-Kurven, dann 
Steuerkommandierungen für die Innereien von Außen und frühestens dann 
kann man auch richtige Noten spielen, sofern einer überhaupt soweit 
kommt, denn bei den meisten Projekten im Web scheint den FPGA-Musikern 
ja unterwegs die Luft auszugehen.

Jenachdem, wie weit einer kommt, hätte einer dann aber auch kapiert wie 
das alles funktionieren muss und es hat einen Lerneffekt. So einfach 
hopphopp in ein ausgefertigtes System hineinzuspringen, bringt es 
irgendwie nicht.

von rantanplan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
> Die abgeleiteten Divs stimmen. Ich habe dann anhand meiner Umrechnung
> mit 50 MHz folgende Werte herausbekommen:
> 191571, 180505, 170648, 160772, 151976, 143266, 135135, 127551, 120482,
> 113636, 107296, 101420, 95602.

Wenn das Teiler von 50MHz sein sollen, welchen Frequenzen entspricht 
das?

Ich komme auf:

191107, 180382, 170258, 160703, 151684, 143171, 135136, 127552, 120393, 
113636, 107254, 101235, 95553

Wegen deinem Wandlerproblem: Hast du mal gemessen, was hinten rauskommt?
Kommt denn vom Wander überhaupt etwas?

von Peter B. (funkheld)


Bewertung
0 lesenswert
nicht lesenswert
Jup, darum geht es mir bitte:
Warum fängt man nicht einfach mal mit einem wackelnden PIN an mit einem 
Ton?

Danke.
Gruss

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Peter Bierbach schrieb:
> Jup, darum geht es mir bitte:
> Warum fängt man nicht einfach mal mit einem wackelnden PIN an mit einem
> Ton?
Da hätte ich dann das da:
Beitrag "SAB0600 in VHDL (war: Warum ist hier weniger los als)"

von Peter B. (funkheld)


Bewertung
0 lesenswert
nicht lesenswert
Jup, danke.

Das ist wunderbar.

Gruss

von Hobbyorganist (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Marcel Schmidt schrieb:
> Am Board kommt nun aber dennoch kein Ton raus. Woran kann das liegen?
wie du selbst oben richtig geschrieben hast, besitzt dieser Wandler eine 
I2C Schnittstelle. Damit werden gewisse Einstellungen vorgenommen. 
Solange da nichts konfiguriert ist, bleibt der sicher still!

Markus Wagner schrieb:
> Ich kenne mich mit diesen Wolfson-CODECs nicht so aus, aber wenn ich das
> Datenblatt so überfliege, sind das doch ganz normale DACs / ADCs, oder?
Soweit mir bekannt, kann das Datenformat eingestellt werden. Da bin ich 
auch gerade dran, allerdings an einem anderen Wandler.

> Worin besteht denn hier die CODEC-Funktion?
Einige wandeln in ADPCM (WAV) um.

Rolf Sassinger schrieb:
> Warum fängt man nicht einfach mal mit einem wackelnden PIN an, dann
> einer PWM-Ausgabe und danach einem veränderlichen Ton?
Wo wäre der Vorteil einer PWM-Ausgabe statt einem DAC?

von Rolf S. (audiorolf)


Bewertung
0 lesenswert
nicht lesenswert
Hobbyorganist schrieb:
> Rolf Sassinger schrieb:
>> Warum fängt man nicht einfach mal mit einem wackelnden PIN an, dann
>> einer PWM-Ausgabe und danach einem veränderlichen Ton?
> Wo wäre der Vorteil einer PWM-Ausgabe statt einem DAC?
Na es braucht nur einen Pin. Gfs wäre das die Lösung für dein 
Orgelprojekt. Eine 1-Chip-Platine mit einem PLD.

von Jürgen S. (engineer) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
>> Wo wäre der Vorteil einer PWM-Ausgabe statt einem DAC?
> Na es braucht nur einen Pin. Gfs wäre das die Lösung für dein
> Orgelprojekt.
Was auf den DAC gegeben wird, kann man sich auch mit einen Logic 
Analyzer mal ansehen. Für den Anfang würde ich auch zu einer PWM raten.

> Wenn das Teiler von 50MHz sein sollen, welchen Frequenzen entspricht
> das?
> 191107, 180382, 170258

Wenn die Frequenzen des Quarz so herunter dividiert werden, kommt ja 
erstmal ein Rechteck raus. Soll das das Signal ein? Geht das vielleicht 
noch eine eine DDS? Dann wäre gfs die Tonfrequenz zu niedrig, um sie zu 
hören.

Peter Bierbach schrieb:
> ich habe am DE1 die gleichen Signalnamen.
aber nicht notwendigerweise dieselbe Verdrahtung

Ich kenne das board nicht aber der Anschluss und die Signalbelegung vom 
FPGA zum DAC war bisher auf allen Terasc Boards anders.

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]
  • [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.