möchte ich gerne überall einsetzten. Konkret hier für einen Trigger hit
counter, d.h. in einer entity setze ich trig_hit auf '1', wenn das
bit/edge pattern gefunden wurde. Es soll nun n-mal auftauchen um den
Capture auszulösen (hier noch nicht implementiert). Die Variante, die
den Counter benutzt "cntrl_proc", klappt nicht so, wie ich es
eigentlich wie in "proc" haben möchte:
Konkret zählt ctrl_proc einen hit zu wenig und geht nicht wieder auf
Null, wenn trig_hit != 0 ist.
Tja, wie bekomme ich das Verhalten von proc in ctrl_proc realisiert,
ich grübbele schon den ganzen Tag 'dran.
Viele Grüße
Olaf
PS: Da es keine Vorschau gibt - ist es für das nächste mal besser die
sourcen als Anhang zu machen?
Hallo Olaf
Beim ersten Überschauen über deinen Code ist mir aufgefallen, dass du
viel mit verschachtelten IF- Strukturen arbeitest.
Für die Übersichtlichkeit finde ich das nicht gerade optimal.
Der Code wird so nur länger und schwerer durchschaubar.
1
-- deine Version
2
if(LOADABLE)then
3
if(ld='1')then
4
m_count<=data;
5
endif;
6
endif;
7
8
-- meine Version
9
ifLOADABLEandld='1'then
10
m_count<=data;
11
endif;
> Konkret zählt ctrl_proc einen hit zu wenig und geht> nicht wieder auf Null, wenn trig_hit != 0 ist.> m_reset <= reset or m_clear;
...
> elsif rising_edge(clk) then> if(trig_hit = '0') then> m_clear <= RESET_ACTIVE;> else> m_clear <= not RESET_ACTIVE;> end if;> end if;
m_clear wird im schlimmsten Fall um eine Taktperiode verzögert.
Der Reset wird doch bei trig_hit = '0' gemacht?
Deine OR- Verknüpfung solltest du noch mal überdenken.
Dein Quelltext machst du sehr flexibel, aber dieses OR macht alles
wieder zugrunde.
Warum willst du mit aller Gewalt ein Zählerdesign nutzen?
> Tja, wie bekomme ich das Verhalten von proc> in ctrl_proc realisiert, ich grübbele schon> den ganzen Tag 'dran.
Weist du was der Vorteil von proc gegenüber ctrl_proc ist?
Mann kann es einfach lesen und versteht es sofort.
Wenn man ein Projekt in Teilefunktionen zerlegt, muss das eine Sinn
machen. Nur für deinen Zähler sehe ich da einfach keinen Sinn.
Du musst dir nur mal überlegen, wo welches Signal herkommt und um wie
viele Takte es gegenüber einem anderen verschoben ist.
Im Anhang ist dein Zähler ein bisschen aufgeräumt.
MfG
Holger
>Beim ersten Überschauen über deinen Code ist mir aufgefallen, dass du>viel mit verschachtelten IF- Strukturen arbeitest.>>Für die Übersichtlichkeit finde ich das nicht gerade optimal.>Der Code wird so nur länger und schwerer durchschaubar.
das kommt vom "Kästchen"-Denken - da muss ich meiner Brainware mehr
Flexibilität antrainieren ;-)
>m_clear wird im schlimmsten Fall um eine Taktperiode verzögert.
das würde auch das "Eins-zu-wenig-gezählt" erklären.
>Der Reset wird doch bei trig_hit = '0' gemacht?
yep, es kommt kein trigger hit und der counter wird zurück gesetzt. Vom
Prinzip her ist es ein Monoflop.
>Deine OR- Verknüpfung solltest du noch mal überdenken.>Dein Quelltext machst du sehr flexibel, aber dieses OR macht alles>wieder zugrunde.
wie soll ich es anders lösen? Am reset "Knopf" des Zählers zerrt zum
einem der reset der ganzen entity und zum anderen der interne reset
m_clear aus ctrl_proc.
>Warum willst du mit aller Gewalt ein Zählerdesign nutzen?
Evtl. versuche ich die reuseablity etwas auf die Spitze zu treiben, das
mag sein ;-) und wenn ich sehe, wieviel Zeit ich darin bereits
reingesteckt habe ... Aber rein hypothetisch/interessenhalber, wie kann
man es machen?
Auch muss ich noch einen Vergleich einführen auf eine vorgegebene
Anzahl von hit events, zB. 3 clock periods continuous trig_hit. Was
wird besser synthetisiert, ein Vergleich (cnt = cnt_soll) oder einen
Zähler mit cnt_soll laden und runterzählen und bei cnt=0 den match
ausgeben? Daher auch die Idee mit der Zähler entity.
Viele Grüße
Olaf
inzwischen habe ich die einzelnen trigger condition entities (zum
Großteil) zusammen und wollte sie in einen gemeinsamen "trigger"
verpacken.
In diesem Testbench ist mir nun aufgefallen, dass der match m_hitlength
2 Takte später kommt als ich ich erwartet hätte (1 Takt). Im Testbench
für hithlength_trigger kommt er wie erwartet mit der nächsten
steigenden Flanke.
Woran liegt diese unerwartete Verzögerung eines Clocks und wie kann ich
sie umgehen, da ich ja alles nur zusammen geknippert habe.
Letzlich werden die Ereignisse auseinandergezogen, wodurch imo die
Kausalität verloren geht, wenn dann alles x Takte später kommt.
Viele Grüße
Olaf
Das verblüffende ist im Screenshot zu sehen, er übernimmt die Samples
von Probe nict in sample_t0. Anscheinend werden nur die '0'
übernommen.
Sinnigerweise bekomme ich die Warnung
All outputs of the instance <probe_latch_i> of the block <latch_g> are
unconnected in block <la>.
bei der Synthese. Ich behaupte jedoch, es richtig verknippert zu haben
- oder wer reisst mit das Brett vor'm Kopf weg?
Viele Grüße
Olaf
Hi,
@FPGA-USER
hm ich hatte das selbe Problem und konnte es nur so loesen. Ich dachte
auch das es nur bei unterschiedlichen Bitbreiten angegeben werden muss.
Es soll nur ein Tipp sein und Ope kann es mal gerne ausprobieren. Waere
nett ein Feedback zukriegen.
Gruß,
Dirk
>signal clk : std_logic := '0';>signal reset : std_logic := '0';>signal probe : std_logic_vector(7 downto 0) := (others=>'0');
Lass mal die (others=>'0') Zuweisung weg. Zu hast zwei oder mehrere
Treiber, die auf sample_t0 gegeneinander arbeiten. Anders kann ich mir
es im Moment nicht erklären.
Gruß Jörn
die defaults bei probe habe ich weggelassen, es half leider nichts. MXE
auch:
Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic
operand, the result will be 'X'(es).
# Time: 25 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 35 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 35 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 45 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 45 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 55 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 55 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 65 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 65 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 75 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 75 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 85 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 85 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 95 ns Iteration: 0 Instance: /tb_la8/uut
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 95 ns Iteration: 0 Instance: /tb_la8/uut
nichts neues aber auch nicht sehr hilfreich imo. Jede einzelne Entity
in ihrem TB funktioniert wie erwartet, nur für TB_la net :/
Was mich irritiert ist die Warnung von XST: All outputs of the instance
<probe_latch_i> of the block <latch_g> are unconnected in block <la>.
Versuche ich mir die RTL Schematics bzw Technologie Schematics
anzusehen, sind diese leer!
Viele Grüße
Olaf
PS: Ein
sample_t1(BIT_WIDTH-1 downto 0) <= sample_t0(BIT_WIDTH-1 downto 0)
hat auch nichts gebracht.
habe eben die Konstante
ONE : std_logic_vector(7 downto 0) := (others => '1');
im TB eingeführt und den Eingang probe der entity la damit verbunden
und bekomme als wave diesmal nur XXXXX, siehe Anhang. Evtl. hilft ja
dies.
habe eben die Stelle ausfindig gemacht, an der die Probleme verursacht
werden, aber warum ist mir noch nicht klar:
[vhd]
sample_proc: process(clk, reset, sample_t0)
constant ZERO : std_logic_vector(BIT_WIDTH-1 downto 0) := (others
=> '0');
begin
-- synchronuous store sample t-1
if(reset = RESET_ACTIVE) then
-- sample_t0 <= ZERO;
-- sample_t1 <= ZERO;
sample_trans <= '0';
elsif rising_edge(clk) then
[/vhdl]
und es gibt nur noch eine Warnung von MXE:
Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic
operand, the result will be 'X'(es).
# Time: 15 ns Iteration: 0 Instance: /tb_la8/uut
die, so denke ich, von dem uninitialisierten Werten her kommen dürfte.
Ich mache demnächst ein Archive vom aktuellen Stand.
Viele Grüße
Olaf
Ich darf im reset process sample_t0 nicht resetten. Evtl., weil dies
bereits im probe_latch_i geschieht? Aber warum dieses so nachhaltige
Wirkung zeigt, ist mir allerdings ein Rästel.
Das sich bei diesem synchronen? (bis auf dem reset) Design alles
verzögert, ist schon ätzend imo. Hier bekomme ich zB. einen Takt später
mit, dass sich die sampels geändert haben; kann es also im TB nicht mehr
so einfach nachprüfen. Für die Cotrl Logik wird's dann interessant.
Viele Grüße
Olaf
xst error:
Line 45. parse error, unexpected LE, expecting PIPE or ROW
Line 43. String literal "01" is not of size 0.
Line 44. String literal "10" is not of size 0.
Die erwartete size 0 verblüfft mich doch etwas, ist hier ein Syntax
Fehler? Wenn ich schreibe b"01" ändert dies auch nichts.
Viele Grüße
Olaf
>müßte das nicht "downto" heißen?
yep - danke!, damit bleibt nur noch der Fehler auf Line 45. Ich habe
aber auch schon solche Sachen mit "to" gesehen, allerdings in einem
anderem Zusammenhang. Wann nimmt man eigentlich "downto" und "to"?
Viele Grüße
Olaf
Weil es "(others=>'0');" heißen sollte ;)
Kommt drauf an wie du deinen Std_logic_vector zusammenbaust. Beides
müßte funktionieren:
(2 downto 0) oder (0 to 2)
Wenn du in deiner ersten Version 0 to 1 geschrieben hättest, wäre es
auch gegangen.
aja, das kleine Syntaxteufelchen :-) Jetzt ist der Unterschied auch
klar.
Momentan versuche ich einiges in packages und records zu packen, um den
Überblick nicht zu verlieren und hänge hierbei:
-- will nicht, wäre aber sehr nützlich; casts wie positive()
22
-- hilft nicht.
23
constantLA_CONF_FIELD_WIDTH:positive
24
:=(num_sram_t'high)+(pcb_ver_t'high);
25
26
endla_pkg;
- wie kann ich im Nachhinein die Größe des Vectors bestimmen von
selbstdefinierten typen?
- wie kann ich attribute wie length zB für num_sram_t implementieren
1
packagebodyla_pkgis
2
attributelengthofnum_sram_t:is????
3
...
- der record soll an den I/O Port, wie kann ich die bitreihenfolge
absolut herausbekommen - entspricht die Reihenfolge der Typen einer
Bitfolge am Port anschliessend?
Ich wollte ungefähr so weiter machen:
da gibt's den Error:
Line 49. Type of . is incompatible with type of hw_conf_field.
Schade ist's auch, dass ich für machen records für in und welche für
out machen muss, da beides nicht in einem geht.
Viele Grüße
Olaf
mit Line 137. Selector (Constant 'vec' of type std_logic_vector) is
an unconstrained array.
Tja, wie bekommt man das hin? mit to_integer(vec) gibt's:
Line 137. to_integer can not have such operands in this context.
Viele Grüße
Olaf
Er macht das schon ganz ordentlich - hat einen Fehler: Er zählt zB.
einen hit mit einer clk cycle Länge nicht - konsequenter Weise steht
der m_hitcount bei zwei clk cycle Länge bei eins; zählt also immer eins
zuwenig. Das ist aufgrund des synchronen Designs, wie ich ihn aber zum
"richtig zählen" überzeugen kann, ist mir noch ein Rätsel. Auch der
work-arround für hit_length /= ZERO ist etwas hässlich. Hat jemand Rat
und Lösung?
Viele Grüße
Olaf
OK, für folgende Probleme habe ich noch keine Lösung:
* [http://www.mikrocontroller.net/forum/read-9-234597.html#241016
hitlength]
* [http://www.mikrocontroller.net/forum/read-9-234597.html#241453 vhdl
configuration]
Ganz neu: internes sram timing eines xc2s... Das schreiben und lesen
des blockrams klappt schon recht gut. Allerdings werden alle Aktionen
auf rising_edge ausgeführt. Das hat zur Folge, das ich (ich vermute es
mal) einen Takt später auch "ein" schreibe, und man kann es im TB
auch sehen, beim Auslesen meine Daten einen Takt später bekomme.
Sehe ich mir das Timing Modell im Datenblatt
[http://direct.xilinx.com/bvdocs/publications/ds001.pdf S.35] an, so
muss/sollte die Adresse vor rising edge anliegen damit spätestens zu
fallend Flanke die Daten von der Adresse anliegen. Dies ist derzeit
nicht der Fall.
So, nun die Frage dazu: Handel ich mir damit Ärger ein, da der ram
nicht registered ist? Auf rising/falling edge irgendwelche Aktionen zu
machen, wurde irgendwo hier im Forum als kontraproduktiv eingestuft.
Wäre eine neg. clock Signal => clk180 und rising edge darauf eine
Hilfe? Was macht man wie kleverer Weise?
Nachfolgend der Anfang einer Schreib- und Lesesequenz. Man beachte, ich
schreibe (hoffentlich) auf Adr. 0x00 den Wert 0xFFD3 und lese dann bei
0x00 0x16E8 (wo immer die her kommen mögen), welches imo irgendwelcher
Datenmüll ist (Erklärung/Lösung gesucht) und auf dem nachfolgenden
rising_edge meine 0xFFD3 wieder - eben 1 clk cylce verzögert.
Viele Grüße
Olaf
für folgende Probleme habe ich noch immer keine Lösung:
* [http://www.mikrocontroller.net/forum/read-9-234597.html#241016
hitlength]
* [http://www.mikrocontroller.net/forum/read-9-234597.html#241453 vhdl
configuration]
Inzwischen bin ich wegen der sram Ansteuerung (Timing) in der 6 Version
angekommen, mit der FSM ist evtl. doch gar nicht so schlecht, erspare
ich mir den mux/demuxer und die Kopfstände innerhalb der fsm wegen der
Ansteuerung dieser.
Kurz zum Prinzip: XC2S100 hat 40.960 bit.
- Speicher organisiert zu 512x80 (infering z.Zt., using blockram hat
noch einen nebensächlichen bug derzeit)
- Sampels bestehen aus 10 bit timestamp und den eigentlichen Samples zu
16bit; allg. unter dem Term "samples" desweiteren benutzt
- somit passen in die 80 bit 3 sample tuple, diese werden in der fsm
eingeschrieben.
- ausgelesen werden diese 80 bit byte weise durch die fsm.
- kont. Schreiben in den Ringbuffer (noch zu implementieren)
- bei aquire Startaddr. merken und bis zu x% Vorgeschichte
vollschreiben (noch zu implementieren)
Problem:
- Beim Auslesen fehlt das erste Byte. Keine Idee, wie ich
sinnvollerweise da ran kommen, habe schon einen 'pre'-state rd_state
vor den eigentlichen rd_b{0-11}_state gesetzt, ein weiterer sollte an
sich nicht nötig sein. Evtl. schreibe ich aber in das erste Byte Mist,
aber eher unwahrscheinlich durch die (2+8) byte des Timestamps.
- Warning mit unbekannter Ursache:
# run this TB 32 us!** Warning: There is an
'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will
be 'X'(es).
# Time: 16040 ns Iteration: 1 Instance: /tb_sample_ram/dut/fsm
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an
arithmetic operand, the result will be 'X'(es).
# Time: 16040 ns Iteration: 2 Instance: /tb_sample_ram/dut/fsm
Sonstiges:
- Hinweise für den Aquire Mode?
Viele Grüße
Olaf
Hi Ope,
was erwartest du denn?
ein LA ist etwas dass aller gerne haben mochten, ofr frei oder
supergunstig. ein LA ipcore zu entickeln ist eigentlich kein grosseres
problem. auch die auswertung software ist nicht so schwer. und die
firmware kommunikation ist auch nichts schweres. aber das bedeutet noch
langst nicht das es so einfach ist ein 'einfaches und benutzbares
produkt' fertig zu kriegen :( lettzendlich muss jemand die handbucher
usw weiteres auch erledigen und das ist für ide hardcore entwickler
extrem langweilig.
ICH bin SEHR interessiert an LA, oder besser im OCI (On Chip
Instrumenation), dh LA inside FPGA, mess funktionenn in FPGA und mit
FPGA, aber dieses projekt hier, well... etwas fehlt. etwas fehlt um
wirklich erfolgreich zu sein.
erstens es gibt kein richtiges ziel.
falls das ziel ist unter 100EUR ein LA zu bauen denn die beste loesung
ware USB powered XC3S100E evalikit als 'basis' zu benutzen, es koster
69USD un hat 50 poliges stecker drauf. da kann mann adapter module haben
fur comparator und zusats speicher, etc.. basis system (evalkit +
adapter platine) bleibt immerhin unter 100EUR.
falls das ziel ist etwas gutes zu machen, dann sollte mann die besten
komponent aussuchen die man noch kriegt ohne ZILLION zu bezahlen. und
dann sollte man das preis ausrechnen was d sich ergibt.
FPGA is eigentlich billig und kommt immer billiger. mit low cost
FPGA's kann man LA mit sampling rate um 1GS/S machen. low speed grade
S3 geht bis mindestens 900MS/S (ich habe selber gemessesn clock speed
von etwa 470MHz in s3 fabric.)
was teuer ist ist schnelles speicher. das sollte man nicht sparen und
72 bit ZBTRAM benutzen.
und... LA und DSO sind sehr ahnlich so das man DSO funktionalitat auch
gleich mitbringen sollte. NI hat gerade 2GS/S ADC heraus gebracht. klar
die sind schweineteuer. aber ein high speed ADC add board interface furs
DSO funktionalitat sollte schon da sein.
es ist moeglich mit kommerzíellen herstellen zu konkurieren, mann
sollte einfach keine angst haben, und hoch traumend
antti
meine private seite :) w w w truedream o r g
mann sollte traumen, und richtig! und dann was davon auch verwirklichen
naturlich ;)
PS fur LA project macht KEIN sinn gleich eine PCB zu entwickeln, nicht
gleich noetig. es gibt haufen mengen von platinen mit FPGA und JTAG
konnektor, die alle sind potentialle platforme furs LA. es ware viel
mehr besser anfangs ALLE FPGA platinen zu unterstutzen uber JTAG, die
software un ipcores fertig und testen, und DANACH eigen hw entwickeln.
mmh, das mag ja alles richtig sein, aber wie soll ich dieses
vollbringen, wenn ich noch nicht einmal weiss, warum mein vhdl code
nicht das macht, was er soll. Soll heissen: Der Teufel liegt im
Detail.
Dennoch Danke für Deine Hinweise. Das DSO Feature wurde zB. wegen dem
Teufelchen gecancelt.
Viele Grüße
Olaf
Hallo,
wie ich vorher auch schon schrieb, habe ich sehr wohl noch Interesse an
diesem Projekt. Nach anfänglicher Begeisterung scheinen aber nicht mehr
viele übrig geblieben zu sein, was schade ist. Vor allem scheint die
überwiegende Arbeit an Olaf und möglicherweise ein, zwei anderen
Aktiven zu hängen. Entweder haben die übrigen, die kompetent genug
wären, keinen Bock mehr drauf, oder das Ganze ist eben doch ein wenig
anspruchsvoller, als es viele in ihrer ersten Euphorie geglaubt haben.
Was mich betrifft, ich habe absolut keine Ahnung von FPGAs oder CPLDs,
als "Wald- und Wiesenelektroniker" hatte ich damit weder privat noch
beruflich zu tun.
Sollte das Projekt dennoch fertig gestellt werden, und es wird Hilfe
bei der Erstellung einer Doku gebraucht (was sicherlich erst ganz am
Ende des Projektes wichtig werden wird), stelle ich mich gern zur
Verfügung. Fachkenntnisse sowie ein halbwegs fehlerfreies Deutsch kann
ich immerhin bieten. :) Zumal eine gute Doku zu erstellen nicht
langweilig ist.
Gruß,
Andreas
Hallo,
Ich verfolge das ganze schon eine Weile und haette auch
Interesse an dem Geraet. Allerdings kann ich weder in
Sachen FPGA-Design noch bei der Eingangsstufe richtig
was beitragen (und da sehe ich die meiste Arbeit). Falls
ihr 2 seitige Musterplatinen braucht und die nicht allzu
gross sind könnte ich vielleicht helfen, einfach mal
melden wenn es soweit ist. Uebrigens habe ich den Schwenk
vom PLD zum FPGA nicht so ganz mitbekommen, gab es da
eine entsprechende Diskussion die ich uebersehen habe?
Jens
Hallo,
wir haben uns auf einen FPGA geeinigt damit wir den internen Blockram
nutzen koennen und somit kein externes Sram benoetigen. Der FPGA
vereinfacht sehr das Layout.
Das schlimmste ist nur das benoetigte Teile schwer o. garnicht
zubeschaffen sind fuer Normalsterbliche.
Im Moment haenge ich ein bischen fest, weil ich gerne das ganze Geraet
Bus Powered am Usb betreiben moechte. Leider liefert USB keine 5V
sondern diese schwankt zwischen 5,2V - 4,4V laut USB Spec..
Um jetzt eine konstante Spannung von 5V zuerhalten benoetigt man einen
StepUpDown Wandler.
Bei diesen Wandler besteht das Problem das man keinen findet der bei
Reichelt und Co zukaufen ist.
Langsam muss ich aber einen Kompromiss finden und werde wohl oder
uebel um eine externe Versorgungsspannung nicht herumkommen dadurch
wird die Platine wieder um einiges groesser.
Gruß,
Dirk
Also ich lese auch mit grossem Interesse, ich schließe mich meinem
Vorredner an: Die FPGA-Geschicht, VHDL usw. ist dass, was ich nicht
checke und ich schätze, es geht vielen so.
Zum letzten Thema, Spannungsversorgung ? Da kann es doch nicht dran
hapern. Regler rein, Buchse drauf, externes Netzeil fertig.
Hier wundere ich mich, dass das überhaupt eine Frage wird.
Bei einem grösserem Projekt muss man dem die Einzelaufgaben geben, der
sich damit auskennt. Und bei VHDL und FPGA, wird es nicht so viele
geben.
>Uebrigens habe ich den Schwenk>vom PLD zum FPGA nicht so ganz mitbekommen, gab es da>eine entsprechende Diskussion die ich uebersehen habe?
Ja, dieser Wandel kam still und leise, ich hatte es auch mal beiläufig
in irgendeinenen Thread hier erwähnt. Hauptgund: AVR+CPLD+SRAM kommt
auf Euro Format. Vom XC2S100 versprechen wir uns nun die schon besagte
Zigarettenschachtelgröße ;-) Leider hat er nur 40kbit intern,
entsprechend muss man diesen gut organisieren (s.o.) und damit fangen
die Probleme an.
Viele Grüße
Olaf
Was wollt Ihr eigentlich noch mit 5V? Nehmt einen modernen Chip, der
läuft mit 3,3V.
Dann noch von Xilinx einen Virtex-4LX200, oder von Altera einen
CycloneII-EP1C3, dürfte das ganze Gerät machbar machen. Schnelles RAM
kann man sich auch in diese Chips hineinprogrammieren.
Allerdings wird dann der kleine, putzige Atmel arbeitslos... ;-)
Stephan.
;) witzigman!
I habe den preis von LX200 nicht, aber das ist der grosste von Xilinx.
und den preis von den grossten stratix weiss ich, nahmlich runde 9,000
USD. LX200 schatze is auf jeden fall auch 5,000++
EP1 ist alternative aber cyclone 2 ist jedoch preiswertiger.
mit uralten 5V bausteinen sollte man heute NICHT mehr spielen, sei den
es handelt sich um eine fertige platine.
--
Ich habe gerade das eebit FPGA logic analazer ins VHDL translier und
zusammen mit PCI-LPT IP core in Xilinx FPGA geladen. Den original
source code für die auswerung software habe ich auch kompiliert, war
gar nicht so schwierig.
dh heisst ich habe ein LA fast fertig. in null komma nichts. :)
antti
danke Stephan!
I habe
FPGA programmier in PCI slot, und kann die LA registers lesen.
die PCI inerface emuliert den LPT so das es kenne treiber noetig sind
und die LA register sind kompatible zu dem eebit design.
noch nich alles funktionier ein paar module sind noch leere
hullen aber as ist wirklich 'piece of cake' das auch fertig
zu kriegen. aber das spater heute, jetzt is schon 00:51 :)
antti
FERTIG.
Software und FPGA beide O.K.
screenshot ist von FPGA in PCI slot, eingang ist ein counter als test
pattern. FPGA ist Virtex2 2000, als speicher 8 bit x 64,000 samples.
Der design baisert auf den eebit 'parallel port'
version die original software kann man fast direkt benutzen.
die Altera schematics wurde ins VHDL transliert und mit
einem PCI - LPT IP core verbunden so das ganze gerat
als LPT anerkannt wird, so das man keine windows treiber braucht.
naturlich wurde es auch am richtigen printer port arbeiten oder
mit irgenwas anderes interface wenn man die software andert.
:)
Antti
Hallo Antti,
das sieht ja wirklich gut aus!
Wie schnell ist das gute Stück denn ?
Was hat deine Software für Triggermöglichkeiten und co. ?
Grüße,
Patrick
Danke.
die hardware ist register compatible zu dem eebit design und
dieselbe software kann fast direct benutzt werden.
Es gibt haufen mengen moeglichkeiten das ganze zu verbessern.
meine test system habe ich auf einer PCI FPGA karte getestet
und auch das PCI clock als sampling clock benutzt.
Wie schnell kann man nicht antworten. In prinzip sollte es
relative leicht sein etwas uber 200MHz in low cost FPGAs zu
schaffen. Mit ein bishen mehr muhe sollten sampling rates
von circa 900MS/s in low cost PFGA (Spartan-2 zb) moeglich
sein in high end FPGAs etwas uber 1G/S. Das braucht aber
ein bishen anderungen :)
Antti
Mal ein anderes Problem:
Ich habe 3 verschiedene Quellen Q0...Q2 (konkret Trigger), die unter
verschiedenen/bestimmten Bedingungen ein Signal abgeben, dass die
Bedingung erfüllt ist. Nun möchte ich diese Quellen kombinatorisch
vernüpfen, womit sich formal 9 Möglichkeiten ergeben, die jeweils durch
and/or/xor/not vernüpft werden können.
Konkret habe ich also die 3 Signale der Quellen, tja - und jetzt finde
ich keine einfache Lösung: Ein Register enthält eine Art Vektor 0...8,
der auf die Komb. der der Quellen zeigt (dispatched per case ...), ein
weiteres Register die Komb. and/or/xor/not. Letzlich eine einfache,
wenn auch starre Lösung.
Es kann aber auch möglich sein, (Q0 and Q1) or (not Q2) oder einfach
nur not Q0 bzw. Q0 - da wird diese Lösung kompliziert. Wer liefert
weitere Möglichkeiten, evtl. gleich mit VHDL Example?
Viele Grüße
Olaf
PS: Bin gerade am verkabeln der Entities, das Problem mit
http://www.mikrocontroller.net/forum/read-9-262347.html#new steht noch
immer.
in Xilinx FPGA kann man ein beliebiges funktion von 4 eingangen in einem
LUT implementieren, die LUT content kann auch der benutzer laden wenn
man den slice als SRL16 verwendet, so das man fur LA trigger kann man 4
eingange trigger match in einem LUT oder 2 eingange in einem LUT falls
die flanken auch dabei sind
antti
einfach ein SRL16, nichts weiteres :)
hat 4 eingange und einen ausgang,
kann als 4 eingang LUT benutzt werden,
den LUT content kan man serial einschieben
alles einfach!
Antti
evtl. doch mit einem 'Combine'-Vektor? Allerdings gibt es für die
Verknüpfungen einen (2^3) und für die logischen Verknüpfungen auch noch
mal einen (xor, and, or, not 2^4) Vektor. Das schreiben macht dann auch
keinen Spass mehr, da viele case zu handeln sind. Ich hatte gehofft,
etwas mit einer Art Maske oder Ähnlichen als Lösung zu finden - komme
nur nicht 'drauf.
Viele Grüße
Olaf
ah es ist moeglich eine ding zu machen die ein paar generics hat
und dann furs alle familien einen generate durchfurt
so das man alles frei parametrierbar kann
wenn du selber nicht weiter kannst dann lade isplever runter
da ist irgendo ein program encode.exe
mit dieser programs kann mann lava.enc datei offnen
das den quellcode von lattice ispTRACY logic analyzer enthalt
viel spass
Antti
PS ich habe schon 2 verschieden VOLL funktionerende FPGA logic
analyzer loesungen, was machst du dennn da? alles furs spass nur?
gut, der erste wird wohl der auf ebay bzw. shop.openchip.org gegen Bares
sein. Der zweite besagter ispTRACY. Kannst Du nicht mit encode.exe und
lava.enc den ispTRACY encoden? Ich möchte nur ungern 800MB für den
ispLever reservieren, nur um ihn anschliessend wieder zu deinstallieren
um dann festzustellen, das mein Windows zerschossen ist.
Viele Grüße
Olaf
eigentlich antworte ich doch, aber, hmm wenn jemand einfach faul ist da
ist meine gegeisterung zu helfen auch minimal. Antworte habe ich ja
gegeben, aber ich wurde gebeten einen befehl auf meinem PC auszuführen
und dann ein datei zu schicken - und da nach ein bishen gedanken wurde
ich mich lieber zuruckhalten, eventuell konnte man ja sagen das es
irgenwelche urheberrechte verletzt. Wenn man das auf eigenen PC mach
ist es eine sache, aber weiterzugeben nicht so gut.
Grusse
Antti
PS in dem ebuch (8.30 EUR) da ist eigentlich fast nix nur gute
erklarung wie man 2 verschieden open-source logic analyzer design zum
leben bringt. die original designs sind im web frei verfugbar, aber..
die zeit die man damit auf eige faust totschlagen muss ist >2 tage so
dass das ebuch sich doch lohnen sollte.
> Ich möchte nur ungern 800MB für den ispLever reservieren, nur um ihn> anschliessend wieder zu deinstallieren um dann festzustellen, das> mein Windows zerschossen ist.
Nun ja, es ist schon eine gewisse Art von Faulheit. Mein Windoze ist
gut configuriert, das möchte ich nicht mal eben so platt machen. Zumal
ich nicht weiss, dass ich dort das finde, was ich suche (s.o.). Mal
abgesehen davon habe ich den Platz gar nicht (ich platze aus allen
Nähten =).
Aber wieder zurück zum Thema:
Synthese klappt nicht: Ich bekomme von xst die ober-schlaue Error
Meldung:
Type of i is incompatible with type of ..
von
guter ratschlag fur VHDL: verwende NUR std_logic und std_logic_vector da
ist es meistens immer sicher was rauskommt.
antti
tut mir leid deine festplatte, und vielleicht hatte ich ein email auch
rausgeschickt aber habe deine email nicht gefunden :(
offenbar kann ich mir auf die Schulter klopfen - ich habe bzgl. dem tlc
Problem von oben einen bug in den xst gefunden. Packe ich den process
in eine entity - na ratet mal - klappt es.
Nicht sehr Vertauen erweckend. Offenbar muss man wie bei den C/C++
Compilern immer mehrere Synthese Tools zur Hand haben. Was nehme ich
nur? Quartus oder ispLever?
Viele Grüße
Olaf
mhh, London, coole Stadt ;-)
Momentan ist der XC2S100 bzw. XC2S200 (prefered)
(http://direct.xilinx.com/bvdocs/publications/ds001.pdf)
"state-of-the-art". Speicher ist 40k bzw 56k, wobei nur
Sampleänderungen abgespeichert werden um den Blockram (echter interner
RAM) besser ausnützen zu können. Yep, er ist veraltet etc., aber
verfügbar und im TQ144 oder PQ208 (prefered, da derzeitig bestellbar)
verhältnissmäßig preiswert zu bekommen. Siehe auch
http://www.mikrocontroller.net/forum/read-1-204570.html#new.
Z.Zt. bastel ich die einzelnen Entities zusammen und prüfe auf
Synthesefähigkeit, vereinfache und fasse signale zusammen. Aktuell ist
SPI zur Kommunikation vorgesehen, den Anschluss FPGA/SPI übernimmt dann
ein ARM (SAM7), da er billiger wird als ein FTDI. Auch ermöglicht er
einige Features wie Kompression u.a.
Als PC Frontend favorisere ich C++ und FoxToolkit, bin aber über die
Installation von mingw/msys noch nicht hiaus gekommen. Win32 Programing
ist für mich neu (endlich mal wieder etwas Neues nach VHDL).
Viele Grüße
Olaf
Machst Du neben der Hardwareentwicklung auch noch die Software?
FoxToolkit? Hm ... ich kenne einige Frontends, aber davon habe ich noch
nie gehört. Wie bist Du darauf gekommen?
Gruß,
Andreas
http://www.fox-toolkit.orghttp://wiki.wxwidgets.org/wiki.pl?WxWidgets_Compared_To_Other_Toolkitshttp://lists.trolltech.com/qt-interest/2002-06/msg01202.html
Für C++ ist imo WxWindows, Qt und eben Fox-Toolkit interessant.
WxWindows/WxWidgets hat Altlasten, die gehen bis Win 3.1 zurück, Qt
behagt mir die Geschichte mit den Moc Compiler nicht; auch wenn ich mit
Qt bereits (gute) Erfahrung habe, aber die neue Politik unter Windows
behagt mir nicht - der wird der Compiler vorgeschrieben, aber man wird
mit dem mingw alleine gelassen. Von der Seite her gibt's für mich
keinen Grund unbedingt Qt nehmen zu müssen. FLTK und Gtk lasse ich mal
ganz aussen vor.
Auch sollen viele Dinge in Fox besser gelöst sein, allerdings ist diese
auch jünger, so dass wohl auch einige GUI Klassen geschrieben werden
müssen. Mal sehen, ob sich Cairo
(http://cairographics.org/introduction) einbinden lässt, dann hätte man
gleich PDF Wave Plot Export prints und bessere Screen Graphic (kann aber
auch Overkill sein). Jedoch sind diese Aussagen eben ungeprüft.
Werde demnächst einen Thread unter PC Programmierung eröffnen müssen,
mal sehen, wer alles mit proggen möchte. Bis alles funktioniert, kann
man ja mit dummy Daten testen - bis alles richtig funktioniert, vergeht
eh noch etwas Zeit. Evtl. lohnt sich ja ein Projekt unter sourceforge
wegen dem cvs. Zumindest sollte es einen Grundkonsens finden um nicht
für jedes LA Projekt (alleine im Forum hier sheint es mind. 3
verschiedene Ansätze zu geben) ein neues Frontend entwerfen zu müssen
(Trennung Kommunikation/Daten und ihre Darstellung); Sprich die
klassischen OO Paradigmen.
Sicher gibt's tausende Gründe andere Sprachen zu nehmen, aber der es
programmiert sollte die Entscheidung treffen - es aber auch bis zu Ende
führen.
Derzeit bekomme ich unter mingw fox nicht als dll compiliert, scheint
ein Win32 Problem zu sein (progge selbst iA. unter unix und linux).
Viele Grüße
Olaf
#offenbar kann ich mir auf die Schulter klopfen - ich habe bzgl. dem
tlc
#Problem von oben einen bug in den xst gefunden. Packe ich den process
#in eine entity - na ratet mal - klappt es.
IMHO ist es kein problem vom xst sondern von der unsigned Bibliothek.
Wahrscheinlich steht vor der entity in der du den prozess gepackt hast
ander
use anweisungen als vor der package in der das record steht. Und in den
Bibliotheken die du verwendest wird mehrmals unsigned definiert. Damit
ist
scheinen zwar zwei Signale/Variabken vom gleichen Typ (nämlich
unsigned) zusein. Wenn aber dieses Unsigned unterschiedlich definiert
ist (weil in verschiedenen benutzen Bibliotheken mehrmals) da sind die
beiden Variablen von versch. Typ obwohl beise unsigned heissen. Also
immer nur eine Bibliothek verwenden in der unsigned vorkommt.