Hallo, ich bräuchte mal euren Rat. Ich will mir einen 0-99 Auf/Ab-Zähler basteln, welcher bestimmte Zählgrenzen, welche als Input reingehen, verarbeiten kann. Die Zählgrenzen werden über Schieberegister eingestellt. Die Auswertung welche Zählgrenze grad anliegt, hab ich über eine case-Anweisung geschrieben. Das funktioniert auch alles einwandfrei. Hier mal die case-Anweisung, welche die Schieberegisterauswertung als Eingang bekommt: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity bereich_case is Port ( bereich : in integer range 1 to 13; c_min : buffer integer range 0 to 99; c_max : buffer integer range 0 to 99); end bereich_case; architecture Behavioral of bereich_case is begin process(bereich,c_min,c_max) begin case bereich is when 1 => c_min <= 0; c_max <= 99; when 2 => c_min <= 0; c_max <= 49; when 3 => c_min <= 50; c_max <= 99; when 4 => c_min <= 0; c_max <= 9; when 5 => c_min <= 10; c_max <= 19; when 6 => c_min <= 20; c_max <= 29; when 7 => c_min <= 30; c_max <= 39; when 8 => c_min <= 40; c_max <= 49; when 9 => c_min <= 50; c_max <= 59; when 10 => c_min <= 60; c_max <= 69; when 11 => c_min <= 70; c_max <= 79; when 12 => c_min <= 80; c_max <= 89; when 13 => c_min <= 90; c_max <= 99; end case; end process; end Behavioral; Diese geht auf den Zähler. Hier der Zähler: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity up_down is port ( clk : in std_logic; reset : in std_logic; enable : in std_logic; updown : in std_logic; c_min : in integer range 0 to 99; c_max : in integer range 0 to 99; q : out integer range 0 to 99 ); end up_down; architecture rtl of up_down is signal direction : integer; begin process (updown) begin if (updown = '1') then direction <= 1; else direction <= -1; end if; end process; process (clk,c_min,c_max) constant min: integer:= 0; constant max: integer:= 99; variable cnt: integer range min to max; begin min <= c_min; max <= c_max; if (rising_edge(clk)) then if reset = '1' then cnt := 0; elsif enable = '1' then cnt := cnt + direction; end if; end if; q <= cnt; end process; end rtl; Er meckert aber ständig rum und ich weiß einfach nicht woran es liegt. Ich hoffe ihr habt eine Idee.
Sophie G. schrieb: > Er meckert aber ständig rum und ich weiß einfach nicht woran es liegt. Ohne wirklich den Code anzuschauen könntest du ja auch einfach mal die Fehlermeldungen anschauen beziehungsweise posten... Könnte ja nur helfen.
Entweder er muckt rum weil min und max keine konstanten, wenn ich das ändere, stört er sich auf einmal, dass keine Signale sind. Schwierig dann zu sagen, wo dann der Fehler liegt.
Warum willst du die Variable "cnt" zur dynamisch "begrenzen"? variable cnt: integer range min to max; Willst du damit den Überlauf festlegen?
Sophie G. schrieb: > Das war der Gedanke ja Besser wäre es, den Zähler so bauen, dass auf min und max verglichen und entsprechend zurückgestellt wird. Beispielhaft so:
1 | if cnt = max then cnt <= min; |
Und du solltest diese wilde Mischung aus Signalen, Konstanten und Variablen sein lassen.
Lies den Synthese guide für "deinen" FPGA. Beispielsweise wenn du Vivado von Xilinx benutzt die UG901: http://www.xilinx.com/support/documentation/sw_manuals/xilinx2014_4/ug901-vivado-synthesis.pdf Da steht beispielsweise auf S. 149 mittig ein wichtiger Hinweis.
Schlumpf schrieb: > Und du solltest diese wilde Mischung aus Signalen, Konstanten und > Variablen sein lassen. Ganz wichtig: beim "sein lassen" von hinten her anfangen...
Hab den Zähler nochmal überarbeitet. Als Fehler erscheint: min must represent signal. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity up_down_counter is port ( clk : in std_logic; reset : in std_logic; enable : in std_logic; updown : in std_logic; c_min : in integer range 0 to 99; c_max : in integer range 0 to 99; q : out integer range 0 to 99 ); end up_down_counter; architecture rtl of up_down_counter is signal direction : integer; constant min: integer; constant max: integer; begin process (updown) begin -- Determine the increment/decrement of the counter if (updown = '1') then direction <= 1; else direction <= -1; end if; end process; process (clk,c_min,c_max) variable cnt: integer; begin if cnt=max then cnt:=min; end if; if (rising_edge(clk)) then if reset = '1' then cnt := min; elsif enable = '1' then cnt := cnt + direction; end if; end if; q <= cnt; min <= c_min; max <= c_max; end process; end rtl;
Sophie G. schrieb: >Als Fehler erscheint: min must represent signal. Mein Synthesetool meckert bei folgenden Konstrukt:
1 | dum_proc: process(clk) |
2 | constant const: std_logic; |
3 | begin
|
4 | if rising_edge(clk) then |
5 | const := '1'; |
6 | end if; |
7 | end process; |
und zwar: "Deferred constant const is allowed only in package declaration" "const is not a variable" bzw. "const is not a signal" wenn ich die Zuweisung in const <= '1' ändere. Viel wichtiger ist die erste Fehlermeldung - ein Process ist kein Package - und nur dort scheinen deferred constants zulässig. Warum machst Du daraus nicht ganz normale Signale?
:
Bearbeitet durch User
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.