Forum: FPGA, VHDL & Co. VHDL Clock Simulieren (erste Schritte)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Vicky M. (vicky_m)


Angehängte Dateien:
  • preview image for 1.png
    1.png
    388 KB, 292 Downloads
  • preview image for 2.png
    2.png
    95,8 KB, 217 Downloads
  • preview image for 3.png
    3.png
    101 KB, 1125 Downloads

Bewertung
0 lesenswert
nicht lesenswert
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

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
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;

von Vicky M. (vicky_m)


Bewertung
0 lesenswert
nicht lesenswert
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
von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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
von Vicky M. (vicky_m)


Bewertung
0 lesenswert
nicht lesenswert
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
von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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.

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
Das 0 5 dürfte der dutycycle sein. Ist aber nur geraten.

von Markus F. (mfro)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Vicky M. (vicky_m)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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?

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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
von Vicky M. (vicky_m)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

von Erik (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Reset fehlt:
rst=1

ein paar Takte warten

rst=0

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
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;

von Erik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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!

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Vicky M. (vicky_m)


Bewertung
0 lesenswert
nicht lesenswert
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
von Gustl B. (-gb-)


Bewertung
-1 lesenswert
nicht lesenswert
Wenn du unsigned verwendest musst du auch die numeric.std als Bibliothek 
einbinden.

von Erik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Vicky M. (vicky_m)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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
von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
Wieso sollte da mist simuliert werden? Die Initialisierung landet auch 
im bitstream und wird ganz normal geladen, wo ist das Problem?

von Erik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Erik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von bitwurschtler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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 ...

von Erik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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
von Vicky M. (vicky_m)


Bewertung
0 lesenswert
nicht lesenswert
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
von Erik (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
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.

von Vicky M. (vicky_m)


Bewertung
0 lesenswert
nicht lesenswert
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

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Vicky M. (vicky_m)


Bewertung
0 lesenswert
nicht lesenswert
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

von TriHexagon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> Verstehe ich schon, aber welche Toolchain kann das denn nicht?

Lattice LSE.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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
von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
+ to_unsigned(1,4);

Ginge auch, aber von den beiden von mir oben geschrieben Möglichkeiten 
ging nur die Erste.

von Erik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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
von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Erich (Gast)


Bewertung
0 lesenswert
nicht lesenswert
wenn ihr bitte die Güte haben würden den Reset-Streit dort fortzuführen:
Beitrag "Re: Xilinx und die Resets"

von M. H. (bambel2)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.