Forum: FPGA, VHDL & Co. SucheAltera DE2-115 VHDL Code und Pinbelegung für einen Sinustongenerator


von Pascal K. (Gast)


Lesenswert?

Servus, ich suche im Rahmen einer Projektarbeit für ein Altera DE2-115 
Board den VHDL Code und Pinbelegung für einen Sinustongenerator.

Hat jemand Erfahrung damit oder kann mir den Code und die Pinbelegung 
dafür posten?

Vielen Dank im Voraus ;)

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


Lesenswert?

Pascal K. schrieb:
> Servus, ich suche im Rahmen einer Projektarbeit für ein Altera
> DE2-115 Board den VHDL Code und Pinbelegung für einen Sinustongenerator.
Wie wäre es mit "Selbermachen"? Ist ja nun kein Hexenwerk...

> Hat jemand Erfahrung damit oder kann mir den Code und die Pinbelegung
> dafür posten?
Zum Code: du musst einen Sinus erzeugen und den hinterher auf einem 
DA-Wandler oder per PWM ausgeben. Alles keine Raketentechnik. Dein 
Stichwort: DDFS
http://www.lothar-miller.de/s9y/categories/31-DDFS

von Pascal K. (Gast)


Lesenswert?

Danke erstmal für die schnelle Antwort lkmiller

Habe jetzt folgenden Quellcode:
1
library IEEE;
2
use IEEE.std_logic_1164.ALL;
3
use IEEE.numeric_std.ALL;
4
5
entity SinusPWM is
6
    Port ( clk : in  STD_LOGIC;
7
           pwmout : out  STD_LOGIC);
8
end SinusPWM;
9
10
architecture Behavioral of SinusPWM is
11
   component DDFS is
12
      Port ( CLK       : in  std_logic;
13
             Freq_Data : in  std_logic_vector (7 downto 0);
14
             Dout      : out std_logic_vector (7 downto 0));
15
   end component;
16
   
17
   component PWM is
18
      Port ( clk      : in  std_logic;
19
             pwmvalue : in  std_logic_vector (7 downto 0);
20
             pwmout   : out std_logic);
21
   end component;
22
23
   signal sinus  : std_logic_vector(7 downto 0);
24
   signal sinusplusoffset  : std_logic_vector(7 downto 0);
25
26
begin
27
   I_ddfs : DDFS 
28
   port map( CLK => clk,
29
             Freq_Data  => x"cc",
30
             Dout => sinus);
31
32
   sinusplusoffset <= std_logic_vector(unsigned(sinus)+to_unsigned(128,8));
33
34
   I_pwm : PWM
35
   port map( CLK => clk,
36
             pwmvalue => sinusplusoffset,
37
             pwmout => pwmout);
38
39
end Behavioral;

Dann habe ich noch 2 VHDL Dateien für PWM und DDFS erstellt mit den 
folgenden Codes:


PWM:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity PWM is
6
    Port ( clk      : in  STD_LOGIC;
7
           pwmvalue : in  STD_LOGIC_VECTOR (7 downto 0);
8
           pwmout   : out STD_LOGIC := '0');
9
end PWM;
10
11
architecture Behavioral of PWM is
12
signal cnt : integer range 0 to 254 := 0;
13
begin
14
   process begin
15
      wait until rising_edge(clk);
16
      -- Zähler         
17
      if (cnt<254) then cnt <= cnt+1;
18
      else              cnt <= 0;
19
      end if;      
20
  end process;
21
   
22
   -- Vergleicher
23
   pwmout <= '0' when (cnt>=to_integer(unsigned(pwmvalue))) else '1';
24
  
25
end Behavioral;
26
27
und DDFS:
28
29
library IEEE;
30
  use IEEE.std_logic_1164.all;
31
  use IEEE.numeric_std.all;
32
Entity DDFS is
33
   Port ( CLK       : in  std_logic;
34
          Freq_Data : in  std_logic_vector (7 downto 0);
35
          Dout      : out std_logic_vector (7 downto 0)
36
        );
37
   end DDFS;
38
  
39
Architecture RTL of DDFS is
40
  signal Result  : std_logic_vector (7 downto 0);
41
  signal Accum   : unsigned (20 downto 0) := (others=>'0'); 
42
  alias  Address : unsigned (6 downto 0) is Accum(Accum'high-1 downto Accum'high-7);
43
  alias  Sign    : std_logic is Accum(Accum'high); -- MSB
44
begin
45
   process begin
46
     wait until rising_edge(CLK);
47
     Accum <= Accum + unsigned(Freq_Data);
48
   end process;
49
50
   process (Address)
51
     type Rom128x8 is array (0 to 127) of std_logic_vector (7 downto 0); 
52
     constant Sinus_Rom : Rom128x8 := (
53
       x"00",  x"03",  x"06",  x"09",  x"0c",  x"0f",  x"12",  x"15",
54
       x"18",  x"1b",  x"1e",  x"21",  x"24",  x"27",  x"2a",  x"2d",
55
       x"30",  x"33",  x"36",  x"39",  x"3b",  x"3e",  x"41",  x"43",
56
       x"46",  x"49",  x"4b",  x"4e",  x"50",  x"52",  x"55",  x"57",
57
       x"59",  x"5b",  x"5e",  x"60",  x"62",  x"64",  x"66",  x"67",
58
       x"69",  x"6b",  x"6c",  x"6e",  x"70",  x"71",  x"72",  x"74",
59
       x"75",  x"76",  x"77",  x"78",  x"79",  x"7a",  x"7b",  x"7b",
60
       x"7c",  x"7d",  x"7d",  x"7e",  x"7e",  x"7e",  x"7e",  x"7e",
61
       x"7f",  x"7e",  x"7e",  x"7e",  x"7e",  x"7e",  x"7d",  x"7d",
62
       x"7c",  x"7b",  x"7b",  x"7a",  x"79",  x"78",  x"77",  x"76",
63
       x"75",  x"74",  x"72",  x"71",  x"70",  x"6e",  x"6c",  x"6b",
64
       x"69",  x"67",  x"66",  x"64",  x"62",  x"60",  x"5e",  x"5b",
65
       x"59",  x"57",  x"55",  x"52",  x"50",  x"4e",  x"4b",  x"49",
66
       x"46",  x"43",  x"41",  x"3e",  x"3b",  x"39",  x"36",  x"33",
67
       x"30",  x"2d",  x"2a",  x"27",  x"24",  x"21",  x"1e",  x"1b",
68
       x"18",  x"15",  x"12",  x"0f",  x"0c",  x"09",  x"06",  x"03" );
69
   begin
70
     Result <= Sinus_Rom (to_integer(Address));
71
   end process;
72
   
73
   -- Output registers
74
   -- ----------------
75
   process begin
76
     wait until rising_edge(CLK);
77
     if (Sign='1') 
78
     then Dout <= Result;
79
     else Dout <= std_logic_vector (- signed(Result));
80
     end if;
81
   end process;
82
83
end RTL;


Beim Kompilieren gibt es keine Fehler, wie sieht dann konkret die 
Pin-Belegung aus?

: Bearbeitet durch Moderator
von Pascal K. (Gast)


Lesenswert?

Wie muss ich die Pins belegen, wenn ich den Sinuston über Lautsprecher 
vom Board hören will?

von Gustl B. (-gb-)


Lesenswert?

Welche Pins deines FPGAs an den Lautsprecher oder den DAC gehen, das 
weißt nur du oder du kannst es im Handbuch deines Boards nachgucken.

Zu deinem Board gibt es da was von Terasic, da steht das drinnen welcher 
FPGA Pin wo auf dem Board hingeht.

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


Lesenswert?

Pascal K. schrieb:
> Wie muss ich die Pins belegen, wenn ich den Sinuston über Lautsprecher
> vom Board hören will?
Wie ist der Lautsprecher vom Board angeschlossen?
Denk dran: du studierst und hast dir die Projektarbeit ausgesucht, und 
du solltest was dafür tun und was dabei lernen. Oder meinst du nicht? 
:-/

Wenn du dir vergegenwärtigst, dass ein Lautsprecher schon ein Tiefpass 
ist, dann muss nur deine PWM-Frequenz ausreichend hoch sein, und es 
reicht aus, wenn du den Lautsprecher direkt an einen FPGA-Pin 
anschließt. So habe ich das beim SAB0600 Nachbau auch gemacht:
Beitrag "SAB0600 in VHDL (war: Warum ist hier weniger los als)"
http://www.lothar-miller.de/s9y/archives/85-SAB0600.html

Pascal K. schrieb:
> Beim Kompilieren gibt es keine Fehler
Ja, irgendwie logisch. Das ist ja auch im Groben mein DDFS Code.
BTW: mach bitte die Tokens [ vhdl ] und [ /vhdl  ] ohne die Leerzeichen 
um den Code. Das ist besser für das Syntax-Highlighting...

: Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.