Forum: FPGA, VHDL & Co. Unconnected pins, nets: Wie handhaben? Pull-Down?


von Patrick B. (p51d)


Lesenswert?

Hallo allerseits

Ich habe bei einem aktuellen Projekt einen kleinen Schönheitsfehler 
gefunden.
Eine Uhr habe ich aus mehreren generischen Zählern mit Carry-In und 
Carry-Out aufgebaut. Nur hat jetzt der letzte Zähler (10ner der Stunden) 
einen offenen Carry-Out.
Wie kann ich hier jetzt eine Fehlermeldung unterdrücken? Quasi ein 
Pull-Down Widerstand einsetzen?
Ich habe schon "open" versucht, aber das hat nicht viel gebracht...

Besten Dank für die Hilfe
MFG
Patrick

von Tobias L. (murxwitz)


Lesenswert?

da dürfte doch "nur" ein Warnung raus kommen, und davon hat man bei 
VHDL/Verilog gern ne ganze Liste, musst die halt durchgehen und schauen 
ob es da ein Problem gibt oder nicht.
Ist nicht wie bei C wo man (meist) ohne Warnungen enden möchte.

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


Lesenswert?

Patrick B. schrieb:
> Wie kann ich hier jetzt eine Fehlermeldung unterdrücken?
Ließ mal deine Frage, und dann beantworte (ohne zusätzliches 
Hintergrundwissen) diese hier: wer (also genau: welcher Teil welcher 
Toolchain) sollte bei einem offenen Ausgang welche Fehlermeldung 
ausspucken? Wie hast du die "generischen Zähler" verdrahtet?

: Bearbeitet durch Moderator
von FPGA Pongo (Gast)


Lesenswert?

Das überflüssige Carry muss wie alle anderen Signale selbstverständlich 
abgeschlossen werden. Einfach auf einen Ausgang legen und mit 50 Ohm 
terminieren. Dann ist die Synthese auch zufrieden.

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


Lesenswert?

FPGA Pongo schrieb im Beitrag #4148649:
> mit 50 Ohm terminieren.
Aufgrund des dadurch unnötig hohen statischen Stromverbrauchs würde ich 
aber eher eine AC Terminierung über einen zusätzlichen 100nF Kondensator 
vorsehen...

von Patrick B. (p51d)


Lesenswert?

Der Grundzähler sieht so aus:
1
entity counter is
2
   Generic (cnt_width : INTEGER := 4;
3
         cnt_up_limit : INTEGER := 9);
4
    Port ( ci : in  STD_LOGIC;
5
           load_val : in  STD_LOGIC_VECTOR (cnt_width-1 downto 0);
6
           load : in  STD_LOGIC;
7
        en : in STD_LOGIC;
8
           rst : in  STD_LOGIC;
9
           clk : in  STD_LOGIC;
10
           co : out  STD_LOGIC;
11
           count : out  STD_LOGIC_VECTOR (cnt_width-1 downto 0));
12
end counter;

Die Uhr selber ist dann so aufgebaut:
1
entity timer is
2
    Port ( rst : in  STD_LOGIC;
3
           clk : in  STD_LOGIC;
4
        en : in STD_LOGIC;
5
           load_h10 : in  STD_LOGIC_VECTOR (1 downto 0);
6
           load_h1 : in  STD_LOGIC_VECTOR (3 downto 0);
7
           load_min10 : in  STD_LOGIC_VECTOR (2 downto 0);
8
           load_min1 : in  STD_LOGIC_VECTOR (3 downto 0);
9
           load_h : in  STD_LOGIC;
10
           load_min : in  STD_LOGIC;
11
           rst_sec : in  STD_LOGIC;
12
           h10 : out  STD_LOGIC_VECTOR (1 downto 0);
13
           h1 : out  STD_LOGIC_VECTOR (3 downto 0);
14
           min10 : out  STD_LOGIC_VECTOR (2 downto 0);
15
           min1 : out  STD_LOGIC_VECTOR (3 downto 0);
16
           sec10 : out  STD_LOGIC_VECTOR (2 downto 0);
17
           sec1 : out  STD_LOGIC_VECTOR (3 downto 0));
18
end timer;
19
20
architecture Behavioral of timer is
21
  COMPONENT counter  
22
  GENERIC (cnt_width : INTEGER;
23
        cnt_up_limit : INTEGER);
24
  PORT(
25
    ci : IN std_logic;
26
    load_val : IN std_logic_vector(cnt_width-1 downto 0);
27
    load : IN std_logic;
28
    en : in STD_LOGIC;
29
    rst : IN std_logic;
30
    clk : IN std_logic;          
31
    co : OUT std_logic;
32
    count : OUT std_logic_vector(cnt_width-1 downto 0)
33
    );
34
  END COMPONENT;
35
  
36
  signal sec1_co : std_logic;
37
  signal sec10_co : std_logic;
38
  signal min1_co : std_logic;
39
  signal min10_co : std_logic;
40
  signal h1_co : std_logic;
41
  signal h10_co : std_logic;
42
  
43
  signal rst_h : std_logic;
44
  signal h1_reg : std_logic_vector(3 downto 0);
45
  signal h10_reg : std_logic_vector(1 downto 0);
46
begin
47
   -------------------------------------------------------------------------------
48
  -- Komponenten instaziieren
49
   -------------------------------------------------------------------------------
50
  -- Stunden: Zehner-Zähler
51
  h10_cnt: counter GENERIC MAP(
52
      cnt_width => 2,
53
      cnt_up_limit => 2
54
    )
55
    PORT MAP(
56
    ci => h1_co,
57
    load_val => load_h10,
58
    load => load_h,
59
    en => en,
60
    rst => rst_h,
61
    clk => clk,
62
    co => h10_co,
63
    count => h10_reg
64
  );
65
  -- Stunden: Einer-Zähler
66
  h1_cnt: counter GENERIC MAP(
67
      cnt_width => 4,
68
      cnt_up_limit => 9
69
    )
70
    PORT MAP(
71
    ci => min10_co,
72
    load_val => load_h1,
73
    load => load_h,
74
    en => en,
75
    rst => rst_h,
76
    clk => clk,
77
    co => h1_co,
78
    count => h1_reg
79
  );
80
  
81
  -- Minuten: Zehner-Zähler
82
  min10_cnt: counter GENERIC MAP(
83
      cnt_width => 3,
84
      cnt_up_limit => 5
85
    )
86
    PORT MAP(
87
    ci => min1_co,
88
    load_val => load_min10,
89
    load => load_min,
90
    en => en,
91
    rst => rst,
92
    clk => clk,
93
    co => min10_co,
94
    count => min10
95
  );
96
  -- Minuten: Einer-Zähler
97
  min1_cnt: counter GENERIC MAP(
98
      cnt_width => 4,
99
      cnt_up_limit => 9
100
    )
101
    PORT MAP(
102
    ci => sec10_co,
103
    load_val => load_min1,
104
    load => load_min,
105
    en => en,
106
    rst => rst,
107
    clk => clk,
108
    co => min1_co,
109
    count => min1
110
  );
111
112
  -- Sekunden: Zehner-Zähler
113
  sec10_cnt: counter GENERIC MAP(
114
      cnt_width => 3,
115
      cnt_up_limit => 5
116
    )
117
    PORT MAP(
118
    ci => sec1_co,
119
    load_val => "000",
120
    load => rst_sec,
121
    en => en,
122
    rst => rst,
123
    clk => clk,
124
    co => sec10_co,
125
    count => sec10
126
  );
127
  -- Sekunden: Einer-Zähler
128
  sec1_cnt: counter GENERIC MAP(
129
      cnt_width => 4,
130
      cnt_up_limit => 9
131
    )
132
    PORT MAP(
133
    ci => '1',
134
    load_val => "0000",
135
    load => rst_sec,
136
    en => en,
137
    rst => rst,
138
    clk => clk,
139
    co => sec1_co,
140
    count => sec1
141
  );  
142
  
143
  
144
   -------------------------------------------------------------------------------
145
  -- Kombinatorik
146
   -------------------------------------------------------------------------------
147
  -- Handhabung des Einerzählers der Stunde
148
  rst_h <= '1' when ((rst = '1') or ((h1_reg = "0100") and (h10_reg = "10"))) else '0';
149
  h1 <= h1_reg;
150
  h10 <= h10_reg;
151
152
end Behavioral;

Das Signal h10_co ist zwar "verdrahtet", aber nirgends angeschlossen. 
Auch nicht auf einem Pin (da die Uhr selber dieses nicht nach aussen 
führt).
Ob ich anstelle h10_co oder open zuweise, spielt bei der Synthese keine 
rolle. Es gibt immer die Warnung, dass ein Signal nicht angeschlossen 
ist.

Kann dies nicht intern irgendwie gelöst werden, oder muss hier zwingend 
eine externe Beschaltung (Widerstand, Kondensator) ran?

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


Lesenswert?

Patrick B. schrieb:
> Es gibt immer die Warnung, dass ein Signal nicht angeschlossen ist.
>
> Kann dies nicht intern irgendwie gelöst werden
Nein. Denn du deklarierst den Ausgang, verwendest ihn aber nicht. 
Und das wird dir da gemeldet.
Da gibts 2 Lösungswege:
Mach einen zusätzlichen Zähler ohne Carry-Ausgang.
Oder:
Ignoriere die Warnung. Du selber weißt, dass das so sein muss und keinen 
Fehler darstellt.

> oder muss hier zwingend
> eine externe Beschaltung (Widerstand, Kondensator) ran?
Das waren zwei kleine Witzlein. Kein Mensch wird einen ungenutzten 
Ausgang auf einen Pin routen. Dafür sind Pins viel zu wertvoll.

BTW: dieser strukturelle Beschreibungsstil ist hoffentlich nur zur 
Übung. Denn das Ganze ist so extrem unübersichtlich...
Ich würde das eher so machen wie im 
Beitrag "kruder Fehler bei FPGA-Programmierung (ISE WEBpack-Schematic)"

: Bearbeitet durch Moderator
von Patrick B. (p51d)


Lesenswert?

Lothar Miller schrieb:
> BTW: dieser strukturelle Beschreibungsstil ist hoffentlich nur zur
> Übung. Denn das Ganze ist so extrem unübersichtlich...
> Ich würde das eher so machen wie im
> Beitrag "kruder Fehler bei FPGA-Programmierung (ISE WEBpack-Schematic)"

Also, ich hab das heute mal andersrum versucht: Ein 4-Bit Zähler, 
welcher über einen Eingang definiert wird (Top-Val). Und dann schön ein 
Schema... klappte soweit so gut. Nur wurde es dann sehr mühsam, gewisse 
Load-Werte in der Breite anzupassen (5er Zähler haben nur 3-Bit Breite, 
der 10ner-Stundenzähler sogar nur 2). Hier mussten die Load-Busse 
jeweils aufgetrennt, Buffers hinzugefügt und dann korrekt nach aussen 
geführt werden. Also entweder man generiert sich 3 verschiedene 
Grundzähler, die dann auch schön im Schema verwendet werden können, oder 
wie macht man das schön (und simpel sowie gut wartbar)?

Das Schema war am Schluss (der Einfacheithalber nur 1 Grundzähler) nicht 
mehr zu lesen. Mein Ansatz hat das ganze über Generics und über 
Verkettung der Signale zur richtigen Breite doch ziemlich übersichticher 
wirken lassen (auf dieser Ebene).

Ich stimme dir voll und ganz zu, dass man irgendwann ein Schema besser 
lesen kann, aber da ich es noch nicht herausgefunden habe, wie man 
Generics in Schemasymbolen setzt (die dann auch Bussbreiten usw. 
anpasst), bleibe ich bei einer Misch-Form.

von Graf Iker (Gast)


Lesenswert?

Für eine digitale Schaltung ein Schema zu zeichnen, heisst nicht, das 
unbedingt mit den schlimmen toolz der Hersteller zu tun. Man kann sowas 
auch schnell in Visio oder einem anderen Programm malen und jeweils 
aktualisieren, während die Synthese läuft. Das geht schneller und 
entspannter.

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.