VHDL - Skolprojekt bakljus till cykel.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

VHDL - Skolprojekt bakljus till cykel.

Inlägg av Repaterion »

Tjosan!
Projektet är säkert jätteenkelt för de som kan VHDL och kommit in i tänket vilket jag inte gjort riktigt än, så därför ber jag er om lite hjälp under sommarlovet.

Funktionen är skitenkel egentligen, EN knapp som skall skifta läge mellan tre olika "lägen" AV, PÅ, BLINK, RINNANDE ljus.
Det är fem LED som skall kontrolleras.
Karnaugh-diagram skall göras.
Sanningstabeller.

Det skall delas in i två grenar varav den ena är baserad kring D-fLip-flops och den andra är PROCESS beskriven.
Så två olika program skall skrivas.
Har prövat att skriva på pluggakuten om VHDL men det är väldigt skralt med svar för det språket.
Så det är ytterligare en anledning till att jag vänder mig hit då jag vet att kunskapen finns här.

Om jag skall börja med två kompileringsfel som jag har redan nu.
1: Error (10818): Can't infer register for "Qn" at D_flip_flop.vhd(38) because it does not hold its value outside the clock edge
2: Error (12152): Can't elaborate user hierarchy "D_flip_flop:dff0"

bike.vhd

Kod: Markera allt

-- Filnamn: EI21_BIKE

-----------------------------------------------------------------------
-- Biblioteken
--  Används för olika funktioner.
--  IEEE är grundpaketet.
--  IEEE.std_logic_1164.all krävs för standard logik.
-----------------------------------------------------------------------
library IEEE;
use     IEEE.std_logic_1164.all;
use     IEEE.numeric_std.all;


-----------------------------------------------------------------------
-- Entity - är där all portning sker för IN/UT-gångar.
--   Entititen måste vara identisk med filnamnet.
-----------------------------------------------------------------------
entity EI21_BIKE is  
   port 
      (
      button             : IN      std_logic;                    -- TOG BORT RESET
      button_counter     : IN      std_logic_vector(1 downto 0);
      
      leds               : OUT     std_logic_vector(4 downto 0); -- Fem LEDS används.

      D, Q               : IN   std_logic;                     -- För flip-flops. Missade kommatecken.
      D_n, Q_n           : OUT  std_logic
	-- kommande knappar // button_counter
      );

end entity;

-----------------------------------------------------------------------
-- Architecture
--
-----------------------------------------------------------------------

architecture BIKE of EI21_BIKE is

-- Component måste ligga föra BEGIN!!!
--   Component hämtas från filen "D_flip_flop".
   component D_flip_flop is 
      port
         (
            D,CLK        : IN std_logic;
            Q,Qn         : OUT std_logic
         );
   end component D_flip_flop;
   
   component clock_ticker is  -- MISSAT "IS"
      port
         (
           -- Reset    : IN std_logic;
            clk_4hz    : OUT std_logic;
            clk_8hz    : OUT std_logic
         );
   end component clock_ticker;
   
-- Signalerna är för NS == Next State CS == Current State.
   signal NS           : std_logic_vector(3 downto 0);
   signal CS           : std_logic_vector(3 downto 0);

-------------------------------------------------------------------------------------  
-- För flip-flopparna -- Gissar att de skall vara 4 till 0 om det är fem bitar.
   signal D_in         : std_logic_vector(0 to 3) := "0000"; --CLK_in
   signal Dn_in        : std_logic_vector(0 to 3) := "1111";
   signal Q_out        : std_logic_vector(0 to 3) := "0000";
   signal Qn_out       : std_logic_vector(0 to 3) := "1111";
   
   signal CLK          : std_logic; -- LADE TILL (0 to 3) ÄNDRA DE TILL CLK
   signal clk_8hz      : std_logic;
	signal CLK_s        : std_logic; 
   
   signal Qn_s         : std_logic_vector(0 to 3);
   signal Q_s          : std_logic_vector(0 to 3);
   signal C_s          : std_logic_vector(0 to 3);
-------------------------------------------------------------------------------------
-- Ändras under programmering för att testa att saker fungerar.----------
   signal button_count : std_logic_vector(1 downto 0) := "00";
-------------------------------------------------------------------------
 
begin

   CLK <= clk_8hz;

------------------------------------------------------------------------------
-- Flip flopar för uppräkning
--   fem* stycken totalt för metastabilitet och fyra för uppräkning.
--   * = Om tid finnes.
------------------------------------------------------------------------------   
      
   dff0 : D_flip_flop
      port map   -- _s betyder att det är signalsidan.
      (
         CLK => CLK_s,
         D => C_s(0),
         Qn => Qn_s(0),
         Q => Q_s(0)
      );

   
   dff1 : D_flip_Flop
      port map   -- _s betyder att det är signalsidan.
      (
         CLK => CLK_s,  --TOG BORT (1)
         D => C_s(1),
         Qn => Qn_s(1),
         Q => Q_s(1)
      );

      
   dff2 : D_flip_Flop
      port map   -- _s betyder att det är signalsidan.
      (
         CLK => CLK_s,
         D => C_s(2),
         Qn => Qn_s(2),
         Q => Q_s(2)
      );

      
   dff3 : D_flip_Flop
      port map   -- _s betyder att det är signalsidan.
      (
         CLK => CLK_s,
         D => C_s(3),
         Qn => Qn_s(3),
         Q => Q_s(3)
         );


-------------------------------------------------------------------------------------------
-- Nedan är ekvationerna från Logic Friday konverterade från sanningstabellen NS+UT
--  
------------------FAKTORISERADE MED HJÄLP AV LOGIC FRIDAY----------------------------------
-- K0 = Q3' B (Q2 Q1' Q0' + (Q0 (Q1' + Q1) + Q1 Q0') (Q2' + Q2));
-- K1 = B (Q3 Q2 Q1' Q0' + Q3' (Q0 (Q1' + Q1) + Q1 Q0') (Q2' + Q2));
-- K2 = B (Q3' Q1 (Q0' + Q0) (Q2' + Q2) + Q1' (Q2 Q0' (Q3' + Q3) + Q3' Q2' Q0));
-- K3 = B (Q3 Q2 Q1' Q0' + Q3' (Q2 Q1' Q0' + Q2' Q1 Q0 + (Q1 Q0' + Q1' Q0) (Q2' + Q2)));
-- K4 = B (Q3' Q0 (Q1' + Q1) (Q2' + Q2) + Q0' (Q2 Q1' (Q3' + Q3) + Q3' Q2' Q1));

-- MINIMNERAD // DENNA ANVÄNDS \\
-- K0 = Q3' Q2 B + Q3' Q1 B + Q3' Q0 B;
-- K1 = Q3' Q1 B + Q3' Q0 B + Q3 Q2 Q1' Q0' B;
-- K2 = Q3' Q1 B + Q3' Q2' Q0 B + Q2 Q1' Q0' B;
-- K3 = Q2 Q1' Q0' B + Q3' Q2' Q0 B + Q3' Q1' Q0 B + Q3' Q1 Q0' B;
-- K4 = Q3' Q0 B + Q3' Q2' Q1 B + Q2 Q1' Q0' B;
-------------------------------------------------------------------------------------------

--         K0 = Q3' Q2 B + Q3' Q1 B + Q3' Q0 B;
leds(0) <= (NOT(Q_s(3))    AND Q_s(2) AND button) 
           OR (NOT(Q_s(3)) AND Q_s(1) AND button)
           OR (NOT(Q_s(3)) AND Q_s(2) AND button);  

--         K1 = Q3' Q1 B + Q3' Q0 B + Q3 Q2 Q1' Q0' B;
leds(1) <= (NOT(Q_s(3)) AND Q_s(1) AND button)
           OR (NOT(Q_s(3)) AND Q_s(0) AND button)
           OR (Q_s(3) AND Q_s(2) AND NOT(Q_s(1)) AND NOT(Q_s(0)) AND button);

--         K2 = Q3' Q1 B + Q3' Q2' Q0 B + Q2 Q1' Q0' B;
leds(2)<=  (NOT(Q_s(3)) AND Q_s(1) AND button)
           OR (NOT(Q_s(3)) AND NOT(Q_s(2)) AND Q_s(1) AND button)
           OR (Q_s(2) AND NOT(Q_s(1)) AND NOT(Q_S(0)) AND button);

--         K3 = Q2 Q1' Q0' B + Q3' Q2' Q0 B + Q3' Q1' Q0 B + Q3' Q1 Q0' B;
leds(3) <= (Q_s(2) AND NOT(Q_s(1)) AND NOT(Q_s(0)) AND button)
           OR (NOT(Q_s(3)) AND NOT(Q_s(1)) AND Q_s(0) AND button)
           OR (NOT(Q_s(3)) AND Q_s(1) AND NOT(Q_s(0)) AND button);

--         K4 = Q3' Q0 B + Q3' Q2' Q1 B + Q2 Q1' Q0' B;
leds(4) <= (NOT(Q_s(3)) AND Q_s(0) AND button)
           OR (NOT(Q_s(3)) AND NOT(Q_s(2)) AND Q_s(1) AND button)
           OR (Q_s(2) AND NOT(Q_s(1)) AND NOT(Q_s(0)) AND button);

end architecture;
flip-flop filen.

Kod: Markera allt

----------------------------------------------------------------
-- 1. Tala om de libraries som ska användas
----------------------------------------------------------------
library IEEE ;
use     IEEE.std_logic_1164.all;


----------------------------------------------------------------
-- 2. Definiera entity med in- och utgångar
--    Här läggs Reset-signal till så att flipflopen kan sättas i
--    ett definierat tillstånd med Q=0 (och Qn=1)
----------------------------------------------------------------
entity D_flip_flop is
   port(
	   D, CLK         : in  std_logic;   -- D = data,C => CLK = klocka, TOG BORT => Reset
      Q, Qn          : out std_logic
      );
end entity D_flip_flop;


----------------------------------------------------------------
-- 3. Beskriv kretsens arkitektur
--  a. Definiera signaler (om det behövs). Sker INNAN begin
--  b. Beskriv hur entiteten fungerar
----------------------------------------------------------------

architecture behaviour of D_flip_flop is

--variable Reset : integer := 0;


begin

--  b. flipflopen beskrivs med en process
	
   process(D, CLK) -- Reset borttaget.
		begin
			if (CLK='1' and CLK'event) then   -- stigande flank sätter Q
				--if (Reset = '0') then
					Q <= D;     -- Sätt flipflop
					Qn <= not(D);
				else
					Q <= '0';   -- Reset (synkron eftersom den sätts på clk-flanken)
					Qn <= '1';
				--end if;
			end if;
   end process;
	
	

end architecture behaviour;

clock_ticker = 8Hz pulsen.

Kod: Markera allt

-----------------------------------------------------------------------
-- FILNAMN: clock_ticker.vhd
-- Libraries.
--
-----------------------------------------------------------------------
library IEEE;                     -- IEEE biblioteket.
use     IEEE.std_logic_1164.all;  -- Standardbiblioteket
use     IEEE.numeric_std.all;     -- Bibliotek för aritmetiska funktioner.

--------------------------------------------------------------------------
-- ENTITY
-- Bygga en klocka men periodtiden 1 sekund.
-- 50MHz in 1Hz ut.
-- ENTITY är till för portarna, själva ytterkanten av "lådan".
--------------------------------------------------------------------------
entity clock_ticker is
   port 
	   (
	      clk_50, reset      : in  std_logic; -- TOG BORT RESET.
	      clk_4hz, clk_8hz   : out std_logic
	   );



end entity clock_ticker;

--------------------------------------------------------------------------
-- ARCHITECTURE // "UTFÖRANDE" Man kan skriva end archi. namn med.
--------------------------------------------------------------------------

architecture behaviour of clock_ticker is

      signal count : integer := 0;
		
 begin
   process (clk_50, reset)
	   begin
		   if (reset = '1') then
			   count <= 1;
			elsif (clk_50 'event and clk_50 = '1') then -- Apostrof före event används för att styra atribut 'event.
			   count <= count + 1;
				if (count = 50000000) then
				   count <= 1;
				end if;
			end if;
			
			
			-- PULS FÖR 4HZ
			if (count = 12500000) then
			   clk_4hz <= '1';
			else
			   clk_4hz <= '0';
			end if;
			
			
			-- PULS FÖR 8HZ
			if (count = 6250000) then
			   clk_8hz <= '1';
			else
			   clk_8hz <= '0';
			end if;
			

	end process;

end architecture behaviour;
Användarvisningsbild
ojz0r
Inlägg: 244
Blev medlem: 14 september 2007, 19:38:04
Ort: Växjö

Re: VHDL - Skolprojekt bakljus till cykel.

Inlägg av ojz0r »

Jag har inte skrivit VHDL, bara verilog.
Ett tips; glöm inte bort att debounce:a trycckknappen, det kan skapa konstiga fel annars.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: VHDL - Skolprojekt bakljus till cykel.

Inlägg av Repaterion »

Hej, jo det kan ställa till en hel del skit i dessa miljöer.
Vi använder utvecklingskort så det kan vara inbyggt i dem från början för jag har inte märkt utav någon direkt kontaktstuds vid labb, kan varit tur bara.

Verilog är ju som C fast allt utom C som jag förstått detta, en av lärarna sa att VHDL är skrivet av folk som kan hårdvara men inte programmering och Verilog är tvärtom. Sant eller ej låter jag vara osagt.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

Re: VHDL - Skolprojekt bakljus till cykel.

Inlägg av agehall »

VHDL vs Verilog är lite religion över. Det må vara hänt att VHDL är uppfunnet av folk som har närmare kopplingar till elektronik än mjukvara, men det får mina ögon att blöda och det är självplågeri att använda när det finns SystemVerilog.

Du har även helt rätt i att SystemVerilog (och vanlig Verilog) ser väldigt mycket ut som C på många sätt. Jag föredrar helt klart att köra SV av den anledningen. Så länge man har i bakhuvudet att det är hårdvara och inte mjukvara man skriver, så funkar det utan problem.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: VHDL - Skolprojekt bakljus till cykel.

Inlägg av Mr Andersson »

Can't infer register for "Qn" at D_flip_flop.vhd(38) because it does not hold its value outside the clock edge
Fungera lite på vad den här koden gör när du kommenterat bort delar av if-satsen men lämnat 'else'.

Kod: Markera allt

if (CLK='1' and CLK'event) then
  --if (Reset = '0') then
    Q <= D;
    Qn <= not(D);
  else
    Q <= '0';
    Qn <= '1';
  --end if;
end if;
Det blir

Kod: Markera allt

if (CLK='1' and CLK'event) then
  Q <= D;
  Qn <= not(D);
else
  Q <= '0';
  Qn <= '1';
end if;
Dvs du försöker sätta Q & Qn utanför klockflanken.

PS. Använd rising_edge(clk) istället för CLK='1' and CLK'event
Skillnaden är att
CLK='1' and CLK'event triggar när signalen ändras till 1
rising_edge(clk) triggar när signalen ändras från 0 till 1
Skillnaden är subtil och resultaten blir likadant i hårdvara eftersom en signal i verkligheten alltid har eller inte har spänning. Däremot kan det bli stora skillnader i simulering (fundera på vilka logiska värden som finns förutom 0 & 1) och man vill absolut inte att simulering och hårdvara ger olika resultat.
Skärmbild 2022-07-07 153435.png
Se bild ovan. Q1 är 'event och Q2 är rising_edge

Du behöver inte ha med D i sens-listan, det är för asynkrona signaler. Men det gör ingen skillnad om du har den med eller inte så det är mest en smaksak.
En del tycker att man ska med alla signaler som används i processen, andra att man bara har signalerna som faktiskt driver processen.

Sen har Bike-filen också en massa problem. Bl.a. läser du från flera signaler som inte har någon driver.

VHDL & verilog är bägge på "slita ut håret i frustration"-nivå. Systemverilog är ett enormt steg framåt. :)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: VHDL - Skolprojekt bakljus till cykel.

Inlägg av Repaterion »

Tack för svar.

Okej, nej vi har inte pysslat alls med SV utan enbart VHDL tror läraren i programmering visade oss skillnaden mellan dessa snabbt 10min på en lektion, eller var det Verilog kanske.

Men på FF så CLK måste in för att ge dessa en klockpuls/takt, D är väll Data alltså min tryckknapp?
Frågar då du skrev att jag har en massa signaler jag inte "driver" vet inte om jag hänger med på hur du menar med driver.
Är det att de bara är deklarerade utan att användas eller tänker jag helt fel.

Lägger med Karnaugh och flödesschemat nedan.
Karnaughdiagrammet.
Bild

Flödesschemat.
Bild
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: VHDL - Skolprojekt bakljus till cykel.

Inlägg av Mr Andersson »

Exempel

Kod: Markera allt

dff0 : D_flip_flop
  port map   -- _s betyder att det är signalsidan.
  (
     CLK => CLK_s,
     D => C_s(0),
     Qn => Qn_s(0),
     Q => Q_s(0)
  );
Du använder C_s till D-ingången på alla FF, men du har ingenting som skriver till C_s. Den är permanent låg.
Samma med CLK_s.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: VHDL - Skolprojekt bakljus till cykel.

Inlägg av Repaterion »

CLK är numera omskriven från CLK till CLK <= clk_8hz vilken kommer från "clock_ticker"-filen.
I den filen ligger två klockor, en på 4Hz och en på 8Hz, men det skall räcka att använde 8Hz klockan,
när jag pratade med lärare om detta innan han gick på semester.
Användarvisningsbild
Repaterion
Inlägg: 538
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: VHDL - Skolprojekt bakljus till cykel.

Inlägg av Repaterion »

Hejsan igen!

Nu har vi äntligen fått skiten att fungera, men vi har ett skumt problem... eller problem och problem.
Det är samma "fenomen" i både processbeskriven och... öööö... hjärnsläpp "logiskt uppbyggd" via D flip flopar.
Det tar ca 3-4min innan programmet startar :roll: Någon som har möjlighet att testa denna fil på ett FPGA kort?
Eller teori på vad som kan orsaka detta? Det är inte kritiskt för att få inlämningen godkänd men kan ju vara intressant att veta.
Hela projektet ligger som en qtf arkiv eller vad de heter i Quartus.
lampa.rar
Den är designad runt 5CEBA4F23C7 i alla fall. Cyclone V.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar