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 ;)
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
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
Wie muss ich die Pins belegen, wenn ich den Sinuston über Lautsprecher vom Board hören will?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.