27 Treffer gefunden
|
Suchdauer: 0,01 Sekunden
|
|
Betreff |
Autor |
Datum |
|
Re: Quartus II ignoriert "AFTER"
Hallo Ontos.
Ich arbeite zwar nicht mit Quartus aber ich denke, das Verzögern von Signalen sollte funktionieren.
Probiere mal folgendes aus:
f <= x1 after 10 ns;
f2 <= x2 after 20 ns;
Das sollte eigentlich funktionieren.
Vielleicht noch als Info. Der after Befehl sollte nur in Testbenches benutzt werden, da er nicht synthetisierbar ist.
In der Regel wird er vom Synthetisierer ignoriert.
In der Behavorial Simulation solltest Du die Verzögerungen sehen und in den Post-Translate, Post-Map und Post-Route Simulationen nicht mehr. Dort siehst Du dann die Gatter- und Routing-Verzögerungen (liegen im unteren ns Bereich).
Gruß DaMicha.
|
DaMicha |
26.02.07, 12:38 |
|
Re: Quartus II ignoriert "AFTER"
Hallo Ontos.
Gut das Du mal das Bild dazu hineingestellt hast.
Schau Dir mal die Periode von x1 und x2 an. Die ist 200ns und 100ns. Das sind Teiler von der Verzögerung um 200ns und 500ns. Du schiebst f2 so weit in der Zeit, dass sie sich mit der Funktion f deckt.
Versuche mal kleinere Verzögerungszeiten:
z.B.:
[code]
f <= (x1 AND NOT x2) OR (NOT x1 AND x2) AFTER 20 NS;
f2 <= (x1 AND NOT x2) OR (NOT x1 AND x2) AFTER 50 NS;
[/code]
Gruß DaMicha.
|
DaMicha |
22.02.07, 09:08 |
|
Re: Hilfe undeclared identifier FILE_open_status
Hallo.
Versuch mal:
[code]
FILE readfile : text open read_mode is "dateiname.endung";
[/code]
oder
[code]
FILE readfile : text is in "dateiname.endung";
[/code]
Gruß DaMicha.
|
DaMicha |
15.02.07, 09:38 |
|
Re: VHDL Konverter
Hallo
Du könntest Dir den Quellcode als PDF ausdrucken, das dann mit dem Adobe Reader anzeigen lassen und dort den Text herauskopieren und in Word einfügen.
Gruß DaMicha.
|
DaMicha |
04.02.07, 12:06 |
|
Re: Case Anweisung
Hallo.
Ich bin mir nicht ganz sicher, aber ich denke, für den Case muss der Typ bekannt sein. Also auch die Bitbreite.
Versuche mal folgenden Funktionsheader:
function CATANH(n: std_logic_vector(31 downto 0)) return std_logic_vector is -- ln, sqrt
alternativ könntest Du eine Zwischenvariable einführen, der Du n zuweist und auf der das Case dann angewendet wird.
Gruß DaMicha.
|
DaMicha |
25.01.07, 07:52 |
|
Re: Schaltung
Hallo.
Im Prinzip genauso wie bei der Statezuweisung:
[code]
green <= '1' when (phase = "000" or phase = "001" or phase = "010") else '0';
[/code]
yellow und red dann analog nach Deiner Tabelle.
Gruß DaMicha.
|
DaMicha |
09.01.07, 07:06 |
|
Re: Xilinx Problem
Ja, kannst Du machen. Einfach untereinander schreiben.
Also pro Flanke:
[code]
if (reset_n = '0') then
...
elsif (ctxx'event and ctxx = '1') then
...
end if;
[/code]
Gruß DaMicha.
|
DaMicha |
28.12.06, 16:35 |
|
Re: Xilinx Problem
Hallo freshharry.
Dein Code ist nicht synthetisierbar!
Sobald Du eine Aktion bei einer Flanke machst, kannst Du keinen Else-Zweig mehr anhängen.
Also
[code]
if reset_n = '0' then
mem_ctup <= '1';
elsif (ctup'event and ctup = '0') then
if (ctdown = '1' and cthold = '1' and ctreset = '1') then
mem_ctup <= '1';
end if;
end if;
[/code]
lässt sich synthetisieren und
[code]
if reset_n = '0' then
mem_ctup <= '1';
elsif (ctup'event and ctup = '0') then
if (ctdown = '1' and cthold = '1' and ctreset = '1') then
mem_ctup <= '1';
end if;
else
... irgend etwas ...
end if;
[/code]
nicht.
Es gibt (soweit ich weiß) einfach kein real existierendes Bauelement, dass diese Funktion umsetzen könnte.
Vielleicht hast Du einen Takt zur Verfügung. Mit dem kannst Du Dir die Taster mit einem Register einsampeln und dann schaun, ob sich was geändert hat: Alter Wert 0, neuer Wert 1 -> Steigende Flanke.
Ja, Du kannst mehrere Resetsignale verwenden.
Gruß DaMicha.
|
DaMicha |
28.12.06, 15:49 |
|
Re: P_Regler in VHDL
Hallo.
Poste doch mal die Fehlermeldungen vor dem FATAL ERROR oder versuche zu beschreiben, wie es dazu kommt.
Gruß DaMicha.
|
DaMicha |
18.12.06, 08:26 |
|
Re: P_Regler in VHDL
Hallo ousmou.
das sollte relativ einfach sein.
Erstmal musst Dir klar sein, was ein P-Regler macht. (Hab erstmal wieder nachschaun müssen ;-).
Dann solltest Du Dir Gedanken über die Ein- und Ausgangssignale machen.
Von welchem Datentyp sind die vom Regler zu verarbeitenden Signale? Integer, Fixed-Point (ist einfach zu implementieren) oder Floating Point (benötigt eventuell noch zusätzliche Bibliotheken).
Soll die VHDL-Komponente getaktet sein? Wenn ja brauchst Du ein Takt- und ein Reset-Signal.
Du kannst ja mal die Rahmenbedingungen Posten und vielleicht schon den VHDL Componenten-Header.
Gruß DaMicha.
|
DaMicha |
15.12.06, 08:42 |
|
Re: Wie kann ich Zuweisen
Hallo Martin.
Du brauchst ein Zwischensignal, mit diesem das Port Mapping und dann die Zuweisung auf Deine Signale.
[CODE]
signal ref : TYPE_MOD_REG(1 to NR_OF_PHASES);
...
port map
(i_reference => ref);
i_reference_1_sg <= ref(1);
...
i_reference_4_sg <= ref(4);
[/CODE]
Gruß DaMicha
|
DaMicha |
30.11.06, 09:38 |
|
Re: VHDL Befehlsliste
Hallo Viktor.
"Schaltungsdesign in VHDL" ist gleich ein ganzes Buch und wie ich finde ein sehr gutes. Hat auch ein Stichwortverzeichnis ;) :
http://www.itiv.uni-karlsruhe.de/opencms/opencms/de/study/vhdl/book/download.html
Ansonsten vielleicht:
http://www.vhdlbuilder.com/index.php?page=reference
oder
http://tech-www.informatik.uni-hamburg.de/vhdl/doc/kurzanleitung/vhdl.pdf
Gruß DaMicha.
|
DaMicha |
28.11.06, 12:19 |
|
Re: Wann macht VHDL Sinn?
Moin Happy.
[quote]
[quote]
* das Design schafft die geforderte Taktfrequenz (z.B. 20 MHz)
[/quote]
Ist damit gemeint das, wenn ich z.B. auf einen steigende Flanke beim Clock reagiere das Programm bis zur nächsten steigende Flanke einmal durchgelaufen sein muß?
[/quote]
Ja fast, nur das es sich nicht um die komplette Logik handeln muss, sondern auch nur eine Teilaufgabe abgearbeitet werden kann.
Mal ein Beispiel:
x = (a + b) + (c + d)
a,b,c,d,x sind Register und die Plus Operatoren ist die Logik, die diese verknüpft.
Es müssen also die drei Plus-Operatoren innerhalb eines Taktzykluses durchgeführt werden. Wobei die geklammerten parallel ausgeführt werden können. Der Takt muss also so langsam sein, dass 2 Plus Operatoren ausgeführt werden können.
Man kann die Aufgabe aber auch aufteilen (mit zwei zusätzlichen Registern x1, x2):
x1 = a+b
x2 = c+d
im ersten Takt und
x = x1 + x2
im zweiten Takt.
Das Ergebnis ist das gleiche nur das zwei Takte benötigt werden. Dafür benötigt man nur noch die Laufzeit von einer Addition zwischen den Registern. Der Takt kann also schneller sein.
[quote:diehappy]
[quote]
[quote]
Macht VHDL eher bei großen oder auch schon bei kleinen Projekten Sinn?
[/quote]
Meinst Du jetzt im Vergleich zu Verilog (andere Hardwarebeschreibungssprache) oder meinst Du den prinzipiellen Einsatz von FPGAs, die Zielhardware für VHDL. Man könnte ja auch Microkontroller benutzen.
[/quote] Ich meinte damit, wann nutzt man VHDL, wann nimmt man noch Blocksymbole oder was es auch sonst noch für möglichkeiten gibt die Hardware zu beschreiben.
[/quote]
Blocksymbole habe ich eigentlich noch nie verwendet (außer auf nem Blatt Papier ;-) ). Habe aber schon gesehen, das auf höheren Ebene Komponenten mit Hilfe einer Blockansicht zusammengeschaltet werden (z.B.: Rechenwerk, SDRAM-Interface, IO-Schnittstellen, usw.). Ist Geschmackssache und vielleicht etwas übersichtlicher, da man ähnlich wie bei einem Leiterplattenlayout die Struktur des Designs vor Augen hat.
Bei kleinen Designs (einfache logische Verküpfungen) könnte man Blöcke höchstens noch beim Lehren einsetzen, um eine Vorstellung zu vermitteln.
Mfg
DaMicha
|
DaMicha |
07.11.06, 17:34 |
|
Re: LCD-Interface
Moin Mish.
[quote:mish]
Und um das Display im 4 Bit Modus anzusprechen setze ich erst für alle Daten-Leitungen das high Nibble, danach pulse ich den enable, setze das low Nibble für jede Daten-Leitung und pulse nochmals den enable, korrekt?
[/quote]
Ich sag mal JA ;).
Aber wie schon gesagt, um sicher zu gehen und bei der Sequenz und dem Timing keinen Fehler zu machen, würde ich mich an den ASM-Code halten.
Viel Erfolg
DaMicha.
|
DaMicha |
06.11.06, 09:01 |
|
Re: Wann macht VHDL Sinn?
Moin Happy.
[quote]
Wenn das soweit richtig ist, woher weiß man denn wie effektiv das Programm die gewünschten Anforderungen umsetzt?
[/quote]
Es gibt zwei Hauptunkte, die erfüllt sein sollten (müssen ;) ):
* das Design schafft die geforderte Taktfrequenz (z.B. 20 MHz)
* das Design passt in den Ziel-FPGA
Zwischen der Spezifikation und dem Zieldesign stehen dann zwei Dinge. Zum einen der Designer selbst, der den größten Einfluss durch die Art und Weise seiner Umsetzung in VHDL hat; oder um es platt zu Sagen wie gut er mit Hilfe von VHDL programieren (designen) kann.
Zum anderen ist dann noch der VHDL-Compiler (mit Synthese, Mapping und Place & Route), der dann seinen Job so gut oder schlecht wie möglich macht.
Wenn jetzt das fertige Design schneller läuft als die geforderte Taktfrequenz und möglichst wenig Platz im FPGA benötigt, sind die Anforderungen effektiv umgesetzt. Man sollte es aber nicht übertreiben, da der Faktor Zeit ja auch nicht außer Acht gelassen werden sollte (besonders in der freien Wirtschaft, also in echt ;) ).
[quote]
Macht VHDL eher bei großen oder auch schon bei kleinen Projekten Sinn?
[/quote]
Meinst Du jetzt im Vergleich zu Verilog (andere Hardwarebeschreibungssprache) oder meinst Du den prinzipiellen Einsatz von FPGAs, die Zielhardware für VHDL. Man könnte ja auch Microkontroller benutzen.
Mfg
DaMicha.
|
DaMicha |
06.11.06, 07:44 |
|
Re: LCD-Interface
Hallo Mish.
Unter:
http://www.sprut.de/electronic/lcd/index.htm#init
steht es ja. Nach dem Power-ON-Reset ist der LCD Controller immer im 8 Bit Modus. Das ist er dann so lange, bis Du in den 4 Bit Modus gewechselt hast.
Du musst also zum Anfang so tun als ob ein 8 Bit Interface vorhanden ist (nur ein Enable Puls pro Befehl) obwohl Du nur die oberen 4 Datenbits davon benutzt.
Die unteren 4 Datenbit werden zum Umstellen in den 4 Bit Modus nicht benötigt!
Bist Du dann im 4 Bit Modus, musst Du Low- und High-Nibble einzeln übertragen.
Gruß DaMicha.
|
DaMicha |
03.11.06, 13:35 |
|
Re: LCD-Interface
Moin.
Hab mir mal kurz die Asm-Quellen unter:
http://www.sprut.de/electronic/pic/programm/lcd.htm
-> http://www.sprut.de/electronic/pic/programm/lcd.zip
angeschaut.
Scheint so zu sein, dass Du erstmal davon ausgehst, dass du im 8 Bit Modus bist (bzw. in den 8Bit Modus gewechselt wird, falls der 4 Bit Modus aktiv war).
Also die 1. vier Befehle im 8Bit Modus (ohne high/low) und die restlichen im 4Bit Modus.
Schau Dir mal genau die Wartezeiten zwischen und vor den Befehl an (sind auch im ASM Code). Denke mal, falls man zu schnell ist, funktioniert es nicht.
Gruß DaMicha.
|
DaMicha |
02.11.06, 12:04 |
|
Formatierung des Postings
Moin
Ich würde gerne wissen, ob es möglich ist den VHDL-Code der Übersichtlichkeit wegen im Posting in Proportionalschrift darzustellen.
Vielleicht mit dem HTML Tag code?
[code]
if risign_edge(clk) then
cnt := cnt + 1;
end if;
[/code]
jupp!
jetzt fehlen aber noch die Leerzeichen von der Formatierung am Zeilenanfang...
Gruß DaMicha.
|
DaMicha |
01.11.06, 10:48 |
|
Re: blinkende led
Moin Mish
[quote:Gast]
[quote:DaMicha]
Ach so, der Reset ist asynchron und Low-Aktiv
[/quote]
Low-Aktiv meint es geschieht eine Aktion wenn er 0 ist?
Asynchron? Huh? :)
[/quote]
Es gibt prinzipiell zwei Wege einen Reset an einem Register zu realisieren: synchron oder asynchron (oder beides) zum Takt.
Synchron bedeutet, dass mit dem Takt der Inhalt des Registers zurück gesetzt wird.
Asynchron bedeutet, dass unabhängig zum Takt der Inhalt des Registers zurückgesetzt wird.
In VHDL sieht das folgendermaßen aus:
synchron:
if (rising_edge(clk)) then
if (reset = '0') then -- low aktiver reset !
cnt := 0;
else
cnt := cnt + 1;
end if;
end if;
asynchron:
if (reset = '0') then
cnt := '0';
elsif (rising_edge(clk)) then
cnt := cnt + 1;
end if;
Der Vorteil des asynchronen Resets ist, dass Du Deine Logik in einen definierten Zustand bekommst, ohne dass der Takt schon anliegt. Sobald also der Takt da ist, kann es definiert losgehen!
und hier nochmal die Mischform, die sich automatisch ergibt, sobald man weitere Logik dem Prozess hinzufügt.
if (reset = '0') then
cnt := '0';
elsif (rising_edge(clk)) then
if (set_to_0 = '1' or irgend_was_anderes = '0') then
cnt := 0;
elsif
cnt := cnt + 1;
end if;
end if;
Bis denn,
DaMicha.
|
DaMicha |
01.11.06, 10:28 |
|
Re: blinkende led
Moin Mish.
Das geht so nicht ;).
Um Deinen Counter-Wert zu halten benötigst Du ein flankengesteuertes Speicherelement. Also ein Register (Flipflops).
Was Du Dir da gebaut hast sind Latche. Sind diese offen, wenn z.B. die if-Bedingung erfüllt ist, dann hast Du irgend etwas rückgekoppeltes und schwingendes...
Wie wäre es mit folgendem:
reg: process (clk, reset)
variable cnt : integer;
variable led : std_logic;
begin
if (reset = '0') then
cnt := 0;
led := '0';
elsif (rising_edge(clk)) then
if (cnt = 5000000-1) then
cnt := 0;
led := not led; -- light on / light off
else
cnt := cnt + 1;
end if;
end if;
led_1 <= led;
end process;
Ich habs jetzt nicht ausprobiert, aber mit den Signalnamenanpassungen sollte es so klappen.
Ach so, der Reset ist asynchron und Low-Aktiv
Viel Spaß,
DaMicha.
|
DaMicha |
26.10.06, 12:49 |
|
Re: Latch XY has unsafe behavior
Hallo DeLUru.
Aus Latch-Sicht sieht der StateMachine-Prozess schon ganz gut aus. Du solltest Dir aber nochmal die Signale clock_reference und act_data_idx anschauen.
Der Counters-Prozess geht aus meiner Sicht so nicht. Erstmal brauchen Deine Werte einen (asynchronen) Reset, wie im Trigger-Prozess. Dann solltest Du das Rücksetzen zu clock_counter und data_counter mit in den Clock-Pfad nehmen, da Du Dir hier einen intern über Kombinatorik generierten asynchronen Reset gebaut hast. Das fliegt Dir "in echt" ganz bestimmt um die Ohren.
Vielleicht solltest Du mal mit dem synthetisierten Design (besser noch nach dem Place and Route) simulieren. Wenn es damit nicht geht, dann funktioniert es im FPGA auch nicht. Hierbei musst Du aber beachten, dass Du die Setup- und Hold-Zeiten aus der Testbench für das Design einhältst. Also Eingangssignal nicht mit, sondern vor der Taktflanke setzen.
Gruß DaMicha.
|
DaMicha |
27.09.06, 16:07 |
|
Re: Latch XY has unsafe behavior
Hallo.
Das Problem tritt auf wenn Du ein Latch baust, dessen Enable Signal auch als Dateineingang dient. Das ist nicht gut!
Ich habe leider nicht sehen können an welcher Stelle in Deinem Design das auftritt.
Auf den ersten Blick sind aber im PublicProcess fast alle Signale bei Dir als Latch ausgelegt. Auch das ist nicht gut.
Eigentlich sollte Dir der Synthetisierer das auch im Logfile mitteilen.
Allgemein gilt, dass alle Latche, die Du nicht explizit geplant hast auch nicht ins Design gehören.
Der Grund für das Vorhandensein der Latche ist, dass die betroffenen Signale nicht in jedem Zweig (if-else, case) voll beschrieben sind.
Du solltest vielleicht erstmal alle Signal auskommentieren und nur mit act_state und nxt_state beginnen und mit jeden neuen Signal überprüfen (Dir darüber bewusst werden), ob es ein Latch hervorruft oder nicht.
Was mir noch auffällt, Deine Counter-Values werden nicht in Registern gespeichert (sondern als Latch). Du braucht einen ähnliches Konstrukt wie bei den States. Also ein Clock-Prozess (bzw. den selben) der Speichert.
Gruß DaMicha.
|
DaMicha |
27.09.06, 12:03 |
|
Re: Suche eine art NOP Befehl
Hallo Christoph.
Du kannst einfach:
when others =>
schreiben (die Zeile nicht mit einem Semikolon abschließen).
Oder
when others => null;
um deutlicher zu kennzeichnen, dass hier auch wirklich nichts gemacht werden soll. So mach ich's immer.
Zu beachten ist, dass Du Dir so ein Latch in den MUX baust, da bei allen anderen Eingangskombinationen (101 bis 111) der alte MUX Wert gehalten wird. Musst Du Dir überlegen, ob Du das wirklich brauchst, denn eigentlich sollten Latche vermieden werden. Für einen reinen MUX würde
when others => output <= "0...0";
gehen ("0...0" je nach output-Bitbreite oder
when others => output <= (others => '0');
für beliebige Bitbreiten
).
Gruß DaMicha.
[quote]
Hallo zusammen,
gibt es in VHDL eine Art "do-nothing" Befehl?
Es geht um folgendes:
Ich habe ein Konstrukt der Form
architecture behaviour of mux5 is
begin
process(sel)
variable error : bit;
begin
case sel is
when "000" => output <= i0;
when "001" => output <= i1;
when "010" => output <= i2;
when "011" => output <= i3;
when "100" => output <= i4;
when others => error:='1'; --just a kind of NOP-Operation
end case;
end process;
end behaviour;
nun finde ich die Lösung im "others" case nicht besonders elegant. Wenn ich aber den others case weglasse, dann bekomme ich beim Übersetzen eine Fehlermeldung, daß z.B. nur 4 von 83 Fällen betrachtet wurden. Sel ist vom Typ std_logic_vector.
Gruß,
Christoph
[/quote]
|
DaMicha |
22.09.06, 14:24 |
|
Re: # ** Error: (vsim-3601) Iteration limit reached at time 0 ns.
Ach ja,
falls Dein Modelsimproblem gelöst ist (wie auch immer ;), dann mache doch bitte ein neues Topic z.B. im Thread "Anfänger" oder "Allgemeines" auf.
Gruß DaMicha.
|
DaMicha |
19.07.06, 07:55 |
|
Re: # ** Error: (vsim-3601) Iteration limit reached at time 0 ns.
Hallo LukeS.
Das neue Archiv unterscheidet sich vom Inhalt ja nun komplett von dem alten!
Schreibe doch nochmal genau, welche Testbench nicht das gewünschte Verhalten liefert.
Also die Testbenches an sich laufen ja...
Gruß DaMicha.
|
DaMicha |
19.07.06, 07:10 |
|
Re: # ** Error: (vsim-3601) Iteration limit reached at time 0 ns.
Hallo
Leider kann ich Deinen Fehler nicht nachvollziehen. Verrate doch mal, welche der Testbenches betroffen ist...
Ach ja, lösche doch mal die Waveform aus dem Archiv, dann sollte es sich merklich verkleinern.
Gruß DaMicha.
|
DaMicha |
17.07.06, 08:13 |
|
Re: Addierer aufbauen S.O.S
Falls es jemanden näher interessiert: nach "essential elements of the IPSP" googeln oder direkt
www.atips.ca/research/documents/ca/dbns/1999_Trans-Computers.pdf
schon etwas abgefahren...
|
DaMicha |
15.07.06, 07:50 |
|
|
|
powered by carookee.com - eigenes profi-forum kostenlos
Design © trevorj
|