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
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
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
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?
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
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
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
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
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.
serge Dingong schrieb: > ch schaffe es seit gestern nicht eine Testbench > Zu machen Nimm einfach die, die du da gepostet hast...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.