Forum: FPGA, VHDL & Co. Xillinx ISE optmiert mir Leitungen weg!


von Wisler E. (wisler) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi Leute,

ich bin leider noch etwas neu auf dem Gebiet VHDL. Ich versuche gerade 
einen Pseudozufallsgenerator zu programmiern. Ich denke mein Code müsste 
auch soweit funktionineren nur tut mir der Kompiler immer die Leitungen 
weg optimieren. Er sagt sie würden nicht verwendet werden, aber ich habe 
sie immer in der PORT MAP verwendet. Ich versteh einfach net was ich 
falsch mache. :-(

So möchte ich hier gerne zwei Fragen stellen:

1.)
Hier sind mal die warnings die kommen:

WARNING:Xst:646 - Signal <s_intern<0>> is assigned but never used. This 
unconnected signal will be trimmed during the optimization process.
WARNING:Xst:1290 - Hierarchical block <N_1_Stufen[0].G0.G0> is 
unconnected in block <e_test_maschine>.
   It will be removed from the design.
WARNING:Xst:1290 - Hierarchical block <N_1_Stufen[1].GN_2.G0> is 
unconnected in block <e_test_maschine>.
   It will be removed from the design.
WARNING:Xst:1290 - Hierarchical block <N_1_Stufen[2].GN_2.G0> is 
unconnected in block <e_test_maschine>.
   It will be removed from the design.
WARNING:Xst:1290 - Hierarchical block <N_1_Stufen[3].GNN.G_0> is 
unconnected in block <e_test_maschine>.
   It will be removed from the design.


Ich werde den Code mal im Anhang einfügen. Leider führten meine 
bisherigen Ideen nicht zum Erfolg. Vielleicht weiß hier jemand warum die 
Leitungen wegoptmiert werden. Ich komme so leider nicht weiter :-(

2.) Vielleicht kann mir noch einer verraten, wie ich eine Konstante für 
alle Entitys deklarieren kann. So könnte ich dann mein Schieberigister 
und den Rest des Programms über eine Konstante steuern und bestimmen 
wieviele Bit es breit ist.

Ich danke schon mal fürs lesen.


Grüße Wisler

von Anguel S. (anguel)


Lesenswert?

Wisler Electronics schrieb:

> Ich denke mein Code müsste
> auch soweit funktionineren nur tut mir der Kompiler immer die Leitungen
> weg optimieren. Er sagt sie würden nicht verwendet werden, aber ich habe
> sie immer in der PORT MAP verwendet. Ich versteh einfach net was ich
> falsch mache. :-(

Die Tools sind einfach so intelligent, dass sie immer schauen, ob alle 
Signale tatsächlich genutzt werden. Wenn sie nicht verbunden oder 
konstant sind, werden sie wegoptimiert, um Ressourcen zu sparen. In 
99,9% der Fälle tun die Tools das richtige wenn man sich alles genau 
anschaut.

Grüße,
Anguel

von Georg A. (Gast)


Lesenswert?

Die erste Warning ist offensichtlich zutreffend. Bei den anderen nehme 
ich stark an, dass da in der Generate-Wüste irgendein Index-Offset 
falsch ist, bin jetzt zu faul, das im Kopf einzusetzen ;) Jedenfalls 
liegt das nahe, wenn schon s_intern(0) so ziellos ist...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>     IF (RESET = '1')  THEN    --asynchroner Reset
Wenn du schon Xilinx Bausteine verwendest, dann lies mal das WP272.

Was ist denn das für ein unglaublich umständlicher Code?
Mußt du das so machen? Oder hast du das einfach so gelernt?

Ein generisches Schieberegister in VHDL sieht so aus:
1
   process (clk) begin
2
     if rising_edge(clk) then
3
       if shift_enable='1' then
4
         reg <= reg(reg'left-1 downto 0) & neues_bit;
5
       end if;
6
     end if;
7
   end process;
Oder kürzer (aber genau gleich) so:
1
   process begin
2
     wait until rising_edge(clk);
3
     if shift_enable='1' then
4
       reg <= reg(reg'left-1 downto 0) & neues_bit;
5
     end if;
6
   end process;
Oder noch kürzer und concurrent/nebenläufig/ohne Prozess:
1
   reg <= reg(reg'left-1 downto 0) & neues_bit when rising_edge(clk) and shift_enable='1';

von Wisler E. (wisler) Benutzerseite


Lesenswert?

Zuerst einmal danke für die Hilfen, aber weiter gekommen bin ich jetzt 
leider noch nicht.

@Anguel S.
Ja das denke ich mir, dass die Tools immer 99,9% das richtige machen. 
Deshalb wollte ich einfach mal hier was posten und sehen ob ich 
vielleicht einen Denkfehler habe und man das bei VHDL nicht so machen 
kann oder darf.

@Georg A.
Hier nochmal die Codezeilen, wo die Warnings kommen. Ich denke schon, 
dass s_intern(0) vergeben habe, aber irgendwie sagt der Compiler es wäre 
überflüssig un schmeißt sie weg. :-( Siehe die siebte Zeile in dem Code 
unten.
1
SIGNAL intern_ff_out: std_logic_vector(0 TO nn-1);
2
  SIGNAL intern_schiebe_in:  std_logic;
3
  SIGNAL s_intern:  std_logic_vector(0 TO nn-1);
4
  
5
  
6
  BEGIN
7
    N_1_Stufen:    FOR ii IN 0 TO  (nn -1) GENERATE
8
                G0: IF (ii = 0) GENERATE
9
                  G0: e_xor_and PORT MAP(xi=>intern_ff_out(0), ki=>kn_in(0), xori=>s_intern(1), y=>s_intern(0));
10
                END GENERATE G0;
11
                
12
                GN_2: IF (ii > 0 AND ii < nn -1) GENERATE
13
                  G0: e_xor_and PORT MAP(xi=>intern_ff_out(ii), ki=>kn_in(ii), xori=>s_intern(ii +1), y=>s_intern(ii));
14
                END GENERATE GN_2;
15
                
16
                GNN: IF (ii = nn -1) GENERATE
17
                  G_0: e_and PORT MAP(a=>intern_ff_out(nn -1), b=>kn_in(nn -1), y=>s_intern(nn -1));
18
                END GENERATE GNN;
19
          END GENERATE N_1_Stufen;
20
    
21
    Schieberegister:    e_schieberegister PORT MAP(intern_schiebe_in, clk, reset, intern_ff_out);
22
    select_mode:      e_switch_mode PORT MAP(dat_in, mode, intern_ff_out(nn -1), intern_schiebe_in);
23
    SIGNAL_OUT:        xn_out <= intern_ff_out;
24
    
25
END a_test_maschine;

@Lothar Miller
Naja irgendwie haben wir das schon so gelernt. :-( Wir sollen eigentlich 
immer in Blöcken denken. Da habe ich mir gedacht baust du die ein D-Flip 
Flop und dann kannst du es N - mal verwenden und baust dir ein N-Bit 
Schieberegister auf. Das funktioniert bis jetzt auch ganz gut. Ich 
finde, aber auch dass es so sehr mühsam ist zu programmieren und man 
muss immer genau überlegen wie man was macht.
Naja das mit dem Reset wollte ich eigentlich schon asynchron zum Takt 
haben. Ist das schlimm oder was meinst du mit der ersten Zeile?
Dein Schieberegister ist natürlich sehr viel kürzer wie meins, nur ich 
versteh noch nicht ganz was die Zeile macht:
1
reg <= reg(reg'left-1 downto 0) & neues_bit;

Das ist doch einfach ein Bit verschieben oder?

Ich hoffe vielleicht kann mit jetzt einer besser helfen, bin halt leider 
noch nicht so ganz vertraut mit VHDL. Ich denke da braucht man sehr 
lange bis man wirklich mal viel damit machen kann.

Die Konstante global zu machen, wäre für mich schonmal ein Anfang. :-)

von Wisler E. (wisler) Benutzerseite


Lesenswert?

So ich habe den Fehler gefunden. Es tut mir leid, aber ich habe wohl 
eine Leitung vergessen zu verbinden. Gibt es den keine leichtere 
Möglichkeit Blöcke miteinander zu verbinden ohne den Generate Befehl. Da 
kann man ja leicht mal durcheinander kommen.

Aber das Problem mit der Konstanten habe ich immer noch :-(
Wie kann ich den eine Konstante deklarieren, dass Sie für alle Entitys 
verfügbar ist und ich nicht in jeder Entity sie einzeln deklarieren 
muss.

von Georg A. (Gast)


Lesenswert?

> Ich denke schon, dass s_intern(0) vergeben habe, aber
> irgendwie sagt der Compiler es wäre überflüssig un schmeißt sie weg.

Als Ausgang schon, aber welche der anderen Zeilen hat es als Eingang?

> Gibt es den keine leichtere Möglichkeit Blöcke miteinander
> zu verbinden ohne den Generate Befehl?

Jein. Ein F*ckup kommt bei dir schon mal daher, dass du die Sonderfälle 
vom Anfang und Ende in die Forschleife reinsteckst und nochmal 
(zwangsweise) mit if verknüpfst. Das ist doch völlig überflüssig. Die 
kann man ohne generate instanziieren (bei nn>=2).

von Anguel S. (anguel)


Lesenswert?

Wisler Electronics schrieb:
> Aber das Problem mit der Konstanten habe ich immer noch :-(
> Wie kann ich den eine Konstante deklarieren, dass Sie für alle Entitys
> verfügbar ist und ich nicht in jeder Entity sie einzeln deklarieren
> muss.

Ich bastele mir ein Package z.B. so:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
package mypackage is
6
7
  constant CONST_A : std_logic_vector(7 downto 0) := X"00";
8
  constant CONST_B : std_logic_vector(7 downto 0) := X"01";
9
end mypackage;



Dann wenn du in einer anderen VHDL Datei auf die Konstante zugreifen 
willst, musst du das Package einbinden:
1
use work.mypackage.all;

Grüße,
Anguel

von Wisler E. (wisler) Benutzerseite


Lesenswert?

Zuerst einmal Danke für euere Antworten es hat super geklappt. Doch eine 
Frage hätte ich noch zu VHDL.

Und zwar bin ich gerade dabei einen Zähler zu bauen, der Funktioniert 
auch wunderbar, da ich aber das Ausgangssignal also den Zählerstand 
nicht brauche habe ich es in einer Variablen rechnen lassen. Um es so 
dem Übergeordneten Block nicht übergeben zu müssen.
Dies geht doch auch oder? Gibt es da noch eine andere Möglichkeit?

Ausserdem kann ich mit dem Zähler einen Anfangswert laden. Doch hier 
scheitere ich. Ich weiß nicht wieso der Comiler mir das Signal immer als 
Warning bringt. Ich weiße ihm einen Konstanten Wert zu. Dies mache ich 
in einem Übergeordneten Modul/Block. Doch hier geht es wohl irgendwie 
nicht. Vielleicht kann mir einer erklären woran das liegt. Also ich 
verstehe dich Sprache VHDL noch nicht wirklich, da fand ich den Einstieg 
in C irgendwie leichter. :-(

1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
use IEEE.NUMERIC_STD.ALL;
6
7
entity e_main is
8
PORT(    clk_50MHz: IN std_logic);
9
end e_main;
10
11
architecture a_main of e_main is
12
13
component e_timer_no_out
14
GENERIC(NN: integer);
15
Port (  Clk : in  STD_LOGIC;  --Takteingang 
16
            Rst : in  STD_LOGIC;  --Reset 
17
            --ZZ : out  STD_LOGIC_VECTOR (NN-1 downto 0);-- Zählerstand 
18
            OV : out STD_LOGIC;  --Überlaufsignal 
19
            LoadV : in  STD_LOGIC_VECTOR (NN-1 downto 0);--Nachladew
20
            Enable : in  STD_LOGIC;  --Timer Start/Stop 
21
            Set : in  STD_LOGIC);    --Nachladewert einspeichern 
22
end component;
23
24
25
--Einstellungen für 1MHz Takt
26
constant c_50MHz_to_1MHz  : integer:=50; 
27
constant c_NN_1MHZ  : integer:=6;    --ceil(ln(Teiler50)/ln(2)) 
28
constant c_LV_1MHZ  : STD_LOGIC_VECTOR (c_NN_1MHZ-1 downto 0) :=conv_std_logic_vector(-c_50MHz_to_1MHz +1, c_NN_1MHZ); 
29
30
signal  s_OV_SET_1MHz:  std_logic := '0';
31
signal  s_outt_1MHz:  std_logic := '0';
32
33
Begin 
34
  clk_50MHz_to_1MHZ: 
35
    e_timer_no_out
36
    Generic Map(NN => c_NN_1MHZ) 
37
    Port Map (    Clk   => clk_50MHz,--CLK_50MHZ,   
38
              Rst   => '0',
39
              OV   => s_outt_1MHz,    --Unsymmetrisches Signal 
40
              LoadV => c_LV_1MHZ, 
41
              Enable => '1',
42
              Set   => s_OV_SET_1MHz); 
43
 
44
    s_OV_SET_1MHz <=  s_outt_1MHz;
45
end a_main;
46
47
library IEEE;
48
use IEEE.STD_LOGIC_1164.ALL;
49
use IEEE.STD_LOGIC_ARITH.ALL;
50
use IEEE.STD_LOGIC_UNSIGNED.ALL;
51
use IEEE.NUMERIC_STD.ALL;
52
53
entity e_timer_no_out is
54
Generic (NN:integer:=32); 
55
Port (  Clk : in  STD_LOGIC;  --Takteingang 
56
            Rst : in  STD_LOGIC;  --Reset 
57
            OV : out STD_LOGIC;  --Überlaufsignal 
58
            LoadV : in  STD_LOGIC_VECTOR (NN-1 downto 0);--Nachladew
59
            Enable : in  STD_LOGIC;  --Timer Start/Stop 
60
            Set : in  STD_LOGIC);    --Nachladewert einspeichern 
61
end e_timer_no_out;
62
63
architecture a_timer_no_out of e_timer_no_out is
64
65
signal s_ov: std_logic;--Overflow Signal
66
67
begin 
68
  process(clk, rst)
69
  
70
  variable tz: std_logic_vector(NN downto 0) := (others => '0');
71
  Begin 
72
    if(Rst='1')then        -- Resetaktion 
73
      tz := '0' & LoadV;--conv_std_logic_vector(0,NN-1); 
74
    elsif(clk'event AND clk='1')then  --Taktsynchrones Umfeld 
75
      if(Set='1')then     --Nachladevorgang 
76
        tz:= '0' & LoadV; 
77
      elsif(Enable='1')then    --Zähler Start/Stop 
78
        tz := tz+1;    --Zählerstand erhöhen 
79
      end if; 
80
      
81
      if( tz(NN) = '1') then
82
        s_ov <= '1';
83
      else
84
        s_ov <= '0';
85
      end if;
86
    end if;
87
  End Process; 
88
 
89
  ov <= s_ov;          --Überlaufsignal 
90
end a_timer_no_out;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wisler Electronics schrieb:
> Um es so dem Übergeordneten Block nicht übergeben zu müssen.
> Dies geht doch auch oder?
Schon, aber...
> Gibt es da noch eine andere Möglichkeit?
Mach den Zähler besser als Signal, wenn du das Verhalten von Variablen 
noch nicht kannst. Du MUSST ja nicht alle Signale auch über den Port der 
Entity nach "oben" geben...
Beitrag "Variable vs Signal"

Wisler Electronics schrieb:
> elsif(clk'event AND clk='1')then  --Taktsynchrones Umfeld
Warum, frage ich mich, schreibt das eigentlich alle Welt so umständlich 
(und eigetnlich auch falsch)? Es gibt doch die elegante Funktion 
rising_edge()...

Wisler Electronics schrieb:
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_UNSIGNED.ALL;
> use IEEE.NUMERIC_STD.ALL;
Nein, bitte nicht schon wieder...
Siehe den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Und einige mehr...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.