[VHDL] Signal wird nicht gesetzt [SOLVED]

Hoffentlich hat sich jemand hier schon mal mit VHDL auseinandergesetzt, ansonsten bin ich aufgeschmissen. :)

Im folgenden Code bleibt das Signal running undefined, obwohl der Simulator am Breakpoint auf der Zuweisung hält. Also es kommt der clock, mit steigender Flanke und start ist 1.
Code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity control is
    Port ( clock : in  STD_LOGIC;
           start : in  STD_LOGIC;
           round : out  STD_LOGIC_VECTOR (3 downto 0);
           ready : out  STD_LOGIC := '1';
           enable : out  STD_LOGIC;
           s : out  STD_LOGIC);
end control;

architecture Behavioral of control is

	signal running : STD_LOGIC;
	signal roundInternal : STD_LOGIC_VECTOR(3 downto 0);

begin

	startProcess : process(clock)
	begin
		if clock = '1' and clock'Event 
			and start = '1' then
			running <= '1';
			roundInternal <= "0000";
			s <= '0';
			enable <= '1';
		end if;
	end process startProcess;
	
	nextRound : process(clock)
	begin
		if running = '1' and clock'Event and clock = '1' then
			roundInternal <= STD_LOGIC_VECTOR(unsigned(roundInternal) + 1);
			s <= '1';
		end if;
	end process nextRound;
	
	finishProcess : process(roundInternal)
	begin
		if roundInternal = "0111" then
			roundInternal <= "1000";
			running <= '0';
			s <= 'U';
			enable <= '0';
		end if;
	end process finishProcess;
	
	round <= roundInternal;
	ready <= not running;

end Behavioral;

Testbench:
Code:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
ENTITY tb_control IS
END tb_control;
 
ARCHITECTURE behavior OF tb_control IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT control
    PORT(
         clock : IN  std_logic;
         start : IN  std_logic;
         round : OUT  std_logic_vector(3 downto 0);
         ready : OUT  std_logic;
         enable : OUT  std_logic;
         s : OUT  std_logic
        );
    END COMPONENT;
    

   --Inputs
   signal clock : std_logic := '0';
   signal start : std_logic := '1';

 	--Outputs
   signal round : std_logic_vector(3 downto 0);
   signal ready : std_logic;
   signal enable : std_logic;
   signal s : std_logic;

   -- Clock period definitions
   constant clock_period : time := 4 ps;
 
BEGIN
 
	-- Instantiate the Unit Under Test (UUT)
   uut: control PORT MAP (
          clock => clock,
          start => start,
          round => round,
          ready => ready,
          enable => enable,
          s => s
        );

   -- Clock process definitions
   clock_process :process
   begin
		clock <= '0';
		wait for clock_period/2;
		clock <= '1';
		wait for clock_period/2;
   end process;

--	start <= '0', '1' after 5 ps, '0' after 7 ps, 
--				'1' after 43 ps, '0' after 45 ps, 
--				'1' after 57 ps, '0' after 59 ps, '1' after 73 ps, '0' after 81 ps,
--				'1' after 93 ps;
END;

btw, ich muss mich mal wirklich beschweren: Warum haben wir keine VHDL-Tags! Frechheit :D

mfg benediktibk

Edit: Zum besseren Verständnis habe zwei Screenshots angehängt
 
Zuletzt bearbeitet:
Ein neues Phänomen: Inzwischen passiert es ziemlich häufig dass alle Signale im Simulator undefined sind (zum Beispiel auch das Clock-Signal). Danach ändere ich wieder eine Kleinigkeit, welche aber auch gar nichts mit dem Clock zu tun hat, und plötzlich wird wenigstens der wieder korrekt simuliert.
Wenn ich jetzt in C unterwegs wäre würde ich sagen: Speicherzugriffsfehler. Aber da wir von VHDL reden bin ich ein klein wenig ratlos :confused:.

mfg benediktibk
 
nagut, das zweite Miniaturbild ist klar, da der process auf clk hört, startert er ihn, falls sich das ändert! Dann fragst du direkt running ab...
beim ersten bin ich mir selber sehr unsicher, jedoch kommt es sehr stark auf deinen Simulator an! Solche endlosen Statements in der If-Bedingung tun sicher NICHT gut, zumindest hat bei uns damals der Synthetisierer stark gemotzt :)

aber ich schau schnell noch die alten VHDL-Files von mir durch, eventuell springt mir was ins Auge...

Grüße

EDIT: Hast du schon versucht einfach running direkt zu initialisieren mit z.B. 0?
 
Zuletzt bearbeitet:
Der Punkt ist mir inzwischen auch schon aufgefallen, hatte ich nicht ideal gelöst. Hatte, wohlgemerkt :)
Code:
entity control is
    Port ( clock : in  STD_LOGIC;
           start : in  STD_LOGIC;
           round : out  STD_LOGIC_VECTOR (3 downto 0);
           ready : out  STD_LOGIC := '1';
           enable : out  STD_LOGIC;
           s : out  STD_LOGIC);
end control;

architecture Behavioral of control is

	signal running : STD_LOGIC;
	signal roundInternal : STD_LOGIC_VECTOR(3 downto 0);

begin

	startProcess : process(clock)
	begin
		if clock = '1' and clock'Event then
			if start = '1' and not running = '1' then
				running <= '1';
				s <= '0';
			elsif running = '1' then
				roundInternal <= STD_LOGIC_VECTOR(unsigned(roundInternal) + 1);
				s <= '1';
			end if;
		end if;
	end process;
	
	finishProcess : process(roundInternal)
	begin
		if roundInternal = "0111" then
			roundInternal <= "1000";
			running <= '0';
			s <= '0';
		end if;
	end process;
	
	round <= roundInternal;
	ready <= not running;
	enable <= running;

end Behavioral;

Das Problem besteht aber leider immer noch.

mfg benediktibk
 
hey

setz running gleich auf 0:

signal running : STD_LOGIC := '0';

bei deiner if-abfrage kann running noch gar nicht definiert sein!

Grüße
 
Deswegen frage ich absichtlich nicht auf running = '0' sondern eben not running = '1'. Muss aber nicht sein und habe ich auf deine Anregung hin gleich geändert. Und weil ich jetzt so einen Batzen an Problemen mit den verschiedenen Prozessen hatte ist alles in einem einzigen gelandet. Davor gefiel es mir zwar besser, aber so sollte es weniger (Anfänger-)fehleranfällig sein. Dachte ich, aber zuerst einmal wieder der aktuelle Stand:
Code:
architecture Behavioral of control is

	signal running : STD_LOGIC := '0';
	signal roundInternal : STD_LOGIC_VECTOR(3 downto 0) := "0000";

begin

	startProcess : process(clock)
	begin
		if clock = '1' and clock'Event then
			if start = '1' and running = '0' then
				running <= '1';
				s <= '0';
				roundInternal <= "0000";
			elsif running = '1' then
				if roundInternal = "0111" then
					roundInternal <= "1000";
					running <= '0';
				else
					roundInternal <= STD_LOGIC_VECTOR(unsigned(roundInternal) + 1);
					s <= '1';
				end if;
			end if;
		end if;
	end process;
	
	finishProcess : process(roundInternal)
	begin
		if roundInternal = "0111" then

		end if;
	end process;
	
	round <= roundInternal;
	ready <= not running;
	enable <= running;

end Behavioral;

Und der aktuelle Testbench:
Code:
ARCHITECTURE behavior OF tb_control IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT control
    PORT(
         clock : IN  std_logic;
         start : IN  std_logic;
         round : OUT  std_logic_vector(3 downto 0);
         ready : OUT  std_logic;
         enable : OUT  std_logic;
         s : OUT  std_logic
        );
    END COMPONENT;
    

   --Inputs
   signal clock : std_logic := '0';
   signal start : std_logic := '0';

 	--Outputs
   signal round : std_logic_vector(3 downto 0);
   signal ready : std_logic;
   signal enable : std_logic;
   signal s : std_logic;

   -- Clock period definitions
   constant clock_period : time := 4 ps;
 
BEGIN
 
	-- Instantiate the Unit Under Test (UUT)
   uut: control PORT MAP (
          clock => clock,
          start => start,
          round => round,
          ready => ready,
          enable => enable,
          s => s
        );

   -- Clock process definitions
   clock_process :process
   begin
		clock <= '0';
		wait for clock_period/2;
		clock <= '1';
		wait for clock_period/2;
   end process;

	start <= '1' after 5 ps, '0' after 7 ps, 
				'1' after 43 ps, '0' after 45 ps, 
				'1' after 57 ps, '0' after 59 ps, '1' after 73 ps, '0' after 81 ps,
				'1' after 93 ps;
END;

Jetzt bekomme ich ganz was lustiges, und zwar einen undefined clock. Äußerst praktisch, allerdings habe ich keine Ahnung wo das her kommt. (siehe Anhang)

Danke für die Hilfe,
benediktibk
 
hey

naja, bei not baust du quasi nur einen Inverter davor :)

also wir hatten damals den clk einfach definiert und dann nach dem begin (vor deinen Prozessen) den Stimulus wie folgt gesetzt:

clk <= not clk after 4 ps;

Dadurch ist der clk von keinem Prozess abhängig!

Genauso solltest du deine Test in den Prozess packen und dann einfach mit wait arbeiten!

soweit zu deiner tb...

bei deinem control finde ich folgende Zeilen "bedenklich":

round <= roundInternal;
ready <= not running;
enable <= running;

Das ist aber Definitionssache, wie diese behandelt werden...

Grüße
 
Der Code bezüglich des Clocks wurde von der IDE (Xilinx ISE Webpack) automatisch so erstellt. Die einzige Änderung von mir dabei ist die Clock period, der Rest ist genauso wie automatisch generiert. Ich werde es aber gerne morgen noch einmal auf deine Methode versuchen.
Und dass ich die Waveform meiner Testsignale so erstelle habe ich vom Dozenten empfohlen bekommen, werde ich aber gerne noch einmal anders probieren.
Eine Frage bleibt noch: Warum sind die drei Zeilen bedenklich? Bitte verzeihen wenn ich blöde Fragen stelle, aber ich beschäftige mich seit ca. einer Woche mit VHDL.

Wie gesagt, den Rest der Tipps von dir wird ausprobiert, nur nicht mehr heute. Ich melde mich wieder, versprochen :D.

mfg benediktibk
 
Ich schreie jetzt ganz frech und laut in die Welt hinaus: BUG!
Eine Nacht darüber geschlafen, Datei umbenannt -> funktioniert so wie es soll. Zumindest grob, im Detail muss ich mich mit dem Plot noch genauer befassen.

mfg benediktibk
 
Falls jemand zu ähnlich eigenartigen Ergebnissen kommen sollte: Folgenden Code in ein Batch-File packen und ausführen.
Code:
rd /S /Q _xmsgs
rd /S /Q iseconfig
rd /S /Q isim
del *.exe
del *.prj
del *.wdb
del *.log
del *.xmsgs
del *.cmd
del *.gise
del *.html
del *.ini

mfg benediktibk
 
Zurück
Oben