Hallo Zusammen,
ich lese ja schon seit langer Zeit immer wieder gerne hier die
Forumsbeiträge - heute ist es soweit, ich komme nicht weiter und wende
mich auch mal an die nette Community hier.
Also erstmal(möglcihst) kurz und knapp die Situation:
Ich habe schon seit einiger zeit Programmiererfahrung mit Pic & co. und
dachte mir: eine neue Herausforderung: Beschreibe die Hardware anstatt
sie zu Programieren. Gesagt - Getan.. sein ein paar wochen versuche mich
an einem Altera FPGA(cyclone I). Die ersten Versuche liefen auch alle
super(counter, blinkende LEDs, 7Segmentanzeigen, etc).. Nun, mein
testboard hat auch einen kleinen Lautsprecher. Also dachte ich mir, 2
Eingänge für Frequenz + und -, einem single port ram + init wert und ein
ausgang..
Im Anhang dazu eine kleine Skizze....
Nunja, in der Simulation gehen die einzelkomponenten alle, einige habe
ich aus vorherigen Projekten übernommen(laufen also auch in der Praxis),
aber die gesamtschaltung geht natürlich nicht.
Ich vermute mal, das der fehler irgendwo im bereich des signals/ausgangs
"WREN" liegt(zu kurz??), aber das überlasse ich mal den Profis.
So .. ich hoffe, ich habe nichts vergessen..
Hier Dann mal der VHDL code:
1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.numeric_std.all;
|
4 |
|
5 |
|
6 | entity controler is
|
7 | port(
|
8 | --INPUT
|
9 | plus, minus: in std_logic; --Entprellte Eingangsignale Plusrechnen/Minusrechnen
|
10 | act_data: in std_logic_vector(23 downto 0); -- Aktuellen wert am RAM-ausgang einlesen ram-initwert DEZ 2500000
|
11 | clock: in bit; --50MHZ sync mit ram-takt
|
12 | --OUTPUT
|
13 | new_data : out std_logic_vector(23 downto 0); --zu data in von RAM
|
14 | wren : out std_logic := '0'; --wren von ram
|
15 | adress: out std_logic := '0' --RAM adresse
|
16 | );
|
17 | End;
|
18 |
|
19 |
|
20 | architecture verhalten of controler is
|
21 | signal s_wren: std_logic:='0';
|
22 | signal s_data: unsigned(23 downto 0);
|
23 | signal s_plus, s_minus, s_out_p, s_out_m, s_pp, s_pm: std_logic:= '0';
|
24 | Begin
|
25 |
|
26 |
|
27 | pegel_leser:process(clock)
|
28 | begin
|
29 | If (clock'event and clock = '1' ) then
|
30 | If (plus = '0') then
|
31 | ---plus gedrückt
|
32 | s_plus <= '1';
|
33 | Elsif (minus = '0') then
|
34 | ---minus gedrückt
|
35 | s_minus <= '1';
|
36 | Else
|
37 | -- nichts gedrückt
|
38 | s_plus <= '0';
|
39 | s_minus <= '0';
|
40 | End if;
|
41 | --D-FF + flankenerkennung
|
42 | s_out_p <= s_plus;
|
43 | s_out_m <= s_minus;
|
44 | s_pp <= s_plus and not s_out_p;
|
45 | s_pm <= s_minus and not s_out_m;
|
46 | End if;
|
47 |
|
48 | End process;
|
49 |
|
50 |
|
51 | rechner: process(s_pp, s_pm, act_data)
|
52 | Begin
|
53 | -- wenn flanke an plus oder minus
|
54 | -- setze wren und errechne aktuellen neuen wert um frequenz um 10 hz zu erhöhen/abzusenken
|
55 | If s_pp = '1' then
|
56 | s_wren <= '1';
|
57 | s_data <= 50000000 / ((50000000 / unsigned(act_data)) + 10);
|
58 | Elsif s_pm = '1' then
|
59 | s_wren <= '1';
|
60 | s_data <= 50000000 / ((50000000 / unsigned(act_data)) - 10);
|
61 | Else
|
62 | s_wren <= '0';
|
63 | s_data <= to_unsigned(0, 24);
|
64 | End if;
|
65 |
|
66 | End Process;
|
67 |
|
68 | adress <= '0';
|
69 | wren <= s_wren;
|
70 | new_data <= std_logic_vector(unsigned(s_data));
|
71 |
|
72 | End;
|
So dann Vielen Dank schon mal für eure Hilfe!
Gruß
Ben