Hallo,

Ik heb een paar jaar geleden al eens enkele maanden met VHDL gewerkt, maar ben de laatste 2 jaar vooral bezig geweest met C.
Nu ik terug met VHDL ga beginnen moet ik mij terug inwerken. Ik moet verder werken op bestaande code, maar voor zover mijn VHDL kennis gaat, vind ik hier toch een paar rare dingen in; tenzij ik iets over het hoofd zie.

		signal NrOfAirguns, NrOfAirgunsCounter, WriteAdress : integer range 0 to 1023;--maximum 256 kleppen maar hoogste bit wordt gebruikt voor write enable in ScanRam
	signal WriteAdress_STD : std_logic_vector(9 downto 0);

	--Dit process telt het aantal klok pulsen van CLK/DATA, omdat verschillende systemen bestaan.
	
	-- OPM: Waarom niet van NrOfAirgunsCounter een variabele maken (en binnnen 1 process werken) ipv signaal; 
	-- dan kan deze volledig sequentieel gebruikt worden?
	
	process(MasterClk)
	begin
		If rising_edge(MasterClk) then
			if Stop = '1' then
				NrOfAirgunsCounter <= 0;
				-- Opm: waarom eerst naar NrOfAirguns, en niet direct naar WriteAdress?
				-- Gaat alles met één clock van de masterclock vervroegen... => is dit kritisch?
--				NrOfAirguns <= NrOfAirgunsCounter-1;
--				WriteAdress <= NrOfAirguns;
			elsif FallingCLK_i = '1' then
				NrOfAirgunsCounter <= NrOfAirgunsCounter + 1;
--				WriteAdress <= WriteAdress - 1;
			end if;
		end if;
	end process;
	
		--NrOfAirgunsCounter_STD <= CONV_STD_LOGIC_VECTOR(NrOfAirgunsCounter,10);
	process(MasterClk)
	begin
		If rising_edge(MasterClk) and Stop = '1' then --FallingCLK_Front = '1' and STOP_Clocked2_Front = '1' then
			NrOfAirguns <= NrOfAirgunsCounter-1;  -- -2, 1 van de stijgende flank van de extra CLKpuls
		end if;													--	   1 : we tellen 256 pulsen maar is adres 255
	end process;
	
	
	--Dit process berekent het adress om in de ScanRam de binnenkomende DATA te schrijven
	process(MasterClk)
	begin
		if rising_edge(MasterClk) then
			if Stop = '1' then
				WriteAdress <= NrOfAirguns;
				--Wren_o <= '0'
			elsif FallingCLK_i = '1' then
				WriteAdress <= WriteAdress - 1;
				--Wren_o <= '1'
			end if;	
		end if;
	end process;


		WriteAdress_STD <= CONV_STD_LOGIC_VECTOR(WriteAdress, 10);
		WriteAdress_o <= WriteAdress_STD(8 downto 0);
		Wren_o <= not(WriteAdress_STD(9) or WriteAdress_STD(8));

- Kan ik alles niet in het eerste process steken?
(Heb dit al eens gecompiled en in RTL viewer krijg ik hetzelfde)
- Als alles in 1 process steekt kan ik in principe NrOfAirgunsCounter en NrOfAirguns als variabele declareren ipv als signaal, en op die manier veel makkelijker het gewenste resultaat bekomen?
- Of zijn er redenen om alles op te splitsen in 3 processen?
(Ik zou enkel opsplitsen als dit de overzichtelijkheid ten goede komt, of zijn er andere reden om dit wel of niet te doen?)

Iemand tips voor een beginneling.

Op 23 september 2010 16:08:06 schreef cYberJ:
- Kan ik alles niet in het eerste process steken?
(Heb dit al eens gecompiled en in RTL viewer krijg ik hetzelfde)
- Als alles in 1 process steekt kan ik in principe NrOfAirgunsCounter en NrOfAirguns als variabele declareren ipv als signaal, en op die manier veel makkelijker het gewenste resultaat bekomen?

Alles kan in 1 process. Je hele design in 10 kantjes A4 :-) Enige reden om dat niet te doen is inderdaad de leesbaarheid, en dus onderhoudbaarheid. Deel het dus op in functies en dat doe je gevoelsmatig. Bv een counter in 1 process, of een statemachine bevat.

Een variabele kan geen geheugen functie hebben. Think Hardware, en dan wordt een variable gewoon een draadje. Die counter die je noemt moet tussen elke clk-flank z'n waarde behouden, dus dat worden flipflops, een sequentieel element dus. Dat moet een signaal zijn (die in een clk'ed process assigned wordt dus).

Oh nog iets, waarom toch altijd indents van 8 spaties??? Is 2 niet genoeg?

Een late reply, maar bedankt voor je tips.

Ik heb de laatste 2 weken de code wat zitten opkuisen en ben er nu terug wat mee weg.