Hallo!
Ich hab noch nicht so die Erfahrung in VHDL und wollte fragen, ob es
möglich wäre eine Art VCO in VHDL zu schreiben?!
Und zwar soll der mit zwei Signalen angesteuert werden: Up und Down.
Daraus wird dann die Anfangsfrequenz erhöht oder verlangsamt.
Je länger eines der Signale anliegt, desto schneller bzw. langsamer wird
der Takt. Da das Modul keinen Takteingang hat, wollte ich nun gerne
wissen wie man das realisieren kann. Das Modul soll nicht
synthetisierbar sein sondern nur für ne Testbench herhalten.
Ich stelle mit das in etwa so vor:
1
entityvcois
2
port(
3
up:instd_logic;
4
down:instd_logic;
5
clk_out:outstd_logic
6
);
7
endvco;
8
9
architectureBehavioralofvcois
10
11
constantclk_period:time:=6.25ps;
12
13
begin
14
15
clk_process:process
16
begin
17
clk_out<='0';
18
waitfor(clk_period+c_delta)/2;
19
clk_out<='1';
20
waitfor(clk_period+c_delta)/2;
21
endprocess;
22
23
endBehavioral;
Hier fehlt noch die Variable c_delta, mit der der Takt verändert wird.
Was für einen Datentyp kann ich da nehmen und wie "messe" ich wie lange
ein Signal anliegt?
Vielen Dank im Vorraus!
@ Erdin (Gast)
>möglich wäre eine Art VCO in VHDL zu schreiben?!
Das nennst sich NCO, numeric controlled oscillator
Siehe DDS.
>Und zwar soll der mit zwei Signalen angesteuert werden: Up und Down.>Daraus wird dann die Anfangsfrequenz erhöht oder verlangsamt.
Das amcht man mit einem UP/DOWN Counter. Der Steuert dann die DDS.
>Je länger eines der Signale anliegt, desto schneller bzw. langsamer wird>der Takt. Da das Modul keinen Takteingang hat,
Brauchst du aber. Punkt! Kann man ja in der Simualtion auch intern
erzeugen.
MFG
Falk
Vielleicht hab ich mich nicht richtig ausgedrückt...
Ich brauche ja ne Variable, welche ich je nach Signal in oder
dekrementiere. Diese Variable muss also auch negative Werte annehmen
können, dementsprechend wäre ein std_logic_vector nicht angebracht. Was
für einen Typ kann ich nehmen, um mir Konversionen zu ersparen?
> Beim Vektor muss ich aber die Breite festlegen...
Nimm einen Integer.
> Beim Vektor muss ich aber die Breite festlegen...
Aber auf irgendwas wirst du dich schon irgendwann mal festlegen
müssen. Es ist allemal besser, du selbst legst die Vektorbreite fest,
als dass das der Synthesizer für dich tut, und du dich nur wunderst.
Es soll nicht synthetisierbar sein, sondern nur in der Simulation
funktionieren.
Jetzt hab ichs so gemacht, aber ich bekomme Fehler:
1
entityvcois
2
port(
3
up:instd_logic;
4
down:instd_logic;
5
clk_out:outstd_logic
6
);
7
endvco;
8
9
architectureBehavioralofvcois
10
11
constantclk_period:time:=6.25ps;
12
variablec_delta:time:=0ps;
13
14
begin
15
16
clk_process:process
17
begin
18
clk_out<='0';
19
waitfor(clk_period+c_delta)/2;
20
clk_out<='1';
21
waitfor(clk_period+c_delta)/2;
22
endprocess;
23
24
process(clk_out)
25
begin
26
if(clk_out'eventANDclk_out='1')then
27
if(up='1'ANDdown='0')then
28
c_delta<=c_delta-1;
29
endif;
30
if(up='0'ANDdown='1')then
31
c_delta<=c_delta+1;
32
endif;
33
endif;
34
endprocess;
35
36
endBehavioral;
ERROR:HDLParsers:3345 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
41. Only SHARED variables can be declared here.
ERROR:HDLParsers:1015 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
48. Wait for statement unsupported.
ERROR:HDLParsers:1015 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
50. Wait for statement unsupported.
ERROR:HDLParsers:1401 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
53. Object clk_out of mode OUT can not be read.
ERROR:HDLParsers:808 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
57. - can not have such operands in this context.
ERROR:HDLParsers:808 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
60. + can not have such operands in this context.
ERROR:HDLParsers:1413 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
55. Attribute event of output object clk_out can not be read.
ERROR:HDLParsers:1401 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
55. Object clk_out of mode OUT can not be read.
WARNING:HDLParsers:1406 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
53. No sensitivity list and no wait in the process
Ok... Out kann ich drin nicht verwenden. Änder ich schon. Aber wie kann
ich denn den Takt verändern wenn ich die Periode durch Addition und
Subtraktion verändern kann?
> Only SHARED variables can be declared here.
Variablen können nur in Prozessen deklariert werden.
> c_delta <= c_delta - 1;
Du kennst offenbar nocht nicht die strenge Typprüfung in VHDL? Du kannst
nicht einen Integer (1) auf eine Zeit (c_delta) summieren.
So ginge das, allerdings mußt du ein wenig aufpassen, dass deine Zeiten
nicht negativ werden:
c_delta <= c_delta - 1 ps;
> Wait for statement unsupported.
Unsupported?
Du willst das Konstrukt da oben doch nicht etwa synthetisieren?
> ERROR:HDLParsers:3345 - ... Line 41.
BTW: ich hätte da eher die Zeile 42 vermutet ;-)
Lothar Miller schrieb:>> Only SHARED variables can be declared here.> Variablen können nur in Prozessen deklariert werden.>
Ist die Variable dann global oder wird die bei jedem Aufruf wieder neu
gesetzt?
> So ginge das, allerdings mußt du ein wenig aufpassen, dass deine Zeiten> nicht negativ werden:> c_delta <= c_delta - 1 ps;
Du meinst meine gesamte Zeit für eine Periode darf dann nicht negativ
werden... c_delta soll ja auch negativ werden, sonst klappt ja das
Erhöhen des Taktes nicht.
>> Wait for statement unsupported.> Unsupported?> Du willst das Konstrukt da oben doch nicht etwa synthetisieren?
Eigentlich hab ich nur die Syntax prüfen lassen. Ich will dieses Modell
in einer Timingsimulation verwenden. Klappt das überhaupt?
>> ERROR:HDLParsers:3345 - ... Line 41.> BTW: ich hätte da eher die Zeile 42 vermutet ;-)
Ich auch =D !
Erdin schrieb:> Ist die Variable dann global oder wird die bei jedem Aufruf wieder neu> gesetzt?
Es kommt darauf an, wie du die Variable verwendest. Variablen in
Prozessen behalten ihren Wert. Du kannst sie also auch lesen, bevor sie
geschrieben wird. Sie hat dann den zuletzt zugewiesenen Wert.
> Ich will dieses Modell in einer Timingsimulation verwenden.> Klappt das überhaupt?
Nur als Testbench.
Lothar Miller schrieb:>> Ich will dieses Modell in einer Timingsimulation verwenden.>> Klappt das überhaupt?> Nur als Testbench.
Also kann ich das in einer Testbench instanziieren und gut?
Habs jetzt so:
1
entityvcois
2
port(
3
up:instd_logic;
4
down:instd_logic;
5
clk_out:outstd_logic
6
);
7
endvco;
8
9
architectureBehavioralofvcois
10
11
constantclk_period:time:=6.25ps;
12
sharedvariablec_delta:time:=0ps;
13
14
signalclk:std_logic;
15
16
begin
17
18
clk_out<=clk;
19
20
clk_process:process
21
begin
22
clk<='0';
23
waitfor(clk_period+c_delta)/2;
24
clk<='1';
25
waitfor(clk_period+c_delta)/2;
26
endprocess;
27
28
process(clk)
29
begin
30
if(clk'eventANDclk='1')then
31
if(up='1'ANDdown='0')then
32
c_delta<=c_delta-10ns;
33
endif;
34
if(up='0'ANDdown='1')then
35
c_delta<=c_delta+10ns;
36
endif;
37
endif;
38
endprocess;
39
40
endBehavioral;
Da krieg ich aber immer noch folgende Fehler:
ERROR:HDLParsers:1015 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
52. Wait for statement unsupported.
ERROR:HDLParsers:1015 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
54. Wait for statement unsupported.
ERROR:HDLParsers:410 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
61. Variable 'c_delta' c_delta is at left hand side of signal assignment
statement.
ERROR:HDLParsers:410 -
"Z:/ziti.uni-heidelberg.de/home/esinanovic/esinanovic/CDR/vco.vhd" Line
64. Variable 'c_delta' c_delta is at left hand side of signal assignment
statement.
Was bedeuten vor allem die letzten zwei? Versteh ich net...
> Da krieg ich aber immer noch folgende Fehler:
Aber sicher nicht mit einem Simulator.
> Variable 'c_delta' c_delta is at left hand side of signal assignment> statement.
Zuweisungen an Variablen gehen mit := (Doppelpunkt Gleich)
Das ist vermutlich mit shared Variablen auch so...
Ich hab die Syntax mit ISE überprüft. Deswegen kommen die Fehler
höchstwahrscheinlich.
Ich frage mich jetzt, wie ich nun dieses Modul in meine Timingsimulation
bekomme. Ich mein ich muss das ja irgendwie mit der simulierten Hardware
verbinden... Wenn ich das jetzt in mein Top-Modul instanziiere, dann
wird das ja synthetisiert(was ich ja nicht will)... Wie mach ich denn
das?
Hallo,
am besten du machst dich erstmal mit VHDL etwas mehr vertraut. Zum
simulieren kannst du Modelsim, VHDLsimili oder GHDL verwendne. Kann man
sich alles kostenlos herunterladen ...
Xilinx ISE oder Quartus als Simulationstool ist definitiv die falsche
Wahl.
mac4ever schrieb:> Xilinx ISE oder Quartus als Simulationstool ist definitiv die falsche> Wahl.
Na, nicht ganz.
Bei Xilinx kommt ISIM mit. Das ist bisher das einzige kostenlose Tool
was ich kenne, welches VHDL/Verilog mixed simulieren kann.
Wenn jemand Alternativen kennt, darf er die bitte gern hier nennen.
Duke
Weltbester FPGA Pongo schrieb im Beitrag #1870954:
> ModelSIM macht das nicht?
Bist du neu im Geschäft?
> ModelSIM macht das nicht?
Nicht in der kostenlosen Variante.
Man kann Verilog mitsimulieren, wenn man einen VHDL-Wrapper schreibt.
Ich bin mir aber bei der kostenlosen Variante auch nicht so sicher.
Verilog habe ich schon simuliert, aber ob es "mixed" geht, weiß ich
nicht mit Sicherheit.
Aber wer nutzt schon die kostenlose Variante ...
:-)
...
Zum "VCO":
Der Begriff "Voltage Controlled" macht bei FPGAs nicht so arg viel Sinn,
es sei denn, man instanziiert einen selbstlaufenden OSC über LUTs. Der
ist in der Tat (leicht) spannungsabhängig. Im Wesentlichen ist es aber
ein TCO.
Er eignet sich aber hervorragend für einen Zufallsgenerator, in dem man
einfach seinen Ausgang mit einem anderen statischen Takt aus einer PLL
absampelt. Das gibt 1 wirklich zufälliges Bit und perfektes Rauschen,
wenn man genügend Bits mit (ausreichend Sample-Distanz!!!)
zusammensetzt.
Einen NCO gibt es z.B. auf open source.org