Forum: FPGA, VHDL & Co. digital filter im fpga


von Serge D. (lafesse)


Lesenswert?

Hallo,ich suche dringend nach hilfe bei einen projekt über die 
implementierung digital filter im fpga.Theoretisch ist das projekt 
fertig nur ich müsste jetzt mit modelsim das ganze simulieren damit ich 
weiss wo es hackt.Ich komme aber nicht klar mit dem Programm und da ich 
Zeitdruck habe suche ich halt nach hilfe.
Ich freue mich über jede Rückmeldung
Danke

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


Lesenswert?

Serge D. schrieb:
> Theoretisch ist das projekt fertig
Wie weit reicht denn diese "Theorie"?
Was hast du, was fehlt noch?

> suche ich halt nach hilfe.
Wo genau klemmt es denn?
Wie sieht die Testbench aus?
Woher kommen die Eingangsdaten für das Filter?

Mein Tipp: nimm erst mal ein ganz einfaches Projekt, damit du dich in 
die Bedienung von ModelSim einarbeiten kannst: Lass auf einer blinkenden 
LED oder einem Zähler eine Simulation laufen.
Dafür brauchst du nur zwei Module: den Zähler und einen simplen 
Taktgenerator als Testbench.
Siehe dort http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html

von Serge D. (lafesse)


Angehängte Dateien:

Lesenswert?

hallo,
theorie heisst ich gebe den code.der ton geht als analog signal durch 
den microphone Eingang des codecs ,wird digitalisiert,soll zum fpga wo 
ein filter implementiert wurde und wieder durch den codec als analog 
raus
Im moment wird erreicht dass der ton analog rein und raus geht.cih 
glaube der kommt nicht beim fpga an sonst wäre er gefiltert.das habe ich 
versucht durch den i2s zu realisieren und ich befürchte dass es da 
hackt.ich würde gerne mit modelsim weiter versuchen nur die zeit ist ein 
problem weil es ein projekt für die uni ist.Deswegen habe ich um Hilfe 
gebetten
Schon mal danke für die Antwort

von Achim S. (Gast)


Lesenswert?

Serge D. schrieb:
> theorie heisst ich gebe den code.

verstehe ich ehrlich gesagt nicht.

Was mir in deinem schematich schon mal verdächtig vorkommt ist die 
Tatsache, dass das data-valid Signal am Ausgang des I2S-Blocks nicht 
genutzt wird um den Filter anzusteuern. Dieser Block liefert ja nicht 
jeden einzelnen Takt einen neuen ADC-Wert sondern nur in einem Bruchteil 
der Takte. Hast du das Filter so konfiguriert, dass es "von selbst" die 
exakt die richtige Datenrate erwartet? Falls nicht bekommst du mit 
diesem Aufbau eine völlig andere Filtercharakteristik als erwartet. Und 
das kann sich dann z.B. auch so anhören als sei er gar nicht gefiltert 
worden.

Serge D. schrieb:
> cih
> glaube der kommt nicht beim fpga an sonst wäre er gefiltert.

Der Ton kommt aus dem DAC heraus, den das FPGA ansteuert? Dann ist er 
sicher auch im FPGA angekommen, sonst würdest du gar nichts hören.

Serge D. schrieb:
> ich würde gerne mit modelsim weiter versuchen nur die zeit ist ein
> problem

Dann ist es wichtig, die Zeit effizient zu nutzen. Also möglichst klare 
Antworten auf klare Fragen ;-) Daher nochmal zu den Fragen von Lothar:
Hast du eine Testbench?
Wie sieht die Testbench aus?
Wie sieht dein Simulationsergebnis aus und was erwartest du stattdessen?

von serge Dingong (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
Danke für die sehr hilfreiche Antwort
Auf dem jetzigen Bild habe ich mal versucht den i2s zu simulieren
Mit dem ersten Satz meine ich dass ich den Code habe
Das mit dem Data valid schaue ich mir genauer an
Danke vielmals

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


Lesenswert?

Serge D. schrieb:
> theorie heisst ich gebe den code.der ton geht als analog signal durch
> den microphone Eingang des codecs
Das hört sich aber nicht sehr "theoretisch" an. Sondern im Gegenteil 
überaus "praktisch".
Das ist der falsche Ansatz. Zuerst musst du dein Design (oder 
wenigstens dessen einzelne Module) simulieren. Der Simulator ist der 
Debugger der Hardware. Das Oszi und der Logikanalyer kommt dann entweder 
viel später oder sogar überhaupt nicht zum Einsatz.

serge Dingong schrieb:
> Auf dem jetzigen Bild habe ich mal versucht den i2s zu simulieren
Ich hatte die Fragen in meinem Post nicht zum puren Zeitvertreib 
gestellt!
Ich fragte: wie sieht deine Testbench aus?
Du musst die Testbench simulieren, nicht das Modul.

Hast du dir den Link mit der LED wenigstens mal angeschaut?
Dort wird die blinkende LED als Komponente in die Testbench eingebunden.
Und in deiner Testbench muss das I2S Modul als Komponete eingebaut 
werden.

: Bearbeitet durch Moderator
von Serge D. (lafesse)


Lesenswert?

Hallo tb zu I2s
1
LIBRARY ieee  ; 
2
LIBRARY std  ; 
3
USE ieee.std_logic_1164.all  ; 
4
USE ieee.std_logic_textio.all  ; 
5
USE ieee.std_logic_unsigned.all  ; 
6
USE std.textio.all  ; 
7
ENTITY tb1  IS 
8
  GENERIC (
9
    BITPERFRAME  : INTEGER   := 16 ); 
10
END ; 
11
 
12
ARCHITECTURE tb1_arch OF tb1 IS
13
  SIGNAL valid   :  STD_LOGIC  ; 
14
  SIGNAL lrclk   :  STD_LOGIC  ; 
15
  SIGNAL bclk   :  STD_LOGIC  ; 
16
  SIGNAL ready   :  STD_LOGIC  ; 
17
  SIGNAL dac_data   :  std_logic_vector (15 downto 0)  ; 
18
  SIGNAL adc_data   :  std_logic_vector (15 downto 0)  ; 
19
  SIGNAL clk   :  STD_LOGIC  ; 
20
  SIGNAL adc_data_bit   :  STD_LOGIC  ; 
21
  SIGNAL dac_data_bit   :  STD_LOGIC  ; 
22
  SIGNAL dac_lrclk   :  STD_LOGIC  ; 
23
  SIGNAL reset   :  STD_LOGIC  ; 
24
  COMPONENT i2s_interface  
25
    GENERIC ( 
26
      BITPERFRAME  : INTEGER  );  
27
    PORT ( 
28
      valid  : out STD_LOGIC ; 
29
      lrclk  : in STD_LOGIC ; 
30
      bclk  : in STD_LOGIC ; 
31
      ready  : out STD_LOGIC ; 
32
      dac_data  : in std_logic_vector (15 downto 0) ; 
33
      adc_data  : out std_logic_vector (15 downto 0) ; 
34
      clk  : in STD_LOGIC ; 
35
      adc_data_bit  : in STD_LOGIC ; 
36
      dac_data_bit  : out STD_LOGIC ; 
37
      dac_lrclk  : in STD_LOGIC ; 
38
      reset  : in STD_LOGIC ); 
39
  END COMPONENT ; 
40
BEGIN
41
  DUT  : i2s_interface  
42
    GENERIC MAP ( 
43
      BITPERFRAME  => BITPERFRAME   )
44
    PORT MAP ( 
45
      valid   => valid  ,
46
      lrclk   => lrclk  ,
47
      bclk   => bclk  ,
48
      ready   => ready  ,
49
      dac_data   => dac_data  ,
50
      adc_data   => adc_data  ,
51
      clk   => clk  ,
52
      adc_data_bit   => adc_data_bit  ,
53
      dac_data_bit   => dac_data_bit  ,
54
      dac_lrclk   => dac_lrclk  ,
55
      reset   => reset   ) ; 
56
57
58
59
-- "Clock Pattern" : dutyCycle = 50
60
-- Start Time = 0 ns, End Time = 10 ms, Period = 20 ns
61
  Process
62
  Begin
63
   clk  <= '0'  ;
64
  wait for 10 ns ;
65
-- 10 ns, single loop till start period.
66
  for Z in 1 to 499
67
  loop
68
      clk  <= '1'  ;
69
     wait for 10 ns ;
70
      clk  <= '0'  ;
71
     wait for 10 ns ;
72
-- 9990 ns, repeat pattern in loop.
73
  end  loop;
74
   clk  <= '1'  ;
75
  wait for 10 ns ;
76
-- dumped values till 10 us
77
  wait;
78
 End Process;
79
80
81
-- "Constant Pattern"
82
-- Start Time = 0 ns, End Time = 10 ms, Period = 0 ns
83
  Process
84
  Begin
85
   reset  <= '0'  ;
86
  wait for 10 us ;
87
-- dumped values till 10 us
88
  wait;
89
 End Process;
90
91
92
-- "Clock Pattern" : dutyCycle = 50
93
-- Start Time = 0 ns, End Time = 10 ms, Period = 20 ns
94
  Process
95
  Begin
96
   bclk  <= '0'  ;
97
  wait for 10 ns ;
98
-- 10 ns, single loop till start period.
99
  for Z in 1 to 499
100
  loop
101
      bclk  <= '1'  ;
102
     wait for 10 ns ;
103
      bclk  <= '0'  ;
104
     wait for 10 ns ;
105
-- 9990 ns, repeat pattern in loop.
106
  end  loop;
107
   bclk  <= '1'  ;
108
  wait for 10 ns ;
109
-- dumped values till 10 us
110
  wait;
111
 End Process;
112
113
114
-- "Constant Pattern"
115
-- Start Time = 0 ns, End Time = 10 ms, Period = 0 ns
116
  Process
117
  Begin
118
   lrclk  <= '0'  ;
119
  wait for 10 us ;
120
-- dumped values till 10 us
121
  wait;
122
 End Process;
123
124
125
-- "Constant Pattern"
126
-- Start Time = 0 ns, End Time = 10 ms, Period = 0 ns
127
  Process
128
  Begin
129
   dac_lrclk  <= '0'  ;
130
  wait for 10 us ;
131
-- dumped values till 10 us
132
  wait;
133
 End Process;
134
135
136
-- "Constant Pattern"
137
-- Start Time = 0 ns, End Time = 10 ms, Period = 0 ns
138
  Process
139
  Begin
140
   if dac_data_bit  /= ('0'  ) then 
141
    report " test case failed" severity error; end if;
142
  wait for 10 us ;
143
-- dumped values till 10 us
144
  wait;
145
 End Process;
146
147
148
-- "Constant Pattern"
149
-- Start Time = 0 ns, End Time = 10 ms, Period = 0 ns
150
  Process
151
  Begin
152
   if valid  /= ('0'  ) then 
153
    report " test case failed" severity error; end if;
154
  wait for 10 us ;
155
-- dumped values till 10 us
156
  wait;
157
 End Process;
158
END;

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


Lesenswert?

Vorneweg:
Das steht über jeder Eingabebox
1
Antwort schreiben
2
3
Wichtige Regeln - erst lesen, dann posten!
4
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
5
6
Formatierung (mehr Informationen...)
7
    [vhdl]VHDL-Code[/vhdl]

Serge D. schrieb:
> tb zu I2s
Du hast aber nicht diese Testbench simuliert. Denn sonst hättest du den 
Namen 'tb1' links oben im "Instance" Fenster.

: Bearbeitet durch Moderator
von serge Dingong (Gast)


Lesenswert?

Mach ich zum ersten mal
Zweiter Versuch

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Ich glaube, es ist besser, du lernst erst einmal, vernüftig Testbenches 
und Code zu verfassen und kümmerst Dich dann um die Details der 
funktionellen Probleme. So wird das ein Mischmasch.

von serge Dingong (Gast)


Lesenswert?

Ja ich schaffe es seit gestern nicht eine Testbench
Zu machen :(

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


Lesenswert?

serge Dingong schrieb:
> ch schaffe es seit gestern nicht eine Testbench
> Zu machen
Nimm einfach die, die du da gepostet hast...

von Serge D. (lafesse)


Angehängte Dateien:

Lesenswert?

hallo,
cih hoffe es endlich geschafft zu haben
Ich glaube es liegt an meinen I2s Databit Ports
dachte ich davor auch
1
LIBRARY ieee  ; 
2
LIBRARY std  ; 
3
USE ieee.std_logic_1164.all  ; 
4
USE ieee.std_logic_textio.all  ; 
5
USE ieee.std_logic_unsigned.all  ; 
6
USE std.textio.all  ; 
7
ENTITY tb2  IS 
8
  GENERIC (
9
    BITPERFRAME  : INTEGER   := 16 ); 
10
END ; 
11
 
12
ARCHITECTURE tb2_arch OF tb2 IS
13
  SIGNAL valid   :  STD_LOGIC  ; 
14
  SIGNAL lrclk   :  STD_LOGIC  ; 
15
  SIGNAL bclk   :  STD_LOGIC  ; 
16
  SIGNAL ready   :  STD_LOGIC  ; 
17
  SIGNAL dac_data   :  std_logic_vector (15 downto 0)  ; 
18
  SIGNAL adc_data   :  std_logic_vector (15 downto 0)  ; 
19
  SIGNAL clk   :  STD_LOGIC  ; 
20
  SIGNAL adc_data_bit   :  STD_LOGIC  ; 
21
  SIGNAL dac_data_bit   :  STD_LOGIC  ; 
22
  SIGNAL dac_lrclk   :  STD_LOGIC  ; 
23
  SIGNAL reset   :  STD_LOGIC  ; 
24
  COMPONENT i2s_interface  
25
    GENERIC ( 
26
      BITPERFRAME  : INTEGER  );  
27
    PORT ( 
28
      valid  : out STD_LOGIC ; 
29
      lrclk  : in STD_LOGIC ; 
30
      bclk  : in STD_LOGIC ; 
31
      ready  : out STD_LOGIC ; 
32
      dac_data  : in std_logic_vector (15 downto 0) ; 
33
      adc_data  : out std_logic_vector (15 downto 0) ; 
34
      clk  : in STD_LOGIC ; 
35
      adc_data_bit  : in STD_LOGIC ; 
36
      dac_data_bit  : out STD_LOGIC ; 
37
      dac_lrclk  : in STD_LOGIC ; 
38
      reset  : in STD_LOGIC ); 
39
  END COMPONENT ; 
40
BEGIN
41
  DUT  : i2s_interface  
42
    GENERIC MAP ( 
43
      BITPERFRAME  => BITPERFRAME   )
44
    PORT MAP ( 
45
      valid   => valid  ,
46
      lrclk   => lrclk  ,
47
      bclk   => bclk  ,
48
      ready   => ready  ,
49
      dac_data   => dac_data  ,
50
      adc_data   => adc_data  ,
51
      clk   => clk  ,
52
      adc_data_bit   => adc_data_bit  ,
53
      dac_data_bit   => dac_data_bit  ,
54
      dac_lrclk   => dac_lrclk  ,
55
      reset   => reset   ) ; 
56
57
58
59
-- "Clock Pattern" : dutyCycle = 50
60
-- Start Time = 0 ps, End Time = 1 ns, Period = 20 ps
61
  Process
62
  Begin
63
   clk  <= '0'  ;
64
  wait for 10 ps ;
65
-- 10 ps, single loop till start period.
66
  for Z in 1 to 49
67
  loop
68
      clk  <= '1'  ;
69
     wait for 10 ps ;
70
      clk  <= '0'  ;
71
     wait for 10 ps ;
72
-- 990 ps, repeat pattern in loop.
73
  end  loop;
74
   clk  <= '1'  ;
75
  wait for 10 ps ;
76
-- dumped values till 1 ns
77
  wait;
78
 End Process;
79
80
81
-- "Clock Pattern" : dutyCycle = 50
82
-- Start Time = 0 ps, End Time = 1 ns, Period = 20 ns
83
  Process
84
  Begin
85
   bclk  <= '0'  ;
86
  wait for 1 ns ;
87
  wait;
88
 End Process;
89
END;

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


Lesenswert?

Ich verweise zum Thema "VHDL-Quelltext einfügen" NOCHMAL auf den 
Beitrag "Re: digital filter im fpga"

Serge D. schrieb:
> -- "Clock Pattern" : dutyCycle = 50
>   bclk  <= '0'  ;
>   wait for 1 ns ;
>   wait;
Das gibt nie und nimmer einen Takt.

> -- "Clock Pattern" : ... Period = 20 ps
Was soll den das für ein Takt sein? Kann dein FPGA mit 50 GHz arbeiten? 
Diese Zahlen sind unrealistisch und ergeben keinen Sinn.

Mal davon abgesehen macht die Simmulation genau das, was im 
VHDL-Quelltext gefordert wird: du gibst nur 2 unsinnige Takte aus (einer 
davon hat nur einen halben Zyklus. Und das wars.

Keines der anderen Signale wird initialisiert oder geändert. Deshalb 
sind die meisten Signale rot (= uninitialized). Du musst für jeden der 
IN Ports der Komponente brauchbare Stimuli erzeugen. Sonst wird das 
nichts...

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.