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
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.
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
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.
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...
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?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.