Hallo alle zusammen, ich bin absolut neu in der VHDL Welt und versuche gerade meine ersten Gehversuche. Schritt eins ist mir von meinem Nexys Board den Clock in der Simulation ausgeben zu lassen. Dazu habe ich wie in Bild1 zusehen die Constraints ausgeklammert und CLK0 hinein geschrieben. Ist das dann eine Frequenz von f = 1/T = 1/10 ?? „ ## Clock signal set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK0 }]; #IO_L12P_T1_MRCC_35 Sch=CLK0 create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK0}]; „ Als zweiten Schritt (Bild2) habe ich im Projekt meinen Clock definiert. „ library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Clock_Test is Port ( CLK0 : IN STD_LOGIC; end Clock_Test; architecture Behavioral of Clock_Test is process (CLK0); signal y : std_logic; begin y <= CLK0; end Behavioral; „ Da habe ich schon zwei Fragen. Wenn ich Process verwende dann ist alles in meiner Architecture von CLK0 abhängig oder? Muss ich eine neue Variable definieren um in der Simulation mein CLK0 ausgeben zu lassen? Wenn ich CLK0 auf eine LED geben möchte muss ich die Variable y anlegen oder? Als letzten Schritt habe ich die Testbench zur Simulation erzeugt. „ library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Testbench is -- Port ( ); end Testbench; architecture Behavioral of Testbench is COMPONENT Clock_Test is Port ( CLK0 : IN STD_LOGIC ); end COMPONENT; begin end Behavioral; „ Habe ich das so richtig gemacht? Was schreibe ich in begin? Ich kann CLK ja keine 0 oder 1 zuweisen. Ich will diesen ja ausgeben?! Vielen Dank für eure Hilfe Grüße Vicky
Der Simulation ist das xdc glaube ich egal. Sprich du musst die Clock in der Testbench anlegen als normales Signal std_logic. Und ebenfalls in der Testbench musst du das dann takten lassen. CLK: std_logic:='0'; CLK <= not CLK after 5 ns;
Sodelle, ich habe deinen Rat angenommen jedoch bin ich noch nicht ganz Glücklich. Mein Code sieht nun wie folgt aus. Constraints File: ------------------------------------------------------------------------ „ ## Clock signal set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK0 }]; #IO_L12P_T1_MRCC_35 Sch=CLK0 create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK0}]; „ ------------------------------------------------------------------------ Das Projekt File. In dem habe ich nun eingefügt das CLK0 direkt auf einen Port geführt wird. ------------------------------------------------------------------------ library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity DDS_SINE is Port ( CLK0 : IN STD_LOGIC; OUT_PORT : OUT STD_LOGIC ); end DDS_SINE; architecture Behavioral of DDS_SINE is begin OUT_PORT <= CLK0; end Behavioral; ------------------------------------------------------------------------ Und zu guter letzt die Testbench. ------------------------------------------------------------------------ library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Testbench is -- Port ( ); end Testbench; architecture Behavioral of Testbench is COMPONENT DDS_SINE is Port ( CLK0 : IN STD_LOGIC; OUT_PORT : OUT STD_LOGIC ); end COMPONENT; SIGNAL CLK0 : STD_LOGIC := '0'; SIGNAL OUT_PORT : STD_LOGIC := '0'; begin aand : DDS_SINE PORT MAP( CLK0 => CLK0, OUT_PORT => OUT_PORT ); CLK0 <= not CLK0 after 5 ns; end Behavioral; ------------------------------------------------------------------------ Jedoch habe ich nun noch die Frage ob man den CLK0 so in den Constraints (.xdc) definiert und wie ich die 10.00 für die Periode zu verstehen habe. Was bedeutet den genau dieses -waveform {0 5}. Des Weiteren wollte ich nochmal zu Process fragen wie oben erwähnt. Vicky M. schrieb: > Da habe ich schon zwei Fragen. Wenn ich Process verwende dann ist alles > in meiner Architecture von CLK0 abhängig oder? > Muss ich eine neue Variable definieren um in der Simulation mein CLK0 > ausgeben zu lassen? > Wenn ich CLK0 auf eine LED geben möchte muss ich die Variable y anlegen > oder? Wie verhält sich dies? Vielen Lieben Dank für eure Hilfe.
:
Bearbeitet durch User
Vicky M. schrieb: > muss ich die Variable y anlegen oder? Du sollest dich nicht an solchen Begriffen festhalten! Eine Variable kann alles mögliche sein: ein Flipflops, eine simple Leitung, ein kompletter RAM Block... Ein Tipp für die erfolgreiche Arbeit mit VHDL: du solltest dir eine Hardware oder eine Struktur vorstellen oder aufzeichnen oder sonstwas, und diese Hardware dann mit der HardwareBESCHREIBUNGssprache VHDL BESCHREIBEN. Ob da ein Signal oder eine Variable sinnvoll und zielführend sein kann, das hängt vom jeweiligen Problem ab. Zu deiner Frage: es gibt mit Sicherheit zu diesem Thema zigtausend Beispiele im Internet oder in Büchern. Hast du da schon mal geschaut? http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html Vicky M. schrieb: > Jedoch habe ich nun noch die Frage ob man den CLK0 so in den Constraints > (.xdc) definiert Du solltest dir auch die Toolchain und ihre Werkzeuge ansehen. Der Simulator braucht keine Constraints. Die sind für die Implementierung auf ein Zielsystem nötig. > und wie ich die 10.00 für die Periode zu verstehen habe. 10 ns = 100 MHz Das steht im Manual zur Toolchain... > Was bedeutet den genau dieses -waveform {0 5}. Vermutlich, dass der Simulator die Waveform in einem bestimmten Zeitfenster berechnen und darstellen soll. Aber auch dafür gibt es mit Sicherheit Dokumentation...
:
Bearbeitet durch Moderator
Lothar M. schrieb: > Vicky M. schrieb: >> muss ich die Variable y anlegen oder? > Du sollest dich nicht an solchen Begriffen festhalten! > Eine Variable kann alles mögliche sein: ein Flipflops, eine simple > Leitung, ein kompletter RAM Block... > > Ein Tipp für die erfolgreiche Arbeit mit VHDL: du solltest dir eine > Hardware oder eine Struktur vorstellen oder aufzeichnen oder sonstwas, > und diese Hardware dann mit der HardwareBESCHREIBUNGssprache VHDL > BESCHREIBEN. > Ob da ein Signal oder eine Variable sinnvoll und zielführend sein kann, > das hängt vom jeweiligen Problem ab. > > Zu deiner Frage: es gibt mit Sicherheit zu diesem Thema zigtausend > Beispiele im Internet oder in Büchern. Hast du da schon mal geschaut? > > http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html Hallo, ja ich habe ein größeres Projekt dahinter. Ich möchte wie Sie hier: http://www.lothar-miller.de/s9y/categories/31-DDFS beschrieben haben eine DDFS mit einem Sinus von 1,9Khz aufbauen. Für dieses Projekt brauche ich aber einen Clock den ich verwenden kann. Deshalb diese anfängliche Prozedur. Mein Plan war und ist: 1.) den Clock zu generieren in Simulation und auf dem Board. 2.) anschließend Stück für Stück alles weitere wie bei Ihnen auf der Homepage beschrieben
:
Bearbeitet durch User
Vicky M. schrieb: > 1.) den Clock zu generieren in Simulation und auf dem Board. Auch hier sind es wieder 2 unterschiedliche Vorgehensweisen: Auf dem Board wird der Takt durch einen Oszillator erzeugt, der an einem Takteingang des FPGAs angeschlossen ist. Dieser Takt muss der Toolchain per Constraint bekannt gemacht werden. In der Simulation wird dieses Board durch die Testbench dargestellt, die den Takt und andere Signale erzeugt und die Reaktion des Prüflings visualisiert oder automatisiert prüft.
Gustl B. schrieb: > Das 0 5 dürfte der dutycycle sein. Ist aber nur geraten. Ja. Parameter sind jeweils die Zeitpunkte der steigenden und fallenden Flanke.
Super vielen Dank an alle. Das mit dem Clock usw. habe ich nun alles hinbekommen. Aber wie zu erwarten tappe ich Schritt für Schritt in jede Falle und schaffe es wieder einmal nicht mit eigener Kraft hinaus. In den hochgeladenen Bildern seht Ihr meinen Frequenzteiler. Einmal 1:2 und einmal 1:4. Mit den Zeilen: clk1_out <= divider(2); clk2_out <= divider(3); kann ich bequem das Teilungsverhältnis bestimmen. Das RTL passt, aber die Synthese läuft durch der Bitstream wird erzeugt aber leider bekomme ich die Testbench nicht zum Laufen. Der CLK_in, welcher mein Clock darstellt sowie der rst (Reset) funktioneren in der Simulation. Die Zwei „clk1_out“ und „clk2_out“ aber nicht. Wo übersehen ich den Fehler?
Vicky M. schrieb: > Die Zwei „clk1_out“ und „clk2_out“ aber nicht. Was "geht nicht"? Wie sieht die Waveform aus? Und was macht das Signal divider? > In den hochgeladenen Bildern seht Ihr meinen Frequenzteiler. Bitte keine BILDER von Quelltexten anhängen! Häng doch einfach die VHDL-Dateien als *.vhdl an. BTW: Ich kann mit meinem Handy keine ZIP-Dateien handhaben... BTW2: es ist eine überaus schlechte Idee, mit nicht eingeschränkten Vektoren zu rechnen und sich zudem auf implizite Überläufe zu verlassen. Ein Tipp: nimm die numeric_std statt der std_logic_arith Bibliothek. Unbedingt! BTW3: Hast du den Link auf das Hello-World gesehen? Hast du mal draufgedrückt? Da gibts noch mehr Zeug zu VHDL...
:
Bearbeitet durch Moderator
Entschuldigung. Anbei die Dateien ohne Zip. In der Simulation erkennt man das der clk_in funktioniert. Die zwei clk1_out und clk2_out bleiben in der Simulation aber aus für mich nicht erklärbaren Gründen undefiniert. Viele Grüße Vicky
divider ist auch nicht mit einem startwert belegt. schreibe doch: signal divider: std_logic_vector(3 downto 0):="0000"; Denn ohne Startwert ist auch signal +1 undefiniert. Ausserdem rechnet man nicht mit std_logic_vector. man verwendet unsigned oder integer aus der numeric.std signal divider: unsigned(3 downto 0):="0000"; divider <= divider +1;
Gustl B. schrieb: > signal divider: std_logic_vector(3 downto 0):="0000"; Sorry, aber Startwerte sind einfach nur bäh in synthesefähigem Code. Sie führen zu Warnungen und werden vllt im FPGA mit Glück implementiert. Dafür gibt es Resets!
Wieso? Hast du einen Beleg? Ich verwende dauernd Startwerte und hatte damit noch nie Probleme. Ja, Reset kann man machen, aber braucht man oft nicht. Und gerade hier wo so etwas Einfaches simuliert werden soll ist ein Reset überflüssig.
Gustl B. schrieb: > divider ist auch nicht mit einem startwert belegt. > > schreibe doch: > > signal divider: std_logic_vector(3 downto 0):="0000"; > > Denn ohne Startwert ist auch signal +1 undefiniert. > > Ausserdem rechnet man nicht mit std_logic_vector. man verwendet unsigned > oder integer aus der numeric.std > > signal divider: unsigned(3 downto 0):="0000"; > > divider <= divider +1; hmmm, wenn ich "signal divider: unsigned(3 downto 0):="0000“;“ schreibe, erkennt vivado meinen + operator von "divider <= divider +1;" nicht mehr. Erik schrieb: > Reset fehlt: > rst=1 > > ein paar Takte warten > > rst=0 Jetzt funktioniert schon mal das meine zwei Teiler richtig initialisiert werden . In der Simulation steht jetzt kein U mehr sonder eine 0. Ein kleiner Fortschritt. Findet Ihr den Frequenzteiler gut geschrieben? Ist mein erster, deshalb brauche ich Kritik und Anregung von erfahreneren VHDL'ern. Vielen Dank euch
:
Bearbeitet durch User
Wenn du unsigned verwendest musst du auch die numeric.std als Bibliothek einbinden.
Wie gesagt im FPGA, da dort die FF über den GSR initialisiert werden können. Sobald du den Sandkasten allerdings verlässt funktioniert das nicht mehr. In diesem Design funktioniert es in der Realität natürlich, da es dort kein X gibt. Das ist ein reines Simulationsproblem. Das kann man mit einer initialien Zuweisung beheben, führt halt u.U. dazu, dass man Mist simuliert. Auch bei so etwas "Einfachem" sollte man es doch richtig machen.
Jetzt läuft es wunderbar. Ich habe in der Testbench dies eingefügt: rst <= '1' AFTER 0ns, '0' AFTER 5ns; Gustl B. schrieb: > Wenn du unsigned verwendest musst du auch die numeric.std als Bibliothek > einbinden. Komisch, auch wenn ich keine Bilder mehr posten soll ging es diesmal nicht anders. Siehst du die Fehlermeldung? Dieser kommt sobald ich die andere lib verwenden möchte.
:
Bearbeitet durch User
Wieso sollte da mist simuliert werden? Die Initialisierung landet auch im bitstream und wird ganz normal geladen, wo ist das Problem?
Gustl B. schrieb: > Die Initialisierung landet auch > im bitstream und wird ganz normal geladen, wo ist das Problem? Dass du nicht verstehen willst, dass das nur im FPGA gültig ist und vom Tool abhängig ist. Wenn es funktioniert schön, man kann ja mittlerweile auch RAMs durch synchrone Prozesse beschreiben, die dann "magisch" gemappt werden. Wenn es das Tool nicht unterstützt: Simulation toll dank init Werten. In der Realität haben die FF Zufallswerte ohne Reset. Das ergibt bei zB bei Zustandsmaschinen wirklich lustige Effekte.
Verstehe ich schon, aber welche Toolchain kann das denn nicht? Ich habe bisher weder bei Altera noch bei Xilinx Probleme mit init Werten gehabt und finde diese daher empfehlenswert weil ein Reset zusätzliche Logik benötigt und auch wieder eine Fehlerquelle darstellt.
Gustl B. schrieb: > aber welche Toolchain kann das denn nicht Alles was nicht FPGA oder CPLD ist. Gustl B. schrieb: > weil ein Reset zusätzliche Logik > benötigt und auch wieder eine Fehlerquelle darstellt Er macht das Verhalten deterministischer.
Gustl B. schrieb: > Verstehe ich schon, aber welche Toolchain kann das denn nicht? ASIC?! Erik: > Dass du nicht verstehen willst, dass das nur im FPGA ...
Vicky M. schrieb: > Findet Ihr den Frequenzteiler gut geschrieben? Um mal wieder zum eigentlichen Problem zurück zu kommen. Die Antwort auf die Frage ist davon abhängig, ob du alle Ausgänge parallel brauchst.
Erik schrieb: > Sorry, aber Startwerte sind einfach nur bäh in synthesefähigem Code. Nicht seit kurz nach der Jahrtausendwende, als die Synthesizer lernten, diese Initialwerte auch tatsächlich ins FPGA zu laden... Erik schrieb: > Er macht das Verhalten deterministischer. Für SRAM basierte FPGA gilt: er ist meist unnötig, braucht Ressourcen und macht auch gern Probleme. Und das kontrollierte Laden von Initialwerten heim Reboot des FPGAs ist allemal besser als das von Anfängern gern realisierte unkontrollierte asynchrone Verlassen des Resetzustands. Vicky M. schrieb: > Dieser kommt sobald ich die andere lib verwenden möchte. Ich hatte es geschrieben: man rechnet nicht mit std_logic_vector. Nimm einen unsigned Vektor für diese Rechnung.
:
Bearbeitet durch Moderator
Lothar M. schrieb: > Vicky M. schrieb: >> Dieser kommt sobald ich die andere lib verwenden möchte. > Ich hatte es geschrieben: man rechnet nicht mit std_logic_vector. Nimm > einen unsigned Vektor für diese Rechnung. Aber genau das ist ja nun mein Problem. Ich habe brav wie von euch/dir vorgeschlagen die lib: use IEEE.NUMERIC_STD.ALL für use IEEE.STD_LOGIC_unsigned.ALL ausgetauscht und anschließend signal divider : unsigned (3 downto 0); für std_logic_vector ersetzt. Doch nun bekomme ich wie oben im Bild gezeigt einen Fehler?! Habe ich etwas falsch verstanden?
:
Bearbeitet durch User
hach die Borniertheit von FPGA Entwicklern ist köstlich und erklärt den Spass den man hat wenn man sowas dann in einen ASIC integrieren will.
Erik schrieb: > hach die Borniertheit von FPGA Entwicklern ist köstlich und erklärt den > Spass den man hat wenn man sowas dann in einen ASIC integrieren will. Ich kann vielleicht irgendwann mit viel Übung deinen Kummer verstehen bezüglich der Startwerte. Aber dabei kommen wir ganz von dem Thema ab warum ich diesen Beitrag hier angefangen habe. Vielleicht hast du ja Lust meine Frage zu beantworten :) bezüglich des IEEE.NUMERIC_STD.ALL. Beste Grüße Vicky
Hast du divider <= divider +1; oder divider <= divider + '1'; da stehen? Mit Unsigned geht nur das Erste weil es eben als Zahl und nicht als Logiksignal interpretiert wird.
Gustl B. schrieb: > Hast du > > divider <= divider +1; > > oder > > divider <= divider + '1'; > > da stehen? Mit Unsigned geht nur das Erste weil es eben als Zahl und > nicht als Logiksignal interpretiert wird. eine kleine aber wichtige Bemerkung. Ich danke dir vielmals. Das hätte mir auffallen sollen. Entschuldigung
Erik schrieb: > Sobald du den Sandkasten allerdings verlässt funktioniert das nicht mehr. Warum so arrogant? Viele haben gar nicht die Not oder die Stückzahl, diesen "FPGA-Sandkasten" zu verlassen. Und müssen sich demnach auch nicht um die Zwänge und Nöte von ASIC-Designern sorgen. Erik schrieb: > hach die Borniertheit von FPGA Entwicklern ist köstlich Natürlich verwende ich diese Fähigkeit, Initialwerte vergeben zu können. Ich habe dafür BEZAHLT, warum sollte ich das also links liegen lassen? Das ist, wie wenn ich von einem µC den Timer 3 samt seiner 16er-Compare-Unit mit 1ns Auflösung nicht verwenden würde, nur weil ein ANDERER, der seinen µC zufällig auch mit C programmiert, das auch nicht kann. Genauso schere ich mich nicht um einen Clock-Tree und auch nicht um das Resetnetz. Ich habe dafür bezahlt, dass diese Komponenten funktionieren. Und ich werde sie natürlich auch dann weiterhin verwenden, wenn mir ein Mensch, der offenbar von dieser Technik nichts weiß, Borniertheit vorwirft. Sollte ich aber jemals ein ASIC machen müssen, dann bin ich mir zu 100% sicher, dass ich auch das hinbekommen werde. Dann muss man halt einfach diesen liebgewonnenen Mechanismus der Initialwerte aufgeben und das wie zu Urzeiten selber machen, solange es die Toolchain nicht hinbekommt... Gustl B. schrieb: > Mit Unsigned geht nur das Erste Es ginge auch ein divider <= divider + unsigned'("1"); Denn dann wird ein 1 Bit breiter Vektor (beachte " statt ') als unsigned qualifiziert und auf den unsigned Vektor addiert. Siehe dazu: http://www.lothar-miller.de/s9y/archives/82-Qualifier.html Im Sourcecode der numeric_std findest du übrigens, für welche Operanden die Addition überladen und definiert ist. Siehe z.B. dort: https://www.csee.umbc.edu/portal/help/VHDL/packages/numeric_std.vhd die Zeilen function "+" (L,R: UNSIGNED ) return UNSIGNED; und folgende. Und dort findest du eben keine Funktion, die beschreibt, wie man das Literal '1' auf einen unsigned-Wert addieren könnte.
:
Bearbeitet durch Moderator
+ to_unsigned(1,4); Ginge auch, aber von den beiden von mir oben geschrieben Möglichkeiten ging nur die Erste.
Lothar M. schrieb: > Natürlich verwende ich diese Fähigkeit, Initialwerte vergeben zu können. > Ich habe dafür BEZAHLT, warum sollte ich das also links liegen lassen? Weil es bad style ist, ein Feature zu verwenden, welches nur von manchen FPGA Tools unterstützt wird. Zumindest sollte man darauf hinweisen dürfen. Ich denke es geht hier darum Anfängern etwas zu vermitteln. Lothar M. schrieb: > Natürlich verwende ich diese Fähigkeit, Initialwerte vergeben zu können. > Ich habe dafür BEZAHLT, warum sollte ich das also links liegen lassen? Das darfst du, ich habe lediglich angesprochen, dass ein Reset (in Verbindung mit einem Reset Synchronisierer) besser als Initialwerte ist. Lothar M. schrieb: > Genauso schere ich mich nicht um einen Clock-Tree und auch nicht um das > Resetnetz. Das solltest du aber, gerade wenn du mehr als eine Clock und einen Reset im FPGA hast. Wo wir bei der spannenden Frage angekommen sind, was willst du denn mit den ganzen generierten Clocks machen Vicky? Wenn du die weiter auf Logik gehen sollen, handelt es sich dabei um generated Clocks.
Erik schrieb: > Weil es bad style ist, ein Feature zu verwenden, welches nur von manchen > FPGA Tools unterstützt wird. Warum soll ich etwas nicht benutzen, nur weil irgendeine andere Toolchain es nicht kann? Dann würde man sich ja auf den schlechtesten gemeinsamen Nenner aller verfügbaren Toolchains einigen:de eine kann A nicht, die zweite B nicht, und die dritte tut sich mit C unheimlich schwer. Ergo darf ich A und B genauso wenig wie C verwenden. Kuriose Ansicht. Aber, sei's drum... Erik schrieb: > Wenn du die weiter auf Logik gehen sollen, handelt es sich dabei um > generated Clocks. Siehe dazu auch die Anmerkungen im Beitrag "Re: VHDL zwei CLK´s mit LFSR und 1:2 Teiler"
:
Bearbeitet durch Moderator
Und der Mechaniker sollte keine Bremsen verwenden weil die nur auf einem Boden funktionieren. Luftbremsen sind schon besser, die funktionieren an Auto und Flugzeug, aber setzen Luft voraus. Also Bremsraketen weil die funktionieren immer.
wenn ihr bitte die Güte haben würden den Reset-Streit dort fortzuführen: Beitrag "Re: Xilinx und die Resets"
TriHexagon schrieb: > Gustl B. schrieb: >> Verstehe ich schon, aber welche Toolchain kann das denn nicht? > > Lattice LSE. Die kann aber auch nichts... Habe bereits mehrere Tickets bei Lattice, wegen Synthesefehlern.
Erich schrieb: > dort fortzuführen: Beitrag "Re: Xilinx und die Resets" Ich würde hier wg. Bezug zu Lattice eher den Beitrag "FlipFlop initial value bei MachXO2?" empfehlen. Dort ist auch der Link auf den obigen Thread drin...
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.