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;
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;
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;