Guten tag,
ich versuche gerade ein Tutorial nach zumachen um mich mal mit Fpgas zu
beschäftigen.
es geht darum ein paar LEDs leuchten zu lassen. dazu ist ein Modul mit
allen verfügbaren pins für schon vorgegeben.
anschließend soll der interne oszillator noch aktiviert werden.
allerdings ist das jetzt für einen Anfänger sehr schlecht beschrieben wo
genau die Codezeilen hin gehören. oben oder Unten.
auf jedenfall bekomme ich keine synthese hin. vielleicht könnte mir ja
jemand sagen ob ich das so richtig eingefügt habe.
Das hier macht mir Probleme wie ich das richtig im Code Einfüge:
Michael H. schrieb:> auf jedenfall bekomme ich keine synthese hin
Wie lautet denn die konkrete Fehlermeldung?
Außerdem wäre eine Angabe, welches Board bzw. welcher FPGA und welche
Toolchain verwendet wird sehr hilfreich.
Du willst einen OSCH verwenden, was auf einen aktuelleren Lattice-FPGA
hinweist.
Duke
Duke Scarring schrieb:> Michael H. schrieb:>> auf jedenfall bekomme ich keine synthese hin> Wie lautet denn die konkrete Fehlermeldung?>> Außerdem wäre eine Angabe, welches Board bzw. welcher FPGA und welche> Toolchain verwendet wird sehr hilfreich.
Ich vermute den da:
https://tinyfpga.com/
Fpgakuechle K. schrieb:> Welcher FPGA hat denn einen internen Oscillator?!
Die MachXO2 Reihe von Lattice z.B.
Die nutzt der TE auch. Das sind schnuckelige FPGAS mit allem an Bord.
Laufen ohne weitere externe Beschaltung, ohne EEPROM usw. Sind wirklich
super für den Einstieg.
Dafür werden auch Kits unter TinyFPGA angeboten.
Allerdings finden sich auf tinyfpga doch genug Tutorials. Es gibt auch
ein StepByStep.
Hier z.B: https://tinyfpga.com/a-series-guide.html
Du solltest schon mal darlegen was bei dir nicht geht, was aber in
diesem Tutorial geht.
Ich habe die FPGAs auch und das klappt mit Lattice Diamond ohne große
Probleme.
Michael H. schrieb:> Hatte ich nicht hingeschrieben. Ja tiny fpga tutorial mit dem a1 auf> der Seite tinyfpga.com.
Dann poste doch jetzt mal die Fehlermeldungen der Synthese. Herrgott
aber auch.
Das ist das einzige rote bei der synthese, das ganze wäre zu lange oder
?
ERROR - c:/users/user/documents/fpga
tiny/tinyfpga-a-series-master/template_a1/tinyfpga_a1.v(1): syntax error
near -. VERI-1137
Done: error code 2
Cyblord -. schrieb:> Allerdings finden sich auf tinyfpga doch genug Tutorials. Es gibt auch> ein StepByStep.>> Hier z.B: https://tinyfpga.com/a-series-guide.html>> Du solltest schon mal darlegen was bei dir nicht geht, was aber in> diesem Tutorial geht.> Ich habe die FPGAs auch und das klappt mit Lattice Diamond ohne große> Probleme.
Genau das tutorial versuche ich gerade zu machen.
Was geht ist das tmpl.1 Beispiel aufzurufen und eine Synthese zu machen.
Was nicht geht ist anschließend in dem tutorial vorgegebene vhdl in
diamond über das Modul hinein zu kopieren um den internen oszilator zu
aktivieren. Sobald ich das wie oben beschrieben mache kann ich es nicht
mehr synthesieren.
Michael H. schrieb:> ...> Das hier macht mir Probleme wie ich das richtig im Code Einfüge:> wire clk;>> OSCH #(> .NOM_FREQ("2.08")> ) internal_oscillator_inst (> .STDBY(1'b0),> .OSC(clk)> );> reg [23:0] led_timer;>> always @(posedge clk) begin> led_timer <= led_timer + 1;> end
Das musst du innerhalb des modules einfügen. Am besten nach den vielen
*assign*s und vor dem endmodule.
In Verilog ist alles in Modulen organisiert, ausserhalb gibt es
eigentlich nur Kommentare und Preprozessor Anweisungen.
Andi
Michael H. schrieb:> in dem tutorial vorgegebene vhdl
Aua!
Dort steht übrigens:
1
If you are not at all familiar with Verilog you should pay close attention
2
and take a look at the additional resources at the end of this tutorial.
Hast du das getan? Und dort dann das Manual zum Taktgenerator gefunden?
Und dort die Seiten 27 bis 30 zum Internal Oscillator (OSCH) gesehen?
Michael H. schrieb:> ERROR - c:/users/user/documents/fpga> tiny/tinyfpga-a-series-master/template_a1/tinyfpga_a1.v(1): syntax error> near wire. VERI-1137
Der Synthesizer hat also schon mit der Zeile 1 deines Codes ein Problem.
Nimm jetzt mal Brain1.0 in Betrieb: Was ist da falsch? Oder was ist da
an der falschen Stelle? Oder wie machen es alle Anderen?
Also Danke, das hat jetzt funktioniert.
jetzt müsst ihr mir meine nächste Frage verzeihen, aber ich bin blutiger
Anfänger. könnte mir vielleicht jemand zeigen wie man jetzt den Takt von
dem internen Oszillator für ein D flip flop verwenden kann, also wie man
das schreibt im CODE das das DFF funktioniert.
denn normalerweise hätte ich jetzt einen externen Takt an Pin 13
LOCATE COMP "clk" SITE "13" ;
ich kann mir jetzt einfach nicht vorstellen wie ich das mit dem internen
Oszillator schreiben soll.
vielleicht würde mir bitte das jemand hier direkt am Beispiel zeigen ?
1
entityD_FFis
2
port(d,clkinbit;
3
q_led,q_quer_led:outbit);
4
endD_ff;
5
6
architecturesynchronofd_ffis
7
8
signalq,q_quer:bit;
9
begin
10
11
process(clock)
12
begin
13
if(clock'eventandclock='1')then
14
q<=d;
15
q_quer<=notd;
16
endif;
17
endprocess;
18
19
q_led<=notq;--negieren fuer die LED
20
q_quer_led<=notq_quer;--negieren fuer die LED
21
endsynchron;
22
23
wireclk;
24
25
OSCH#(-- ich weiß es steht jetzt wieder ausserhalb
26
.NOM_FREQ("2.08")-- aber ich weiß nicht wie ich ihn jetzt zuweisen soll
Deine Zeilen 24-30 sind nicht nur außerhalb eines geeigneten Blocks,
z.B. einer VHDL-Architecture, sondern auch noch in einer gänzlich
anderen Sprache geschrieben, nämlich Verilog. Du solltest Dich zunächst
einmal entscheiden, welche Sprache Du nutzen willst, d.h. VHDLoderVerilog, und nicht beide gleichzeitig. Letzteres ist zwar auch möglich,
aber ein sehr, sehr fortgeschrittenes Thema, für das man sehr, sehr
weitreichende Kenntnisse der verwendeten Toolchain besitzen muss.
Und dann solltest Du unbedingt ein Lehrbuch über die
Beschreibungssprache Deiner Wahl durchlesen. Tutorials sind zwar auch
sehr nützlich, aber es fehlen da natürlich die Grundlagen der Sprache.
Und dann musst Du Dich noch in die Grundlagen der synchronen
Hardwarebeschreibung einarbeiten. Zwar kann man bei manchen einfachen
Bausteinen (PLD, CPLD) durchaus auch "asynchrone" Logik ohne ordentliche
Taktverteilung realisieren, aber spätestens bei FPGAs darf man nicht
mehr einfach so Flip-Flops als Taktteiler einsetzen, ohne genau zu
wissen, was man da tut.
Ja stimmt ich brauche unbedingt ein Buch.
Das flipflop war als Beispiel gedacht. Wenn ich jetzt zb . Ein
schieberegister als Ic nehmen würde, dann würde man einen externen Takt
erzeugen und diesen dann an den clk Eingang des Registers geben.
Oder mit dem fpga hier extern zb. An pin 13 . Und dann zuweisen
13 LOCATE COMP "clk" SITE "13" ;
Somit hätte ich jetzt den externen Takt nach clk in der entity
zugewiesen.
Wie weise ich jetzt aber den internen Takt clk zu, also für das clk in
der entity?
Oder habe ich das mit wire clk schon gemacht?
Und in welchen Block müsste ich das ganze dann setzen?
Michael H. schrieb:> Somit hätte ich jetzt den externen Takt nach clk in der entity> zugewiesen.
Damit hättest Du ein Signal zugewiesen, das Du für einen Takt hältst.
Ob die Toolchain Deiner Meinung ist, ist noch nicht klar.
> Oder habe ich das mit wire clk schon gemacht?
Nein, "wire clk" ist kein gültige VHDL-Anweisung.
Michael H. schrieb:> ...> Oder habe ich das mit wire clk schon gemacht?>> Und in welchen Block müsste ich das ganze dann setzen?
Wenn du den internen Oscillator Ausgang mit dem 'clk' wire verknüpfst
(wie im ersten Beitrag) hast du einen benutzbaren clock.
Im LED-Blinker Beispiel im ersten Beitrag hast du einen mit clk
getakteten 24 Bit Zähler, namens led_timer. Da siehst du, wie in Verilog
ein getakteter Ausdruck aussieht.
Im Falle eines D-Flipflop würdest du schreiben:
1
always@(posedgeclk)
2
q<=d;
also bei jeder positiven Flanke wird d in q übernommen. Du beschreibst
also nur was ein D-FF tut, das Einfügen des Flipflops und das
"Verdrahten" übernimmt das Synthese-Tool.
Natürlich musst du zuvor ein Register q und einen Eingang d definieren,
und diese eventuell mit Pins verbinden wenn du die Signale von aussen
zugänglich haben willst.
All das ist Verilog, was in meinen Augen viel einfacher zu verstehen ist
als VHDL. Wie andere schon sagten, du musst dich für eine der beiden
Sprachen entscheiden, das Mischen der beiden führt unweigerlich zu
Syntax Fehlern.
Michael H. schrieb:> Ja stimmt ich brauche unbedingt ein Buch.
Du musst erst mal wissen, dass es vorrangig 2
Hardwarebeschreibungssprachen gibt: VHDL und Verilog. Und dich auf 1
einzige davon festlegen.
Ich möchte das gerne in vhdl machen.
Denn ein Buch habe ich, von elektor. Digitale Systeme entwickeln mit
fpga.
Von dort habe ich auch das Gatter und ich dachte das wäre vhdl , denn
dort steht ..........wird im zweiten Teil VHDL als Sprache zur
Beschreibung digitaler Grundfunktionen (z. B. Gatter und Flip-Flops)
kennenlernen.........dazu habe ich auch die Original platine und dort
ist der externe taktgeber alles drauf, weil der dort verwendete fpga
keinen internen oszilator hat.
Dann ist jetzt quasi das tutorial von tiny fpga in verilog und mein
gatter in vhdl richtig ?
Mein Ziel (warum ich das ganze hier frage) mit dem Internen Oszillator
wäre diesen Code irgendwann damit betreiben zu können, wenn ich einen
externen Takt dazu gebe funtioniert das einwandfrei. Aber ich würde
gerne mal den internen Takt für den clk (--Systemtakt) verwenden.
würde mir das Bitte jemand zeigen ob und wie das genau zu diesem Code
funktioniert.
Michael H. schrieb:> das heißt jetzt Quasi bei mir, ich kann das Signal clk_osch in clk> ändern :
Ja.
> Und zeile 15> signal a_in, b_in, a_old, b_old: std_logic;> Um das Signal clk erweitern> signal clk, a_in, b_in, a_old, b_old: std_logic;
Ich schreibe i.d.R. ein Signal pro Zeile. Das ist übersichtlicher und
einfacher, wenn mal nur bei einem Signal der Typ geändert werden soll.
> direkt über das end Behavioral; in der architecture setzen
Nein, das OSCH-Modul muss mit in die architecture. Ob es innerhalb des
architecture-Blockes dann oben, in der Mitte oder unten steht ist
prinzipiell egal.
Duke
Duke Scarring schrieb:> Das ist übersichtlicher und einfacher,> wenn mal nur bei einem Signal der Typ geändert werden soll.
Und man kann einfacher einem einzelnen Signal einen Initialwert
zuweisen.