Forum: FPGA, VHDL & Co. Fehlermeldung: ERROR - BN126 : is missing a driver.


von blackandpink (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin ziemlich neu in allem, sowohl FPGAs, VHDL als auch Foren^^ Hoffe 
ich stelle meine Frage richtig, aber ich komme einfach nicht mehr weiter 
und wäre über jede Hilfe echt dankbar!

Im angehängten code versuche ich einen Phaseshift abhängig einer Eingabe 
zu erzeugen. Aber ich bekomme die folgende Fehlermeldung.

ERROR - BN126 :"c:\users\...\phaseshifter.vhd":8:7:8:18|Net output_clk_c 
(in view: work.phaseshifter(behavioral)) is missing a driver.

Wenn ich die Zeilen 119-125 auskommentiere fällt der Fehler weg. Dabei 
ist dieser Block (also der Fall "111") bloß eine Kopie von den anderen 
Fällen bis auf die Anzahl der Loops. Es funktioniert auch nicht, wenn 
ich "111" durch "others" ersetze, oder "when others => irgendein default 
wert" hinter den Block packe.

Könnte mir jemand vllt einen Tipp geben? Ich frage mich auch warum 
output_clk_c einen Fehler verursacht. Dieses Signal kommt in meinem Code 
gar nicht vor?!

Liebe Grüße

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


Lesenswert?

blackandpink schrieb:
> Könnte mir jemand vllt einen Tipp geben?
Ich habe mir mal die ersten paar Zeilen des kombinatorischen Prozesses 
angesehen und komme zum Schluss: du progammierst normalerweise Software, 
wo eine Zeile nach der anderen "abgearbeitet" wird. Das ist in Hardware 
vollkommen anders: da passiert alles gleichzeitig. Der 
kombinatorische Prozess wird theoretisch in der Zeit 0 ausgeführt, in 
der Praxis braucht die Kombinatorik ein paar ns bis sie sich beruhigt 
hat. Letztlich hast du also grundlegend die falsche Denkweise.
Mit einer HDL beschreibst du Hardware. Du brauchst also ein Bild oder 
eine Vorstellung, wie die Hardware letztlich aussehen soll. Dann kannst 
du Syntaxelemente der Beschreibungssprache nehmen, um dieses Verhalten 
oder diese Struktur zu beschreiben.

Ich pflücke mal 3 Zeilen aus dem Code:
1
        for i in 0 to 2 loop -- delay signal convertion to get phaseshift
2
          output_clk <= out_tmp;
3
        end loop;
Eine Schleife in VHDL vervielfacht Hardware! Da steht also nach dem 
Ausrollen der Schleife:
1
       output_clk <= out_tmp;
2
       output_clk <= out_tmp;
3
       output_clk <= out_tmp;
Und weil in einem Prozess die letzte Zuweisung an ein Signal gewinnt, 
steht da letztendlich unabhängig von der Schleifenlänge immer:
1
       output_clk <= out_tmp;


Und das mit dem "Ausrollen" und "letzte Zuweisung gewinnt" gilt 
natürlich durch den gesamten Prozess, so dass da dann z.B. sowas steht:
1
:
2
:
3
begin
4
  process(phase_shift)
5
  begin
6
    case phase_shift is
7
    :
8
    :
9
      -- 135° --------------------------------
10
      when "011" => 
11
        out_tmp <= not input_clk;
12
        output_clk <= out_tmp;   -- erste Schleife ausgerollt und optimiert
13
--        end loop;
14
          output_clk <= out_tmp; -- innere Schleife ausgerollt und optimiert
15
          out_tmp <= not out_tmp; -- äußere Schleife ausgerollt und optimiert
16
   :
17
   :
18
    end case;
19
  end process;
20
end architecture behavioral;
Ja richtig, das bleibt letztlich übrig...

Und jetzt hagelt es dich raus, denn das hier ist eine gut versteckte 
kombinatorische Schleife:
1
      out_tmp <= not out_tmp;
Siehe 
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html
Das hätte die Simulation (hast du das Design denn überhaupt simuliert? 
mit welchem Ergebnis?) sicher mit einer Überschreitung der 
Iterationsanzahl quittiert, wenn denn die Sensitivliste des Prozesses 
vollständig wäre. Aber leider fehlen dort input_clk und out_tmp...

> Wenn ich die Zeilen 119-125 auskommentiere fällt der Fehler weg.
Das Design wird wegen der kombinatorischen Schleife trotzdem nicht 
laufen. Der Fehler fällt nur deshalb weg, weil dann dise Schleife 
gegatet (und somit noch besser versteckt) wird.


> Ich frage mich auch warum output_clk_c einen Fehler verursacht.
Das ist lediglich ein Folgefehler durch die fehlerhafte Erzeugung eines 
Taktes.

> Im angehängten code versuche ich einen Phaseshift abhängig einer Eingabe
> zu erzeugen.
Welche Zielplattform? Welche Taktfrequenz? Woher kommt das 
Eingangssignal? Was wird mit dem erzeugten Signal angesteuert?

: Bearbeitet durch Moderator
von blackandpink (Gast)


Lesenswert?

Oi, erst mal vielen Dank für die schnelle und ausführliche Antwort!

Sie haben mich da sehr gut durchschaut! Bei Hardwarebschreibungssprachen 
bin ich blutie Anfängerin. Ich habe gelesen, dass Statements in 
Prozessen sequentiell abgearbeitet werden und for loops synthetisierbar 
sind und da hab ich sie mal zusammengepackt^^ Simuliert habe ich noch 
nicht. Werde ich aber gleich heute Abend nachholen.

Ich hätte wohl mehr erklären sollen: Ich bekomme von meinem Board 
(MachXO3LF)eine Clock von 12.09MHz. Diese führe ich durch eine PLL und 
generiere mit ihr eine Clock von 54.24MHz (13.56Mhz * 4). Diese teile 
ich dann wieder durch 4, aber mit einem Versatz, so dass ich am Ende 
13.56Mhz, aber mit Phaseshift, habe. Im Moment wird damit noch nichts 
angesteuert. Ich probiere immer noch einfach nur ein Signal zubekommen.

Dh also ich kann schon die Fallunterscheidungen behalten, sollte aber 
das Zählen anhand von meiner Eingangsclock machen?

Und muss die Sensitivity List immer alle Signale enthalten die im 
Prozess auftauchen? Es würde mir genügen dass der Prozess beginnt wenn 
ein Signal zur Phasenverschiebung gegeben wird.


Liebe Grüße

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


Lesenswert?

blackandpink schrieb:
> Und muss die Sensitivity List immer alle Signale enthalten die im
> Prozess auftauchen?
Es müssen alle signale rein, die eine Auswirkung auf andere Signale 
haben und eine Neuberechnung des Prozesses nötig machen.

> Es würde mir genügen dass der Prozess beginnt wenn
> ein Signal zur Phasenverschiebung gegeben wird.
Man kann über die Sensitivliste nicht das Verhalten des Synthesizers 
steuern. Man kann damit lediglich das Verhalten des Simulators steuern. 
Blöd nur, dass dann die Simulation nicht mehr zur Realität passt...

blackandpink schrieb:
> Ich hätte wohl mehr erklären sollen: Ich bekomme von meinem Board
> (MachXO3LF)eine Clock von 12.09MHz. Diese führe ich durch eine PLL und
> generiere mit ihr eine Clock von 54.24MHz (13.56Mhz * 4).
Soweit , so gut. Klappt das schon? Kommt diese Frequenz heraus?

> Diese teile ich dann wieder durch 4, aber mit einem Versatz, so dass
> ich am Ende 13.56Mhz, aber mit Phaseshift, habe.
Und hier würde ich was anderes machen: ein mit "1111" initialisierte 
Schieberegister, das mit der 4-fachen Frequenz getaktet wird, ein 
Inverter dahinter, dazu ein Multiplexer und die Welt gehört mir:
1
                                  clk_out                        
2
                                     ^                       
3
                                     |
4
                   __________________|___________________
5
phase_sel >-------/______________________________________\             
6
                     |          |          |          |         
7
           .---------+----------|----------|----------+------.
8
           | .----.  |  .----.  |  .----.  |  .----.  |      |  
9
           '-|    |--o--|    |--o--|    |--o--|    |--o--|>o-'
10
          .--|>   |   .-|>   |   .-|>   |   .-|>   |     
11
          |  '----'   | '----'   | '----'   | '----'       
12
54MHz >---o-----------o----------o----------'   
13
14
Bit             3          2          1          0

Das sieht dann in der Praxis ganz ohne Prozess so aus:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity phaseshifter is 
6
  port( input_clk   : in std_logic;
7
        phase_shift : in bit_vector(2 downto 0);
8
        output_clk  : out std_logic);
9
end phaseshifter;
10
11
architecture behavioral of phaseshifter is
12
  signal sr : std_logic_vector (3 downto 0) := "1111";
13
begin
14
15
  sr <=  not sr(0) & sr(3 downto 1) when rising_edge(input_clk);
16
17
  clk_out <= sr(3) when phase_shift="001" or phase_shift="011" else
18
             sr(2) when phase_shift="011" else
19
             sr(1) when phase_shift="101" or phase_shift="111" else
20
             sr(0);
21
22
end behavioral;
Der Multiplexer muss natürlich noch richtig angepasst werden. Das war 
mir jetzt doch zu viel Aufwand, die Denkweise nachzuvollziehen...

> Im Moment wird damit noch nichts angesteuert.
Das ist auch eine sehr unsaubere Art, für einen FPGA einen Takt zu 
erzeugen. Wenn du diese Takte aussen verwenden willst solltest du auf 
jeden Fall Jitter und Skew ansehen...

: Bearbeitet durch Moderator
von blackandpink (Gast)


Lesenswert?

Ok, das muss ich jetzt alles erst mal nacharbeiten und verstehen^^°

Vielen Dank für Ihre Hilfe! Ich werde mal komplett umdenken dann wird es 
bestimmt was!

Und ich merke gerade, dass ich auch schon ganz viel auf Ihrer Seite 
nachgelesen habe. Aber wohl nicht aufmerksam genug... Also auch Danke 
für diese Hilfe!



Liebe Grüße

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.