Hallo zusammen,
ich habe eine Frage an euch VHDL-Experten :-)
Der folgende Programmcode verhält sich mit Lattice Diamond synthetisiert
(Synplify Pro) und aktivierter VHDL2008 Option anders als von mir
erwartet und anders als in der Simulation mit ActiveHDL - meine
Erwartung stimmt mit der Simulation überein. Dabei verwende ich die
numeric Bibliothek.
Alles sind voll einsynchronisierte Signale, von daher sind
Metastabilitäten kein Thema.
Folgender Programcode funktioniert NICHT wie gewünscht:
-------------------------------------------------------
1 | SIGNAL channel : std_logic_vector( 2 downto 0);
|
2 | SIGNAL finishedVector : std_logic_vector(10 downto 0);
|
3 |
|
4 | PROCESS (clk)
|
5 | IF (rising_edge(clk)) THEN
|
6 | ...
|
7 | IF (x = '1') THEN
|
8 | -- Event greift, Setzen des entsprechenden Bits im std_logic_vector
|
9 | finishedVector(to_integer(unsigned(channel & '1'))) <= '1';
|
In der Simulation macht der Code genau das was ich erwarte, auf dem
realen Target wird dies nicht wie erwartet synthetisiert, was sich unter
anderem auch in den Synplify-LOGs zeigt:
@N: CL189 :"channels.vhd":512:8:512:9|Register bit finishedVector(10) is
always 0.
@N: CL189 :"channels.vhd":512:8:512:9|Register bit finishedVector(9) is
always 0.
...
@N: CL189 :"channels.vhd":512:8:512:9|Register bit finishedVector(0) is
always 0.
Ich verstehe nicht, was an der Zuweisung nicht passt bzw. warum die
Synthese alle Bits des Vektors "finishedVector" fix auf 0 setzt.
Eine kleine Erweiterung und der Abfrage eines expliziten Bits inklusive
zugehöriger Zuweisung bringt die Verbesserung.
Folgender Programcode funktioniert wie gewünscht (OK):
------------------------------------------------------
1 | SIGNAL channel : std_logic_vector( 3 downto 0);
|
2 | SIGNAL finishedVector : std_logic_vector(10 downto 0);
|
3 |
|
4 | PROCESS (clk)
|
5 | VARIABLE index : integer; -- Zeile neu hinzugefügt
|
6 | IF (rising_edge(clk)) THEN
|
7 | ...
|
8 | IF (x = '1') THEN
|
9 | -- Event greift, Setzen des entsprechenden Bits im std_logic_vector
|
10 | index := to_integer(unsigned(channel & '1'));
|
11 | IF (index = 5) THEN
|
12 | finishedVector(5) <= '1';
|
13 | END IF;
|
Die Warnung in den Synplify-LOGs für finishedVector(5) ist weg und der
Code funktioniert auf dem Target für dieses Bit wie gewünscht.
Daher die Frage an euch, was ist in der obigen Zuweisung fehlerhaft bzw.
wie müsste sie geschrieben werden, damit sie wie gewünscht synthetisiert
wird?
Ich hätte erwartet, dass die direkte Zuweisung
slv(to_integer(unsigned(slv))) <= '1'; ebenso funktioniert wie slv(5) <=
'1';
Ich freue mich über eure Rückmeldungen und vielleicht liest es auch
Lothar Miller :-)