Pusteblume schrieb:
> Der Code ist wahrscheinlich schon prinzipiell falsch?
Da sieht man schon nach 4 Zeilen:
1 | use IEEE.STD_LOGIC_ARITH.ALL;
|
2 | use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
3 | use IEEE.numeric_std.all;
|
Sieh dir an, welche Datentypen und Funktionen dort jeweils definiert
sind, und welche Probleme dir das bringen kann/wird.
Kurz und Knackig: nur die
1 | use IEEE.STD_LOGIC_ARITH.ALL;
|
2 | use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
oder viel besser, weil genormt und herstellerunabhängig die
1 | use IEEE.numeric_std.all;
|
Gut, weiter zum nächsten Punkt:
Wozu brauchst du eine Variable?
Kannst du dir selber einen guten Grund dafür nennen?
Als Anfänger brauchst du das erste viertel Jahr garantiert keine
Variable. Und wenn doch, dann machst du etwas falsch.
Dieser Prozess hier ist überaus ungünstig. Denn er beinhaltet einen
getakteten Teil und einen kombinatorischen Teil.
1 | process(CLK)
|
2 | variable table_value : table_value_type;
|
3 | begin
|
4 | if rising_edge (CLK) then ------- getaktet
|
5 | table_value := get_value(table_index);
|
6 |
|
7 | table_index <= table_index + 1;
|
8 | end if;
|
9 |
|
10 | SPI_SS_B <= '1'; ------- kombinatorisch
|
11 | AMP_CS <= '1';
|
12 | AD_CONV <= '0';
|
13 | SF_CE0 <= '1';
|
14 | FPGA_INIT_B <= '1';
|
15 |
|
16 | SINE_OUT <= STD_LOGIC_VECTOR(to_unsigned(table_value, sine_vector_type'length));
|
17 | SPI_MOSI <= table_value;
|
18 |
|
19 | SPI_SCK <= CLK;
|
20 | DAC_CLR <= '0';
|
21 | DAC_CS <= '1';
|
22 |
|
23 | end process;
|
Richtig müsste das so aussehen:
1 | signal table_value : table_value_type;
|
2 | :
|
3 | :
|
4 | process(CLK)
|
5 | begin
|
6 | if rising_edge (CLK) then ------- getaktet
|
7 | table_value <= get_value(table_index);
|
8 | table_index <= table_index + 1;
|
9 | end if;
|
10 | end process;
|
11 |
|
12 | SPI_SS_B <= '1'; ------- concurrent kombinatorisch
|
13 | AMP_CS <= '1';
|
14 | AD_CONV <= '0';
|
15 | SF_CE0 <= '1';
|
16 | FPGA_INIT_B <= '1';
|
17 |
|
18 | SINE_OUT <= STD_LOGIC_VECTOR(to_unsigned(table_value, sine_vector_type'length));
|
19 | SPI_MOSI <= table_value;
|
20 |
|
21 | SPI_SCK <= CLK; ----- kann das dein FPGA überhaupt? Einen Takt auf einem Pin ausgeben?
|
22 | DAC_CLR <= '0';
|
23 | DAC_CS <= '1';
|
> das ug230 und einige Foren im Netz durchsucht
Wie wäre es mit dem Datenblatt des DACs?
Dort steht das Timing, das du einhalten mußt.
> Meine Funktion hat folgenden Code...
Und jetzt müsste kommen:
>>>>> Das ist die Testbench dazu... <<<<<<
Stattdessen kommt:
> Die .ucf Datei ist...
Diese Vorgehensweise ist falsch. Du mußt zuerst mal das Verhalten
deiner Beschreibung kontrollieren. Wenn die passt, dann kann man mal ans
Implementieren in realer Hardware denken.