Op deze pagina vindt u informatie over de taal VHDL. Ik heb als keuzevak het practicum VHDL gekozen als onderdeel van mijn opleiding elektrotechniek aan de Hanzehogeschool Groningen. We hebben de theorie maar vrij beknopt behandeld aan de hand van het boek 'VHDL for Programmable Logic' van Kevin Skahill. De meeste kennis heb ik opgedaan door het maken van practicumopdrachten.
VHDL is de beste technologie voor het maken van de beste hardware. De beste studenten bakken daarom ook de beste VHDL code. Opvallend is wanneer je zoekt naar webpagina's over VHDL, dat je veelal nerd websites tegenkomt. Zelf ben ik geen nerd, maar ik doe mijn best er een te worden, aan mijn nacht-dag-ritme zal het in ieder geval niet liggen.
- Wat is VHDL?
VHDL betekent 'Very High Density Integrated Circuit Hardware Description Language' en is dus een taal om hardware mee te beschrijven. Op deze manier kan een andere nerd zo zien wat jouw hardware eigenlijk doet (of hoe deze is opgebouwd). Bovendien kan men behalve een strikte hardware beschrijving kiezen voor een meer functionele beschrijving (maar dat hoeft niet).
Hieronder heeft Roderik voor u bijvoorbeeld een soort van BCD omhoog en ook omlaag counter gemaakt. Je kunt de output bereiden zoals je wilt, evenals pot noodles overigens.
-- wk 3, opdracht 5
-- Marinus van Heuvelen, Roderik Emmerink
-- 4 bits BCD up/down counter.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity bcd_count_e is
port (
clk : in std_logic; -- kloksignaal
clear : in std_logic; -- asynchrone clear
enable : in std_logic; -- enable signaal voor load en count
updown : in std_logic; -- 1 -> optellen, 0 -> aftellen
ldcnt : in std_logic; -- 1 -> tellen, 0 -> laden van d
d : in std_logic_vector(3 downto 0); -- data-load ingangen
q : out std_logic_vector(3 downto 0); -- telleruitgangen
co : out std_logic -- carry out, 1 als:
-- teller 9 en optellen of
-- teller 0 en aftellen.
);
end bcd_count_e;
architecture gedrag of bcd_count_e is
signal c : unsigned(3 downto 0);
begin
process(clk,clear)
begin
if clear = '1' then
c <= (others =>'0');
elsif clk'event and clk='1' then
if enable = '1' then
if c = "1001" and updown = '1' then
c <= (others =>'0');
elsif c = "0000" and updown = '0' then
c <= "1001";
else
if updown = '1' then
c <= c + 1; -- optellen
else
c <= c - 1; -- aftellen
end if;
end if;
end if;
end if;
end process;
-- carry out is 1 bij optellen en getal 9
-- carry out is 1 bij aftellen en getal 0
-- carry out is 0 in alle andere gevallen.
co <= '1' when c = "1001" and enable='1' and updown = '1' else
'1' when c = "0000" and enable='1' and updown = '0' else
'0';
q <= std_logic_vector(c);
end gedrag;
Het is natuurlijk nog veel leuker als je dit cascadeert naar een twee digit counter. Dus doen we dat ook even met de volgende code (dat gaat alleen niet helemaal goed met de signalen):
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity bcd2_count_e is
port (
clk : in std_logic;
clear : in std_logic;
enable : in std_logic;
ud : in std_logic;
ldcnt : in std_logic;
d : in std_locic_vector(7 downto 0);
q : out std_logic_vector(7 downto 0);
co : out std_logic
);
end bcd2_count_e;
architecture gedrag of bcd2_count_e is
component bcd_count_e port (
clk : in std_logic;
clear : in std_logic;
enable : in std_logic;
updown : in std_logic;
ldcnt : in std_logic;
d : in std_logic_vector(3 downto 0);
q : out std_logic_vector(3 downto 0);
co : out std_logic
); end component;
for all : bcd_count_e use entity work.bcd_count_e(gedrag);
signal e : std_logic_vector(1 to 2);
begin
c1 : bcd_count_e port map (
clk => clk,
clear => clear,
enable => enable,
updown => ud,
ldcnt => ldcnt,
d => d(3 downto 0),
q => q(3 downto 0),
co => e(1)
);
c2 : bcd_count_e port map (
clk => clk,
clear => clear,
enable => e(1),
updown => ud,
ldcnt => ldcnt,
d => d(7 downto 4),
q => q(7 downto 4),
co => co
);
end gedrag;
© Copyright 2025 Roderik Emmerink, hosting en webdesign door Archytas.
Alle rechten voorbehouden |