mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL Grundlagen Tonerzeugung


Autor: chris (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hier habe ich begonnen, mich in die VHDL-Grundlagen mit einem MACHX02 
board einzuarbeiten:

Beitrag "Re: VHDL Grundlagen"

Interessanter als das Blinken von LEDs finde ich aber die Tonerzeugung.
Hier habe ich mal ein Beispiel für die Erzeugung eines 440Hz Tons 
ersellt:
library ieee;
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

LIBRARY lattice;
USE lattice.components.all;
 
entity squareTone is 
    Port (  
           speaker : buffer  STD_LOGIC
         ); 
end squareTone; 
 
architecture Behavioral of squareTone is 

signal c   : integer range 0 to 60455 := 0; -- 440Hz bei 53.2MHz fosc
signal clk : STD_LOGIC;

   -- lattice oscillator OSCH primitive
   COMPONENT OSCH
   
      GENERIC (
                NOM_FREQ: string
        );
 
      PORT    ( 
                STDBY    : IN  STD_LOGIC;
                OSC      : OUT STD_LOGIC;
                SEDSTDBY : OUT STD_LOGIC
        );
        
   END COMPONENT;

begin 

   -- lattice internal oscillator OSCH primitive
   OSCInst0: OSCH
      GENERIC MAP (NOM_FREQ  => "53.20")  -- 53.2 MHz syssysclk
      PORT MAP    (STDBY => '0', OSC => clk, SEDSTDBY => OPEN);
    
   process begin  
   
      wait until rising_edge( clk ); -- warten bis zum nächsten Takt 
      if ( c < 60455) then  
          c <= c+1;                -- wenn kleiner: weiterzählen 
      else                         -- wenn Zählerende erreicht: 
          c <= 0;                  -- Zähler zurücksetzen 
          speaker <= not speaker;  -- toogle speaker
      end if; 

   end process; 
     
end Behavioral;

Wie würde man das schreiben, wenn man den Teilerfaktor in VHDL berechnen 
lassen will?

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

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Hier habe ich mal ein Beispiel für die Erzeugung eines 440Hz Tons
> ersellt:
>       if ( c < 60455) then
Und schon den klassischen "off-by-one" Fehler hinbekommen. Denn dein 
Zähler zählt nicht 60455 Schritte, sondern 60456, weil er 0 auch noch 
mitzählt. Natürlich ist der Fehler hier nicht relevant, aber mal 
angenommen, der Zähler sollte in einem anderen Fall 6 Schritte zählen, 
würde aber 7 machen:
>       if ( c < 6) then
:-o

> Wie würde man das schreiben, wenn man den Teilerfaktor in VHDL berechnen
> lassen will?
Naja, halt ausrechnen wie du es auch von Hand auf einem Blattl Papier 
machst...
constant prescaler integer := 53200000/(2*440) - 1; -- minus 1 wegen des off-by-one
:
:
       if ( c < prescaler) then  

: Bearbeitet durch Moderator
Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
>>       if ( c < 60455) then
> Und schon den klassischen "off-by-one" Fehler hinbekommen. Denn dein
> Zähler zählt nicht 60455 Schritte, sondern 60456, weil er 0 auch noch
> mitzählt.

Also mit der Bedingung "KLEINER ALS" tritt dieser Fehler eigentlich 
nicht auf. Normalerweisde vergleicht man auf "UNGLEICH" dann liegt man 
eins daneben. Vergleich auf GLEICH oder UNGLEICH wird oft vewendet weil 
es halt weniger LUTs als KLEINER oder GRÖSSER benötigt.

Andi

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach nochmaliger Überlegung ziehe ich meinen Einwand hiermit zurück ;)
Der Fehler ist natürlich der gleiche wie bei einer UNGLEICH Bedingung.
Lothar hatte also recht!

Andi

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten.
Auch wenn ich jetzt etwas Zeit gebraucht habe, weil in der Vorlage ein 
Doppelpunkt gefehlt hat:
constant prescaler : integer := 53200000/(2*440) - 1; -- minus 1 wegen des off-by-one

Hier der Vollständigkeithalber der Code mit Berechnung der Konstanten:
library ieee;
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

LIBRARY lattice;
USE lattice.components.all;
 
entity squareTone is 
    Port (  
           speaker : buffer  STD_LOGIC
         ); 
end squareTone; 
 
architecture Behavioral of squareTone is 

constant prescaler : integer := 53200000/(2*440)-1 ; -- 440Hz bei 53.2MHz fosc
signal   c         : integer range 0 to prescaler := 0; 
signal   clk       : STD_LOGIC;

   -- lattice oscillator OSCH primitive
   COMPONENT OSCH
   
      GENERIC (
                NOM_FREQ: string
        );
 
      PORT    ( 
                STDBY    : IN  STD_LOGIC;
                OSC      : OUT STD_LOGIC;
                SEDSTDBY : OUT STD_LOGIC
        );
        
   END COMPONENT;

begin 

   -- lattice internal oscillator OSCH primitive
   OSCInst0: OSCH
      GENERIC MAP (NOM_FREQ  => "53.20")  -- 53.2 MHz syssysclk
      PORT MAP    (STDBY => '0', OSC => clk, SEDSTDBY => OPEN);
    
   process begin  
   
      wait until rising_edge( clk ); -- warten bis zum nächsten Takt 
      if ( c < prescaler) then  
          c <= c+1;                -- wenn kleiner: weiterzählen 
      else                         -- wenn Zählerende erreicht: 
          c <= 0;                  -- Zähler zurücksetzen 
      speaker <= not speaker;  -- toogle speaker
      end if; 

   end process; 
     
end Behavioral;

Als nächste werde ich versuchen, einen minimaltistischen Step-Sequenzer 
zu programmieren.

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

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Auch wenn ich jetzt etwas Zeit gebraucht habe, weil in der Vorlage ein
> Doppelpunkt gefehlt hat
Ja, dieser Prozess wird "Lernen" genannt...  ;-)

> Als nächste werde ich versuchen, einen minimaltistischen Step-Sequenzer
> zu programmieren.
Da kannst du mal dort spicken:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
Allerdings erscheint es sinnvoll, in deinem Fall das "Tonfolgearrray" 
als Integer anzulegen, denn der Zähler ist ja auch ein Integer. Dann 
vergleicht sich das einfacher...

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, danke :-)
Ich hab's mal kreativ aus den bisherigen Übungen "komponiert".
Ein Lauflicht, bei dem parallel die Tonleiter gespielt wird.
library ieee;
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

LIBRARY lattice;
USE lattice.components.all;
 
entity stepSequencer is 
    Port (  
         leds    : out STD_LOGIC_VECTOR ( 7 downto 0 );
           speaker : buffer  STD_LOGIC
         ); 
end stepSequencer; 
 
architecture Behavioral of stepSequencer is 

constant MINFREQUENCY : integer := 10; -- Hz
signal   prescaler : integer range 0 to 53200000/(2*MINFREQUENCY)-1 := 53200000/(2*MINFREQUENCY)-1 ; --  bei 53.2MHz fosc

signal   c         : integer range 0 to 53200000/(2*MINFREQUENCY)-1 := 0; 
signal   clk       : STD_LOGIC;

constant NOTE_C4 : integer := 53200000/(2*262)-1 ;
constant NOTE_D4 : integer := 53200000/(2*294)-1 ;
constant NOTE_E4 : integer := 53200000/(2*330)-1 ;
constant NOTE_F4 : integer := 53200000/(2*349)-1 ;
constant NOTE_G4 : integer := 53200000/(2*392)-1 ;
constant NOTE_A4 : integer := 53200000/(2*440)-1 ;
constant NOTE_H4 : integer := 53200000/(2*494)-1 ;
constant NOTE_C5 : integer := 53200000/(2*523)-1 ;

constant STEPPRESCALER : integer := 53200000/(4)-1 ; -- 4Hz bei 53.2MHz fosc
signal   stepCounter   : integer range 0 to STEPPRESCALER := 0 ;

constant MAXSTATE      : integer := 7 ;
signal   state         : integer range 0 to MAXSTATE := 0 ;

   -- lattice oscillator OSCH primitive
   COMPONENT OSCH
   
      GENERIC (
                NOM_FREQ: string
        );
 
      PORT    ( 
                STDBY    : IN  STD_LOGIC;
                OSC      : OUT STD_LOGIC;
                SEDSTDBY : OUT STD_LOGIC
        );
        
   END COMPONENT;

begin 

   -- lattice internal oscillator OSCH primitive
   OSCInst0: OSCH
      GENERIC MAP (NOM_FREQ  => "53.20")  -- 53.2 MHz syssysclk
      PORT MAP    (STDBY => '0', OSC => clk, SEDSTDBY => OPEN);
   
   stepTimer: process begin
   
     wait until rising_edge ( clk );
   if ( stepCounter < STEPPRESCALER ) then
       stepCounter <= stepCounter + 1;
   else   
    stepCounter <= 0;
    if ( state < MAXSTATE ) then
      state <= state +1 ;
    else 
      state <= 0;
    end if;  
    
     end if ;

   end process stepTimer;
   
   soundGenerator : process begin  
   
      wait until rising_edge( clk ); -- warten bis zum nächsten Takt 
      if ( c < prescaler) then  
          c <= c+1;                -- wenn kleiner: weiterzählen 
      else                         -- wenn Zählerende erreicht: 
          c <= 0;                  -- Zähler zurücksetzen 
          speaker <= not speaker;  -- toogle speaker
      end if; 

   end process soundGenerator ; 
   
   -- led indicator
   leds(0) <= '0' when state = 0 else '1';
   leds(1) <= '0' when state = 1 else '1';
   leds(2) <= '0' when state = 2 else '1';
   leds(3) <= '0' when state = 3 else '1';
   leds(4) <= '0' when state = 4 else '1';
   leds(5) <= '0' when state = 5 else '1';
   leds(6) <= '0' when state = 6 else '1';
   leds(7) <= '0' when state = 7 else '1';
   
   -- note player sequencer
   with state select 
     prescaler <= NOTE_C4 when 0 ,
                NOTE_D4 when 1 ,
                      NOTE_E4 when 2 ,
                NOTE_F4 when 3 ,
                      NOTE_G4 when 4 ,
                NOTE_A4 when 5 ,
                      NOTE_H4 when 6 ,
    NOTE_C5 when others ;       

end Behavioral;

... irgendwie verhagelt's mir die Formatierung durch die Mischung von 
"tabs" und "spaces" ...

Autor: Edi. M. (Firma: Industrie 1.0) (elektromeister)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
Was ist los, haben wir Tonwochen im Forum?

Beitrag "Zweiklang Ton erzeugen"

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na klar ;-)
Ich habe mich absichtlich nicht an der "Zweiklang Diskussion" beteiligt, 
weil es mir zu trivial erschien. Zwei DDS-Generatoren und gut ist.
Außerdem viel das Wort "BASCOM".

Mal sehen ... vielleicht wäre es ein minimalistischer Zweiklanggenerator 
auf dem FPGA ein gute Übung. Zur Erhöhung der Schwierigkeit ohne 
externen Mischer für die zwei Kanäle.

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Da ja nicht jeder ein MACHX02 FPGA hat, hier mein erster Versuch, den 
Takgenerator vom restlichen Tongenerator zu trennen. Die beiden 
Komponenten werden über das TopLevel File verbunden.

Ein wenig ungünstig könnte eventuell sein, dass die Frequenzkonstante im 
Tongenerator fest kodiert ist.

Wie mache ich das am besten variabel?

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Den Top-Level hat es nicht angehängt. Hier das File.

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Seltsam, warum laden die Leute das Top-Level-Diagramm für das MACHX02 
herunter, aber nicht den Tongenerator?

Egal ..
Eine ziemlich gute Verbesserung für das "Klangerlebnis" wäre der Einsatz 
von Hüllkurvengeneratoren für das An- und Abschwellen der Lautstärke. 
Damit klingen dann die Töne viel natürlicher. Man kann z.B. Glockentöne 
damit erzeugen.

Der SID aus dem C64 wäre hier ein gutes Beispiel. Ich hänge mal das 
Schema an.

Gibt es einen fertigen Hüllkurvengenerator in VHDL?

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

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Gibt es einen fertigen Hüllkurvengenerator in VHDL?
Ansatzweise dort im Beitrag "Re: Warum ist hier weniger los als."
;-)

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

Bewertung
0 lesenswert
nicht lesenswert
Andi schrieb:
> Vergleich auf GLEICH oder UNGLEICH wird oft vewendet weil es halt
> weniger LUTs als KLEINER oder GRÖSSER benötigt.
Auch dazu ein kleiner Denkanstoß im 
Beitrag "Re: Warum ist hier weniger los als."
Fazit: man sollte das für einen gegebenen Fall ruhig ab&an mal 
ausprobieren...

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Ich bin ja erstaunt, was für Kleinode sich hier im MC-Netz so finden 
lassen.

Witzigerweise höre ich genau diesen Gong vom benachbarten Rathaus jeden 
Morgen. Scheint wohl ein SAB0600 verbaut ;-)

Damit es die Leute ausprobieren können, hänge ich das Top-Level Design 
für das MACHX02 board hier mal an.

Zum Test habe ich einfach direkt einen Piezo Lautpsrecher mit ~2K 
Vorwiderstand angeschlossen.
Der 2.te und 3.te Ton klingt etwas übersteuert.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Auch dazu ein kleiner Denkanstoß im

Sehr interessant. Ich hätte auch gedacht, dass ein '=' weniger Resourcen 
als ein '<' verbraucht. Nach der Aussage im anderen Thread braucht aber 
das '=' mehr.

Hier habe ich einen einfachen FPGA-Synthesizer entdeckt:

http://www.instructables.com/id/8-Step-FPGA-Sequen...

Das Design ist leider in Veriolog und eher sehr einfach gehalten, weil 
es nur Rechtecktöne macht. Dafür kann man über die Schalter am Board mit 
den Tonfolgen spielen. Ich poste das mal als Inspiration:

https://youtu.be/zJfWnLn4zno

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

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Hier habe ich einen einfachen FPGA-Synthesizer entdeckt:
> http://www.instructables.com/id/8-Step-FPGA-Sequen...
> Das Design ist leider in Veriolog
Sieht nur so aus... ;-)
Das Ding ist durchaus in VHDL, aber offenbar eine Anfängerbastelei.
Ich nehme einfach mal den "ButtonDebouncer.vhd" von dort:
comb : process(clk, rst, Btn, PS)               -- überdefinierte Sensitivliste
begin
  case PS is
    when hold0 => tempq <= "00";
      if (Btn = '0') then     -- asynchroner Eingang in FSM
        NS <= ready0;
      else 
        NS <= PS;
Mal von der zu vollen Sensitivliste abgesehen und auch davon, dass 
dieser "ButtonDebouncer" sich intern als "ButtonToggle" präsentiert, der 
an einem prellenden Taster prinzipiell nicht funktioniert:
es ist ein absolutes No-Go, einen asynchronen Eingang in einer FSM zu 
verwenden.

Siehe http://www.lothar-miller.de/s9y/categories/35-Eins...

Und zum Entprellen eines Tasters dann das 
http://www.lothar-miller.de/s9y/categories/5-Entprellung

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist es trotzdem gut, mal zu sehen, was andere so machen.

Im Moment verusche ich gerade einen Tongenerator mit veränderlicher 
Amplitude zu entwerfen. Wenn ich das geschafft habe, kann ich die 
Ausgangssignale mehrere Genereatoren addieren und dann über PWM 
ausgeben.

Das ist mein erster Versuch. Er scheint aber immer bei einer Frequenz 
hängen zu bleiben:

library ieee;
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 
 
entity noteToneGenerator is 
  port (  
      clk      : in  STD_LOGIC;
      noteIn    : in  STD_LOGIC_VECTOR ( 2 downto 0 );
      amplitude  : in  STD_LOGIC_VECTOR ( 7 downto 0 );
      waveOut    : out  STD_LOGIC_VECTOR ( 7 downto 0 )
         ); 
end noteToneGenerator; 
 
architecture Behavioral of noteToneGenerator is 

constant NOTE_C4 : integer := 53200000/(2*262)-1 ;
constant NOTE_D4 : integer := 53200000/(2*294)-1 ;
constant NOTE_E4 : integer := 53200000/(2*330)-1 ;
constant NOTE_F4 : integer := 53200000/(2*349)-1 ;
constant NOTE_G4 : integer := 53200000/(2*392)-1 ;
constant NOTE_A4 : integer := 53200000/(2*440)-1 ;
constant NOTE_H4 : integer := 53200000/(2*494)-1 ;
constant NOTE_C5 : integer := 53200000/(2*523)-1 ;

constant  MINFREQUENCY  : integer := 10; -- Hz
signal    prescaler    : integer range 0 to 53200000/(2*MINFREQUENCY)-1 := 53200000/(2*MINFREQUENCY)-1 ; --  bei 53.2MHz fosc

signal    freqCounter  : integer range 0 to 53200000/(2*MINFREQUENCY)-1 := 0; 

constant  MAXNOTE    : integer := 7 ;
signal    note    : integer range 0 to MAXNOTE := 1 ;

signal    bitSignal  : bit := '0';

begin 

   soundGenerator:  process begin   
            wait until rising_edge( clk ); 
              if ( freqCounter < prescaler) then  
                freqCounter <= freqCounter+1;                
              else                         
                freqCounter <= 0;                  
                bitSignal <= not bitSignal;  -- toggle bitSignal
              end if; 
          end process soundGenerator ; 
   
     waveOut <= "00000000" when bitSignal ='0' else amplitude ;

  note <= to_integer( unsigned(noteIn) ) ;
   
  -- note to frequency translation
  with note select 
    prescaler <=  NOTE_C4 when 0 ,
            NOTE_D4 when 1 ,
            NOTE_E4 when 2 ,
            NOTE_F4 when 3 ,
            NOTE_G4 when 4 ,
            NOTE_A4 when 5 ,
            NOTE_H4 when 6 ,
            NOTE_C5 when others ;       
          
end Behavioral;

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um in den Tönen genau(er) zu werden, sollte man den prescaler etwas 
verkleinern und die Töne auf wenigstens 0,1% genau stimmen. Genau 
gerechnet ist das Optimum für den höchsten Ton bei einem Scaler nahe 
Wurzel (Taktfrequenz) zu finden.

Ansonsten empfiehlt es sich, um starre Teiler zu machen und die 
Primärfrequenzen zum weiteren Teilen hochfrequent genug zu erzeugen:

Die Teiler für 7 Haupttöne (weisse Tasten) wären:
24, 27, 30, 32, 36, 40, 45 (gemäß dieser Überlegung):
Beitrag "Re: Zweiklang Ton erzeugen"

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für die jetzige Ausbaustufe der Tonerzeugung in diesem Thread wird das 
wahrscheinlich eher keine Rolle spielen.
Damit man den Unterschied beim Abspielen der Tonleiter hört, brauch man 
wahrscheinlich ein absolutes Gehör.
Aber ich werde Deinen Vorschlag mal im Hinterkopf behalten, vielleicht 
erreicht dieser Thread ja noch die Stufe, wo es wichtig wird.

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier die neueste Kreation um zwei Töne gleichzeiig zu spielen.

Im MelodyPlayer musste ich für das Mischen von zwei Tönen 
STD_LOGIC_VECTOR in Integer und zurück verwandeln, damit ich die Werte 
addieren konnte. Das finde ich etwas umständlich.

Gespielt werden Zweiklänge, deren musikalische Qualität durch meine 
begrenzten musikalischen Kenntnisse bedingt ist ;-)
Vielleicht will sich da mal ein Musiker drann wagen ...
  -- mixer
  pwmValueInt <= to_integer(unsigned(wave1))+ to_integer(unsigned(wave2));
  system_pwmValue (7 downto 0 ) <= std_logic_vector( to_unsigned( pwmValueInt,8 ) );
  
  -- use sequencer leds to control sound
  -- melody1
   with sequencerStep select 
    note1 <=  "000" when not "00000001" , 
          "000" when not "00000010" , 
          "000" when not "00000100" ,
          "001" when not "00001000" ,
          
          "011" when not "00010000" ,
          "000" when not "00100000" ,
          "000" when others ; 
     -- melody2
   with sequencerStep select 
    note2 <=  "000" when not "00000001" ,
          "010" when not "00000010" ,
          "101" when not "00000100" ,
          "011" when not "00001000" ,
          
          "101" when not "00010000" ,
          "010" when not "00100000" ,
          "000" when others ;

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

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Im MelodyPlayer musste ich für das Mischen von zwei Tönen
> STD_LOGIC_VECTOR in Integer und zurück verwandeln, damit ich die Werte
> addieren konnte. Das finde ich etwas umständlich.
Du kannst auch (un-)signed Vektoren addieren.
  system_pwmValue <= std_logic_vector(unsigned(wave1)+unsigned(wave2));
Was dir da allerdings passieren wird, ist dass dich der Synthesizer zu 
Recht abwatscht, weil die Addition zweier 8 Bit Vektoren einen 9 Bit 
Vektor gibt.


Und wenn du an geeigneter Stelle statt std_logic Vektoren gleich 
unsigned Vektoren verwendest, dann musst du überhaupt gar nichts 
konvertieren:
  system_pwmValue <= wave1+wave2;

Fazit: nicht VHDL an sich ist umständlich und geschwätzig. Es wird dazu 
gemacht... ;-)

: Bearbeitet durch Moderator
Autor: Edi. M. (Firma: Industrie 1.0) (elektromeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> außerdem viel das Wort "BASCOM".

Ich kaufe ein "F" :-)


chris schrieb:
> Ich bin ja erstaunt, was für Kleinode sich hier im MC-Netz so finden
> lassen.

Recht einfach gehalten. Eher nicht anzunehmen, dass das klingt, wie der 
Original-CHIP. Der war übrigens damals sehr berühmt und vielfach 
verbaut.
In den 80ern war der an jeder 5. Hausklingel zu hören.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> https://www.mikrocontroller.net/attachment/highlight/158318
> Recht einfach gehalten. Eher nicht anzunehmen, dass das klingt, wie der
> Original-CHIP.

Ich finde es aber trotzdem gut gemacht, weil es zeigt, dass man mit so 
einem kurzen Code schon mehr als nur simples Rechteckgefiepse erzeugen 
kann.

Lothar Miller schrieb
> Und wenn du an geeigneter Stelle statt std_logic
> Vektoren gleich unsigned Vektoren verwendest,
> dann musst du überhaupt gar nichts konvertieren:

Bis jetzt habe ich als Ports für die Submodule STD_LOGIC_VECTOR 
verwendet. Kann man auch einfach "Integer" verwenden? Dann könnte ja 
einiger Schreibaufwand weg fallen.


Hier habe ich noch eine VHDL-ADSR entdeckt und nach einigem Probieren 
hat das Einbinden auch funktioniert:
https://github.com/hanshuebner/rekonstrukt/blob/ma...

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Zweitongenerator mit ADSR.

Der Aufbau ist dabei folgender

top_MACHX02

+ top_sub_melodyPlayer

++ noteTonegenerator
++ adsr
++ pwmDac

top_MACHX02 ist wieder nur die Anbindung für das MACHX02 und darunter 
liegt gleich top_sub_melodyPlayer der die Notentabellen beinhaltet und 
die Glue-Logik.

Autor: Edi. M. (Firma: Industrie 1.0) (elektromeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal ein Tonbeispiel rein, damit wir hören, wie das klingt.

Auch zu dem SAB köknnte man mal was posten. Kaum anzunehmen, dass der 
Code dem Original nahekommt.

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>Mach mal ein Tonbeispiel rein, damit wir hören, wie das klingt.
Im Moment habe ich ja nur den Piezo als Lautsprecher angeschlossen, von 
daher ist das im Moment noch weniger beeindruckend.

>Auch zu dem SAB köknnte man mal was posten. Kaum anzunehmen, dass der
>Code dem Original nahekommt.
Naja, das FPGA hat ein paar Transistoren mehr als der Chip, der 
vermutlich aus den 80er Jahren stammt.

Der erste Ton des Codes SAB0600 klingt realtiv gut, die anderen bei 
meinem Piezo-Versuchsaufbau etwas überssteuert.
Ich vermute, dass das von der Mixer-Implementierung von Lothar kommt.
      mix := '0';
      if adsr660>pwmcnt and hz660= '1' then  mix := not mix;
      end if;
      if adsr550>pwmcnt and hz550= '1' then  mix := not mix;
      end if;
      if adsr440>pwmcnt and hz440= '1' then  mix := not mix;
      end if;
      speaker <= mix;
von
https://www.mikrocontroller.net/attachment/highlight/158318

Wahrscheinlich müsste man die Signalamplituden eher addieren und dann 
die Summe auf eine AudioPWM ausgeben.

Autor: Edi. M. (Firma: Industrie 1.0) (elektromeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kaum anzunehmen. Der Mixer, mixt nämlich gar nicht, sondern muxt! Es ist 
ein Multiplexer und zwar ein Inklusivmuxer. Wenn ein Signal dominant 
anliegt, wird der Ton nicht gemuxt. Das kann so nicht funktionieren.

Die Tonwellen müssen addiert und dann in eine PWM übersetzt werden. Oder 
man muss die drei Töne sehr schnell multiplexen, also die drei PWM-Bits 
parallel arbeiten lassen und dann am Pin schnell umschalten. Kriegste 
halt nur ein Drittel der PWM- Frequenz hin.

Besser wäre es sicher, drei Ausgangspins zu nehmen und die über 
Widerstände auf einen Summenpunkt arbeiten zu lassen. Allerdings kannst 
Du dann auch gleich den PWM-Wert über 2 Pins und einen R2R-Wandler 
ausgeben: Der wert wäre ja maximal 3.

Warum nimmst Du eigentlich überhaupt ein PWM? Nimm einen R2R-Wandler mit 
5 Widerständen und 5 Bit. Das sind 32 Stufen bei Taktfrequenz. 
Anschließend ein träges RC-filter auf 10kHz Grenzfrequenz.

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

Bewertung
0 lesenswert
nicht lesenswert
E. M. schrieb:
> Das kann so nicht funktionieren.
Und sie dreht sich doch... ;-)

E. M. schrieb:
> Eher nicht anzunehmen, dass das klingt, wie der Original-CHIP
Probiers aus: ein Laie kann das kaum auseinander halten.

chris schrieb:
> Der erste Ton des Codes SAB0600 klingt realtiv gut, die anderen bei
> meinem Piezo-Versuchsaufbau etwas überssteuert. Ich vermute, dass das
> von der Mixer-Implementierung von Lothar kommt.
Hier im Beitrag "Re: Zweiklang Ton erzeugen - direkte Ausgabe per PWM" sind die 
Hintergründe dieser "Mischung" etwas erläutert. Letztlich ist es 
natürlich so, dass wenn 1 Ausgang schon die volle Amplitude bringt, eine 
Mischung verzerren muss, weil sie ja rein rechnerisch schon nicht 
funktionieren kann.

Man müsste also tatsächlich den Mischer etwas aufwändiger gestalten,  so 
dass jeder Ton maximal 1/3 der Maximalamplitude beisteuern kann.

: Bearbeitet durch Moderator
Autor: Edi. M. (Firma: Industrie 1.0) (elektromeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> E. M. schrieb:
>> Das kann so nicht funktionieren.
> Und sie dreht sich doch... ;-)

Rauskommen tut da was, klar, aber eine Mischer ist das nicht so 
wirklich. Daher schrieb Ich Muxer, denn das ist, was da passiert: Durch 
das gleichzeitige Aktivsein zweier Wellen, wird die PWM-Welle getoggelt 
und damit werden deren Rechtecke gefaltet. Es entstehen also die 
typischen Mischprodukte, allerdings ist der Filter nicht dafür 
ausgelegt.

Ich fände einen echten Mischer, also ein Rotieren der Pins praktikabler. 
Es muss natürlich dafür gesorgt werden, dass die PMMs eine Mitte 
produzieren und sich nicht eine 0 nach unten durchsetzt. Das würde zu 
einigen Verzerrungen führen denke Ich.

Auf diese Weise kann man übrigens zwei PWM Steuerungen ineinanderfahren 
um das Signal zu übergeben: Beispiel Ineinanderlaufenden 
Lauflichtleisten.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerade habe ich mir das Original angehört:
https://www.youtube.com/watch?v=RF9SGqEax8o
Für mich klingt der zweite und dritte Ton dort auch übersteuert.
Wenn man genau hinhört, vermindert sich die Amplitude beim letzten Ton 
stufenweise.
Ursprünglich dachte ich, der SAB0600 sei eher ein analoges Design, aber 
es scheint wohl eher digital zu sein. Beim analogen Design wäre es für 
die FPGA Implementation schwierig gewesen, den Ton gut zu emulieren.
Deshalb klingt die FPGA Version dem Original schon sehr ähnlich.
Was wäre eigentlich ein geeigentes, sehr kleines FPGA dafür?

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

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Was wäre eigentlich ein geeigentes, sehr kleines FPGA dafür?
Wie im Beitrag "Re: Warum ist hier weniger los als." schon 
gesagt: die paar Flipflops passen bei geeigneter Taktfrequenz sogar in 
ein CPLD.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann die Frage: Welches CPLD? Gibt es eines mit 8 Pins, welches passen 
würde?

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

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Welches CPLD?
Das, das 18V aushält.

> Gibt es eines mit 8 Pins
Nimm eines im QFP 64 und schneide die nicht benötigten 56 Pins ab...

> welches passen würde?
Hochkant vielleicht?  ;-)

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
Hier die gespielte Version auf dem MACHX02 nach Lothar Miller ;-)

Autor: Ale (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
QFP64 ?

Nimm einfach ein QFN-32 5x5 mm... nichmal ein DIP-8 ist so klein !

Die 3 Töne klingen... Gewöhnungsbedürftig ;D

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liegt vermutlich am Mikrophon am Laptop. Mit den Ohren klingt es für 
mich fast wie das Original.

Vielleicht gibt es auch eine Interferenz von hochfrequenten Tönen aus 
meinem MP3-Verstärker-Lautsprecher mit dem Mikrophon in einem Bereich, 
den ich nicht mehr hören kann ...

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Liegt vermutlich am Mikrophon am Laptop. Mit den Ohren klingt es für
> mich fast wie das Original.
Nun ja, abgesehen davon, dass es mehrere Originale gibt,  würde Ich 
sagen, dass es sich vom YT schon stark unterscheidet. Vollkommen andere 
Schwebungen und die Tonhöhen sind auch nicht richtig stimmig.

Man muss sich halt fragen, was man will: Einen einfachen Klang bekommt 
man aus ein paar Zählern raus, eine wirklich echte Emulation eines 
Analogshcaltkreises, um ihn weitgehend echt abzubilden, wie ein SAB oder 
SID et. al. wird so oder so schwierig. Auch die Teile solcher Chips, die 
Digitalteile sind, unterliegen etlichen Effekten der Analogwelt - vor 
allem, weil da in Sachen Versorgung und Präzision kostenoptimiert 
designed wurde. Das gilt auch für elektronische Musikinstrumente: Bei 
vielen Klangerzeugern der 80er und 90er schlägt sich ein schwaches 
Netzteil, eine unzureichende Entkopplung, Übersprechen, einfache 
nichtlineare Verstärker und sonstige Verzerrungen nieder.

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>Nun ja, abgesehen davon, dass es mehrere Originale gibt,  würde Ich
>sagen, dass es sich vom YT schon stark unterscheidet.

Das liegt bestimmt an Deinen über lange Jahre mit 96kHz geschulten Ohren 
:-)

Im Anhang noch das VHDL-Beispiel mit ADSR von oben mit einem lüfterlosen 
Laptop aufgenommen. Da scheinen die Störgeräusche etwas niedriger.

Witzig an dem Beispiel: Obwohl nicht so absichtlich programmiert, ändert 
sich die Tonart des "Refrains" immer ein wenig. Damit klingt es 
praktischerweise weniger monoton.

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das zerrt ja irrsinning, brrr.....

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber, aber .. es klingt doch irgendwie ungewöhnlich, nicht?
Du kannst ja die 5 Töne mal auf Deinen professionellen Anlagen laufen 
lassen.
Es sind zwei Spuren parallel, schnelles Attack, landsameres Decay und 
Rechtecksignal ..

Ansonsten: ich glaube, hier ist gar nicht so das 
Musik-Synthesizer-Forum, das Zip-File mit dem Code wurde nur 1 x runter 
geladen.

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Ansonsten: ich glaube, hier ist gar nicht so das
> Musik-Synthesizer-Forum, das Zip-File mit dem Code wurde nur 1 x runter
> geladen.

Das ist wohl so, wobei das in meinem Fall daran liegt, dass Ich 
insgesamt sehr wenig Bedarf an VHDL für Audioerzeugung habe, weil meine 
Platte damit schon voll ist :-)

Mir fehlt eigentlich nur eine richtig gute Trompetenemulation.

: Bearbeitet durch User
Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal eine Frage, an diejenigen, die sich ein wenig mit der 
Audiosignalerzeugung auskennen:
Reicht ein Sinus mit 8Bit Zeitauflösung wie der von Lothar aus, um einen 
guten Klang zu erhalten?:

http://www.lothar-miller.de/s9y/archives/37-DDFS-m...

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

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Reicht ein Sinus mit 8Bit Zeitauflösung wie der von Lothar aus, um
> einen guten Klang zu erhalten?
Definiere "gut".
Der Rauschabstand ist schon mal nur 48dB, das ist auf jeden Fall 
"retro".
Wenn du solche "old school" Sounds erzeugen willst, dann ist der Klang 
gut.

> Reicht ein Sinus mit 8Bit Zeitauflösung wie der von Lothar aus
Über welchen Frequenzbereich? Mit welchem Filter?

: Bearbeitet durch Moderator
Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Definiere "gut".

Die Grenze, bei der ein ca.35 jähriger Erwachsener die nächst höhere 
Auflösungsstufe eines Sinus sowohl bei der Zeit als auch bei der 
Amplitudenquantisierung bei einer Frequenz von 440Hz und einer 
Samplingfrequenz von 48kHz nicht mehr von der vorigen unterscheiden 
kann.

Präzise genug?

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So sieht das aktuell gemessen nach einem RC-TP mit 100Ohm,100nF aus.

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> chris schrieb:
>> Reicht ein Sinus mit 8Bit Zeitauflösung wie der von Lothar aus, um
>> einen guten Klang zu erhalten?
> Der Rauschabstand ist schon mal nur 48dB, das ist auf jeden Fall
> "retro".
> Wenn du solche "old school" Sounds erzeugen willst, dann ist der Klang
> gut.

Der "Retrosound" kommt ja durch Quantisierung der Amplitude 
(harmonisches Spektrum mit binären FAktoren) und die Sprünge gemäß der 
Auflösung der Phase bei ungeraden Frequenzen zustande, die sich in einer 
Faltung äussern.
Vor allem die neuen Spiegelfrequenzen sind es, die den Ton machen, wobei 
da auch die Filter der Klangerzeuger-Chips eine große Rolle spielen, was 
die daraus machen. 48dB Güte wären gfs schon zu gut, wenn man die 
Frequenz passt und man es auch eine Sinuserzeugung anlegt.

8 Bit als Quelle sind auch generell nicht unbedingt ein Hindernis. Man 
kann das ja intern auch interpolieren und hochsetzen, filtern und 
vorverarbeiten.
Es kommt halt darauf an, wieviel man speichern und wie viel man 
prozessieren möchte: Je einfacher man Auslesen und Ausgeben will, desto 
breiter muss die Tabelle sein.

Meine Synths arbeiten z.B. mit 18 Bit Auflösung in der Phase für die 
höchste Frequenz, allein netto ohne Interpolation, dithering etc. Die 
Synthesegleichungen und Tabellen liefern 24 Bit Daten aus 18 Bit Phase. 
Der Phasenakku hat dann jeweils mindestens 36 Bits für alle 
Manipulationen wie Verzerrung, Faltung und Vibrato. Damit ist das 
wirklich wie analog und es gibt keine Artefakte. Da Ich sowohl bei der 
Phase als auch der Auflösung in Echtzeit parametrisch dezimieren kann, 
lässt sich der Qualitätsverlust direkt anhören, bez zumindest messen.

Weniger als 12-14 Bit Phasenauflösung sollte man für eine breitbandige 
DDS nicht haben, bei komplizierten Wellenformen entsprechend mehr.


>> Reicht ein Sinus mit 8Bit Zeitauflösung wie der von Lothar aus
> Über welchen Frequenzbereich? Mit welchem Filter?
Genau das ist die Frage. Man kann aus einem 1-Bit-Rechteck einen Sinus 
modellieren, wenn man genügend gut filtert. Je tiefer die Frequenz, 
desto besser ist das Signal. Effektiv wird das natürlich nur durch eine 
Modulation.
Dazu ist auch bereits genug hier geschrieben worden, siehe PDM, DSD.

Als Richtwert kann man sagen, dass man mit einem FPGA direkt auf einem 
Pin ohne große Verrenkungen ein 16-Bit-Audio nur mit einem guten 
analogen AA-Filter hinbekommt. Nimmt man dagegen nur ein einfaches 
RC-Filter, muss das der Modulator berücksichtigen und es muss 
ausgemessen sein, bzw justiert werden, oder die Qualität ist schlechter.

Wenn man sich auf das untere Spektrum konzentriert, reicht die Qualität 
immerhin bei einem mittelmäßigen 24dB-Filter auf z.B. 400Hz, um Bässe 
auszugeben und sauber in der Phase zu führen, d.h. man kann Subwoofer, 
die i.d.R. unter 80Hz arbeiten, ohne Qualitätsverlust betreiben.

> So sieht das aktuell gemessen nach einem RC-TP mit 100Ohm,100nF aus.

Wenn man jetzt nicht 1 Bit, sondern 8 hat, ist man statistisch zwischen 
Faktor 8 und Wurzel 8 besser, je nachdem, welchen Aspekt des Klangs man 
betrachtet. Das Problem ist aber, die Bits sauber rauszubekommen. Ohne 
DAC wird das nichts, oder man braucht eine optimierte Ansteuerung für 
ein R2R-Filter, das kalibiert wird. Damit wiederum hauen manche 32 Bit 
raus und übertreffen auch 24-Bit-Delta-Sigma-Wandler.

Von daher ist entweder ein richtiger DAC mit voller Auflösung oder 1-Bit 
Audio zu bevorzugen, weil alles, was man im FPGA an Tricks und 
Vorverarbeitung macht, mathematisch perfekt läuft.
Das Problem ist dann nur, es auf einen Lautsprecher zu bekommen. Heute 
arbeiten fast alle Stufen digital, die kann man aber so direkt nicht mit 
200MHz ansteuern, weil sie nicht mehr als 500kHz vertragen. Die 
500W-Leistungsteile eher nur 200kHz.
Da muss man dann einen schlauen Filter/Modulator einsetzen, um diesen 
Faktor 1000 gut runter zu bekommen - und zwar einen sehr schlauen, der 
auch für den Analogteil des Amps mitdenkt :-)

Autor: chris (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
>Meine Synths arbeiten z.B. mit 18 Bit Auflösung in der Phase für die
>höchste Frequenz, allein netto ohne Interpolation, dithering etc. Die
>Synthesegleichungen und Tabellen liefern 24 Bit Daten aus 18 Bit Phase.
>Der Phasenakku hat dann jeweils mindestens 36 Bits für alle
>Manipulationen wie Verzerrung, Faltung und Vibrato. Damit ist das
>wirklich wie analog und es gibt keine Artefakte. Da Ich sowohl bei der
>Phase als auch der Auflösung in Echtzeit parametrisch dezimieren kann,
>lässt sich der Qualitätsverlust direkt anhören, bez zumindest messen.

>Weniger als 12-14 Bit Phasenauflösung sollte man für eine breitbandige
>DDS nicht haben, bei komplizierten Wellenformen entsprechend mehr.

Danke für die Hinweise, das sind doch mal gute Anhaltspunkte.
Für den Sinus würde das also im kleinsten Fall 12 Bit, also 4096 
Abtastwerte  anstatt der 2056 Abtastwerte im Moment, d.h. Faktor 16 
mehr.

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
Hier mal die Tonfolge mit Sinus und anderen Waveforms.
Eigentlich fand ich ja die übersteuerte Version in diesem Thread 
besser...

Autor: Edi. M. (Firma: Industrie 1.0) (elektromeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo das gerade als "zuletzt geänderter Beitrag" über die Liste schwirrt, 
habe Ich es mir angehört und muss doch ernsthaft fragen, wozu man da ein 
dickes FPGA benötigt. Solche Sachen lassen sich mit einfachsten 
Schaltungen machen und nicht zuletzt mit einem Microcontroller. Woher 
kommt eigentlich die Wut mit grösstmöglichem Einsatz kleinstmögliche 
Ergebnisse zu schaffen?

In der Zeit wo man umständlich einen FPGA programmiert , wäre mit einem 
Controller der 8-Bit-2-Euro-Klasse 10mal mehr zu machen. Mehr als 
Spielerei kommt da nicht bei raus.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wo das gerade als "zuletzt geänderter Beitrag" über die Liste schwirrt,
>habe Ich es mir angehört und muss doch ernsthaft fragen, wozu man da ein
>dickes FPGA benötigt.

Wo steht denn geschrieben, dass man dafür ein dickes FPGA benötigt?

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein wenig der Versuch, die Auslastung durch meinen 
2-Oscillator-Synthesizer abzuschätzen.

Im Floorplan sieht es so aus, als wenn etwas ein Fünftel des FPGAs 
benutzt ist. Das scheint mir ganz gut zu der Anzahl der Slices von 15% 
zu passen.
Design Summary:
   Number of registers:    394 out of  7209 (5%)
      PFU registers:          394 out of  6864 (6%)
      PIO registers:            0 out of   345 (0%)
   Number of SLICEs:       503 out of  3432 (15%)
      SLICEs as Logic/ROM:    503 out of  3432 (15%)
      SLICEs as RAM:            0 out of  2574 (0%)
      SLICEs as Carry:        355 out of  3432 (10%)
   Number of LUT4s:        1001 out of  6864 (15%)
      Number used as logic LUTs:        291
      Number used as distributed RAM:     0
      Number used as ripple logic:      710
      Number used as shift registers:     0
   Number of PIO sites used: 14 + 4(JTAG) out of 115 (16%)
   Number of block RAMs:  2 out of 26 (8%)

Für die Sinus-Rom-Tabellen nutzt der Synthesizer wohl den eingebauten 
Speicher. Einen davon habe ich angeklickt. Man sieht die grünen 
Verbindungslinien.

Das jetzige Design müsste als für ca. 10 Oscillatoren reichen. Weil das 
compilieren aber so lange dauert, lasse ich es mal bei dem Versuch mit 2 
Oscillatoren bewenden.

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch der Schaltplan zur Übersicht, den Lattice-Diamond aus dem 
VHDL-Code automatisch generieren kann.

Autor: Edi. M. (Firma: Industrie 1.0) (elektromeister)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
chris schrieb:
> Wo steht denn geschrieben, dass man dafür ein dickes FPGA benötigt?

FPGAs sind immer ineffizient in der Nutzung der Chipfläche und wenn man 
etwas mit einem kleinen Controller machen kann, ist das das Mittel der 
Wahl. Das mag jetzt Philosophie sein, aber uns wurde beigebracht, 
Lösungen mit den geringsten Mitteln zu bauen und daruf richtet sich der 
Blick bi Entwicklungen in der Industrie. Heute ist es aber wohl üblich, 
erst einmal mit MATLAB ein Systemmodell zu bauen, dann die Umsetzung 
automatisiert erledigen zu lassen (man kann es ja selber nicht) und dann 
sehr viel Gedöhns für wenig Inhalt zu haben. Dann aber gleich ein Video 
machen und ab nach Youtube, damit es nach richtig viel aussieht.

>floor plan
Bist Du eigentlich wirklich der Überzeugung, dass ein floor plan eine 
Aussage für einen Leser macht, wenn er das design tool nicht zu Hand 
hat? Ich erkenne da nur Farbkleckse. :-)

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So schlecht ist das jetzt gar nicht. Meine ersten PLD-Versuche klangen 
ähnlich. Ich finde es sogar lustig, klingt irgendwie nach 80-er Jahre 
Telespiel. Allerdings sind "unmusikalische" 9 Töne pro Wiederholung 
verbaut und so hat es keinen Rhythmus. Habe es mal durch meinen 
FPGA-Sampler gejagt: Reloop bei 300, 400 und 700ms.

Jetzt brauchen wir noch einen Rauschgenerator fürs Schlagzeug.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>So schlecht ist das jetzt gar nicht.
Upss, das hätte ich ja jetzt fast nicht wieder erkannt. Nach dem 
Durchlauf durch Deinen "Looper" klingt das tatsächlich um einiges besser 
als mein Original.

> Meine ersten PLD-Versuche klangen ähnlich.
> Ich finde es sogar lustig, klingt irgendwie nach 80-er Jahre
>Telespiel.
Das hat ich tatsächlich auch etwas erstaunt. Eigentlich hätte ich 
gedacht, dass der typische 8Bit Sound aus den 80ern durch die 
Quantisierung und die kleinen Abtastraten verursacht waren. Deshalb habe 
ich ja nach der notwenigen Auflösung für den Sinus gefragt.
Der jetzt eingebaute hat 1024 Steps und 16 Bit. Die Artifakte hört man 
immer noch ein wenig, aber ich hatte das Gefühl, sie liegen auf einem 
erträglichen Maß. Aber trotz dieser Maßnahme klingt es immer noch fast 
wie C64. Das Problem war dort also nicht die Auflösung, sondern die 
Struktur der Tongenerierung ( wenig Generatoren ).

>Allerdings sind "unmusikalische" 9 Töne pro Wiederholung
>verbaut und so hat es keinen Rhythmus.
Upps .. nein ... ich habe mich verzählt und es ist mir akkustisch nicht 
aufgefallen.
Gibt's nicht so was wie den 3/3 Takt oder 9/9 Takt. Sollte man ihn 
erfinden? Wahrscheinlich muss sich das Gehör an die neue Taktform nur 
lange genug gewöhnen, wie in meinen Experimenten oder bei Heavy Metall 
;-)

>Habe es mal durch meinen
>FPGA-Sampler gejagt: Reloop bei 300, 400 und 700ms.

Klingt gut. Ich nehme an, "FPGA-sampler" bedeutet in dem Fall "Echo" bei 
300,400 und 700ms.

>Jetzt brauchen wir noch einen Rauschgenerator fürs Schlagzeug.
Am Ende in meinem Stück ist der "Knall". Den hast Du "ausgefadet".
Eigentlich ist das ein Rauschgenerator.

Wie sollte die Melodie organisiert sein: 8 Takte auf den zwei Kanälen 
und beim jeweils 8.ten der zusätliche Rauschgenerator als Schlagzeug? 
Die ADSR dafür A=0 D=200ms ?

Ich verlinke noch die interessante Melody hier, damit sie nicht verloren 
geht:
Beitrag "Re: So schön können Pointer-Fehler sein"

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Edi. M. (Firma: Industrie 1.0) (elektromeister)
>FPGAs sind immer ineffizient in der Nutzung der Chipfläche und wenn man
>etwas mit einem kleinen Controller machen kann, ist das das Mittel der
>Wahl. Das mag jetzt Philosophie sein, aber uns wurde beigebracht,
>Lösungen mit den geringsten Mitteln zu bauen und daruf richtet sich der
>Blick bi Entwicklungen in der Industrie.

Dem aufmerksamen Leser dürfte die Thread-Überschrift nicht entgangen 
sein.
Es geht hier um Grundlagen und Übungsprojekte, nicht um die industrielle 
Entwicklung eines "Tonerzeugers".
Tatsächlich kann man das bisher erreichte locker mit einem günstigen 
Mikrocontroller erzeugen, der sich auch noch viel einfacher 
programmieren lässt ( Was ich schon in verschiedensten Ausführungsformen 
gemacht habe ).
Ich wollte aber u.a. mal sehen, wie z.B. ein im FPGA implementierte 
Sigma-Delta-Wandler in der Praxis klingt. Und mein selbst gebauter 1.ter 
Ordnung läuft mit 50MHz, das ist auf einem MC eher nicht machbar.
Und wenn man wirklich an die professionellen Grenzen des musikalisch 
Machbaren wie Jürgen geht, dann wird man wohl auch ein FPGA brauchen, 
schätze ich.
Außerdem gibt es noch ein Argument für die FPGA-Grundlagen zur 
Tonerzeugung: Es macht schlicht mehr Spaß als das ziemlich ausgetretene 
LED-geblinke welches normalerweise in Anfängerübungen gemacht wird.

Autor: Weltbester FPGA-Pongo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Ich wollte aber u.a. mal sehen, wie z.B. ein im FPGA implementierte
> Sigma-Delta-Wandler in der Praxis klingt.
Dort ist standardmäßig zunächst überhaupt nichts implementiert, wie Du 
aber sicher wießt, das wirst Du selbst tun müssen wodurch das Ergebnis 
von deinem Ansatz abhängig sein dürfte. Und ob ein Wandler "klingt" 
darüber hat jeder Audiotyp seine eigene Meinung. Dem grundsätzlichen 
Sinne nach sollen Analog-Digital-Wandler für sich gesehen eigentlich 
überhaupt garnicht klingen, sondern nur wandeln unf gut ist.

> Außerdem gibt es noch ein Argument für die FPGA-Grundlagen zur
> Tonerzeugung: Es macht schlicht mehr Spaß als das ziemlich ausgetretene
> LED-geblinke welches normalerweise in Anfängerübungen gemacht wird.
Da ist natürlich etwas dran. Irgendwas musst Du schliesslich bauen. Man 
hätte aber auch darüber nachdenken können, irgendetwas mit encryptic zu 
machen, um  Codes zu knacken, also etwas, wo richtig Bandbreite benötigt 
wird und der Einsatz eines FPGA mehr gerechtfertigt ist, als beim 
langsamen Audio.

Als Denkanstoss böte sich noch an:
Beitrag "Ideen für interresante FPGA Projekte"

Und besonders das hier:
Beitrag "Ideen für FPGA-Projekte?"

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal der Versuch, das Signal direkt in die Soundkarte eines alten 
PCs einzuspeisen ( Die neuen Laptops habe ja nur noch eine 
Ausgangsbuchse ... ).

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Das hat ich tatsächlich auch etwas erstaunt. Eigentlich hätte ich
> gedacht, dass der typische 8Bit Sound aus den 80ern durch die
> Quantisierung und die kleinen Abtastraten verursacht waren.
Da waren ja noch analoge Filter drin, die Signale waren schon "rund". 
Die Stufen tauchen da eher als Oberwellenanteil auf. Da gibt es auch 
noch viele Aspekte. Unter anderem waren die Frequenzen nicht exakt auf 
der Skala, hatten aber bei einfachen Tongeneratoren aber immer dieselbe 
Frequenz. Damit falten sich die Oberwellen unterschiedlicher Töne 
ineinander und löschen sich gegenseitig aus, wenn mehrere Stimmen 
beteiligt sind.

> Gibt's nicht so was wie den 3/3 Takt oder 9/9 Takt.
3/4 und 5/4 sind üblich.
Die anderen Takteinstellungen braucht man nur für die Echos auf dem 
jeweils 3. und 7. Takt als Auftakt. Viele Drumboxen machen davon 
Gebrauch.

> Sollte man ihn erfinden?
Auf geht's :-)

Autor: Weltbester FPGA-Pongo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Ich habe mich absichtlich nicht an der "Zweiklang Diskussion" beteiligt,
> weil es mir zu trivial erschien. Zwei DDS-Generatoren und gut ist.
Was ist denn an Deiner hier vorgestellten Schaltung anderes drinne, als 
ein DDS-Generator? Ist Dir klar, was Du baust?

chris schrieb:
> Seltsam, warum laden die Leute das Top-Level-Diagramm für das MACHX02
> herunter, aber nicht den Tongenerator?
Vermutlich, weil sie von dem Tongenerator erschlagen sind und die Masse 
an VHDL nicht verstehen.

Im Ernst: Nichts an dem Thema hat wirklich etwas mit FPGAs zu tun. Als 
Software für einen DSP oder MCU sähe es in C ganz genau so aus. 1:1 ztu 
übersetzen. Das sind eher Musikfragen, wie Töne abgespielt werden 
müssen.

> Der SID aus dem C64 wäre hier ein gutes Beispiel. Ich hänge mal das
> Schema an.
Das wäre schon eher eine Aufgabe für einen FPGA, besonders die Filter.
Da könntest Du Dir Sporen verdienen, einen solchen Baustein 
nachzukonstruieren.

> Gibt es einen fertigen Hüllkurvengenerator in VHDL?
Der sollte recht einfach in einer state machine zu machen sein.

FPGA macht nur dann einen Sinn, wenn es ohne nicht geht, wie bei dem 
Bauwerk hier:
http://www.keyboardpartner.de/hammond/hoax.htm

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lieber Weltbester FPGA-Pongo,

würde es Dir etwas ausmachen, einen Thread vorher durchzulesen, bevor Du 
ihn kommentierst?

>Ist Dir klar, was Du baust?

Eine VHDL Übung um mich ein wenig an den Syntax und die Strukturen zu 
gewöhnen. Ich dachte, ich hätte das verständlich genug beschrieben:
Beitrag "Re: VHDL Grundlagen Tonerzeugung"

>FPGA macht nur dann einen Sinn, wenn es ohne nicht geht,
> wie bei dem Bauwerk hier:
>http://www.keyboardpartner.de/hammond/hoax.htm

Ob dem Mann wohl klar war, welche Bedeutung "Hoax" üblicherweise hat?

Autor: Weltbester FPGA-Pongo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Ob dem Mann wohl klar war, welche Bedeutung "Hoax" üblicherweise hat?
Es ist "ihm" klar geworden und "er2 hat seine Bezeichnung inzwischen 
geändert. Die Bezeichnung ändert jedoch nichts an der Qualität des 
Gerätes.

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Ich wollte aber u.a. mal sehen, wie z.B. ein im FPGA implementierte
> Sigma-Delta-Wandler in der Praxis klingt. Und mein selbst gebauter 1.ter
> Ordnung läuft mit 50MHz,

Das hier wäre noch lesenswert dazu Pulsdichtemodulation

Weltbester FPGA-Pongo schrieb:
> chris schrieb:
>> Der SID aus dem C64 wäre hier ein gutes Beispiel. Ich hänge mal das
>> Schema an.
> Das wäre schon eher eine Aufgabe für einen FPGA, besonders die Filter.
> Da könntest Du Dir Sporen verdienen, einen solchen Baustein
> nachzukonstruieren.

Gibt es schon einige unter anderem den hier:
http://www.fpgasid.de

Anders, als meine Emulation, gibt es den sogar im Formfaktor zu dem 
MOS-Chip - ist also direkt einzusetzen. Was der in Sachen Authentizität 
kann, weiß Ich nicht, bei dem SID ist es nur so, dass viele Emulatoren 
einfach das Datenblatt nachbauen und vergessen, dass der Klang zu 80% 
durch die Effekte der Analogtechnik in den Ding gemacht werden.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Gibt es schon einige unter anderem den hier:
>http://www.fpgasid.de

Ja, SID Realisierungen gibt es einige.
Hier z.B. mit dem Papillo:
https://www.youtube.com/watch?v=_34yHrEZC-E&featur...

Gibt es eigentlich Unterlagen über die Filter des Original-SID ? Ich 
habe da noch nichts gefunden.

Interessant ist auch, was man mit Mikrocontrollern alles so an 
Synthesizern machen kann.
Hier Beispiele mit dem Axoloti ( STM32F4 ):
http://www.axoloti.com/examples/

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine praktische Sammlung von Links zur DDS-Tonerzeugung hier im Forum 
soll nicht fehlen:

Beitrag "Re: Sinustabelle in FPGA initialisieren"

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Gibt es eigentlich Unterlagen über die Filter des Original-SID ? Ich
> habe da noch nichts gefunden.

Nicht so wirklich, jedenfalls habe Ich keine verlässlichen Infos. Das 
Problem der Filter ist aber nicht nur, dass die Wirkung der Parameter 
nicht 100% klar ist, sondern auch die analoge Komponenten des Ausgangs 
des SID selbst stark mitspielen. Schau Dir mal die Beschaltung des SID 
an - speziell den teils verbauten Leistungstransistor .-(

Wenn es unbedingt der SID sein soll, dann wäre hier die Anlaufstelle:

http://www.waitingforfriday.com/?p=661
http://codebase64.org/doku.php?id=base:sid_programming
https://ccrma.stanford.edu/~chet/projects/tech_con...
https://www.c64-wiki.de/wiki/SID
http://archive.6502.org/datasheets/mos_6581_sid.pdf
https://de.wikipedia.org/wiki/MOS_Technology_SID
http://www.joogn.de/sid.html

Und hier die Innereien mit chipfotos:

http://mail.lipsia.de/~enigma/neu/6581.html

Man höre sich mal die Sound Demos an. Wenn man nur mit einer Stimme 
gearbeitet hat und es dann gemischt hat, ging da einiges!

Das Problem ist aber immer das des Basses gewesen: Zwar konnte der SID 
Frequenzen bis weiter herunter in den Bassbereich generieren, aber 
analog nicht wirklich ausgeben. Bei der SID-Station soll das besser 
gewesen sein.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls ich nichts übersehen habe, ist in den obigen SID-Links auch keine 
genaue Beschreibung der Filter. Ich vermute zur damaligen Zeit sind es 
"switched capacitor" Filter.

Gerade sehe ich, dass es hier einen Beitrag zu Schlagzeugtönen gibt:

Beitrag "Drum-Computer in VHDL"

Ich dachte eine Base-Drum besteht im wesentlichen aus einem 
tief-frequenten Sinus.

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Falls ich nichts übersehen habe, ist in den obigen SID-Links auch keine
> genaue Beschreibung der Filter. Ich vermute zur damaligen Zeit sind es
> "switched capacitor" Filter.

Gut möglich. Leider habe Ich auch keine genauen Info. Ich habe das nach 
Gehör nachgebaut:
http://www.96khz.org/htm/sidemulation.htm
(unten auf der Seite ist ein Soundbeispiel)


> Ich dachte eine Base-Drum besteht im wesentlichen aus einem
> tief-frequenten Sinus.

Ja, die Base-Drum, da ist sie wieder:-)

Bei der Antwort muss Ich etwas ausholen:

Die base line, also die (Rythmus-)basis in einem Mix wird häufig durch 
eine bass drum, also das Instrument Basstrommel realisiert, weswegen 
manche Produzenten (auch Ich) - von einer base drum sprechen. Viele 
Deutsche sprechen es aber auch nur falsch aus (Herr Bohlen z.B.), weil 
sie die Amis nicht richtig verstehen.

Das darf man aber nicht verwechseln:

Gerade in der elektronischen Musik macht der Begriff base drum Sinn, 
weil es in der Tat die Rythmusspur ist, die musikalisch wichtig ist und 
die auch als erste aufgesetzt wird. Diese ist allerdings meist nur eine 
künstliche kick drum, d.h. ein atonaler Knall, wie bei einem 
Überschalldüsenjet, der gefiltert wird, d.h. es entsteht ein 
Frequenzgemisch mit vorwiegend Oberwellen. Die Grundwelle, die man 
erhält passt in das kurze Sample auch nicht richtig rein, sondern 
entsteht in erster Linie durch die Hüllkurve. So machen es auch viele 
Drum-Computer. Der Ton ist also funktionell ein "base* sound, aber nicht 
hauptsächlich im Bassbereich.

Im Techno verwendet man aber auch gerne auf- oder absteigende Frequenzen 
und die werden in der Tat aus Sinus-Sweeps gebildet. Im Trance verwendet 
man wiederum ruhige tiefe Töne, die aus modulierten Sinüssen bestehen 
wobei die drum in den Hintergrund tritt, also der Schlag auf 1 und 3 
leiser ist, als der Bass auf 2 und 4.

In der akustischen Musik mit einer realen Basstrommel sind das auch 
weitgehend stabile Sinusfrequenzen, die bei den großen Swing-Orchestern 
auch lange auslaufen. Bei den großen Orchesterpauken kann man die 
Tonhöhe sogar mit einem Fußpedal stimmen.

In der Rockmusik ist wegen der oft benutzten Felldämmung der Ton oft so 
kurz, dass auch dort kaum ein Sinus richtig erkennbar ist und sich mit 
der Hülllurve mischt. Das sind dann bass drums, aber funktionell gesehen 
oft keine base drums, weil das Schlagzeug bei dieser Musik nicht die 
Rolle spielt und oft erst im Nachhinein aufgenommen und dazugesetzt 
werden. Besonders bei schlecht spielenden Rockmusikern :-)  Dort ist oft 
die Bassgitarre die "base line", weil sie starke Akzente setzt und den 
Rythmus bestimmt.

Wenn Du das nachvollziehen möchtest, brauchst Du Sinusgeneratoren, 
Rauschgeneratoren und Hüllkurvengeneratoren, die alle in den Parametern 
über die Zeit steuerbar sind und entsprechend eingestellt werden, weil 
strenge exakte Sinuswellen nicht gut klingen und auch realitätsfern 
sind.

Eine einfache Methode, das in DrumComputern zu mischen wäre, den 
Bassanteil komplett rauszulassen und nur den atonalen Knack ab 300Hz zu 
benutzen, um dann einen tonalen, zur Musik passenden Klang 
draufzusetzen. Dann ist der Bass stimmbar. Das gleiche macht man mit den 
Toms.

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.

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