UMEÅ UNIVERSITET Tillämpad fysik och elektronik Lars Wållberg 2005-01-01 ver 1.0 Grundläggande kunskaper om Strukturell VHDL och TESTBÄDD Innehållsförteckning. sid Strukturbeskrivning 2 Digitalkonstruktionen ex_mix 2 Blockschema ex_mix 3 Component-deklaration och Package 5 Strukturbeskrivning/Komponentinstansiering 6 Kodexempel 6 Testbänkar 7 Kodexempel 8-12 1
STRUKTURBESKRIVNING Vid systemkonstruktion är det fördelaktigt att kunna beskriva ingående komponenter med ett språk som liknar vårt eget sätt att förmedla information. Man använder vad som kallas ett högnivåspråk. Komponenter är ett viktigt begrepp, de är de delar som ett system byggs upp av. Varje del i systemet kan då testas med simulering. Hur komponenterna i systemet ska samarbeta kan ofta, speciellt i större system, vara svårare att beskriva med beteenden i ett högnivåspråk. Komponenter kan vara komplicerade att beskriva, hur komponenter ska samarbeta är ännu svårare att språkligtoch skriftligt entydigt beskriva. VHDL erbjuder strukturbeskrivning som ett alternativ. Strukturbeskrivning/Komponentinstansiering är liktydigt med att koppla ihop komponenter. I strukturbeskrivningens ENTITY deklareras konstruktionens ar. De ledningar, SIGNALer, som behövs anges i ARCHITECTURE och där även själva ihopkopplingen beskrivs PORT MAP). Digitalkonstruktionen ex_mix se fig nästa sida) Konstruktionen ex_mix har insignalerna in1, in2, in3, in4 och v samt utsignalen utg. ex_mix är uppbyggd av komponenterna lux, dux och fux,.med ar enligt figuren. Signalerna x, y, z används för att koppla ihop komponenterna. För att ex_mix ska få de egenskaper konstruktören vill måste han naturligtvis känna till de ingående komponenternas egenskaper, men för den formella strukturbeskrivningen är komponentegenskaperna helt ointressanta. Detta gäller även för den hierarkiska toppnivån ex_mix I den följande exempelfilen kommer komponenterna att ges egenskaper i respektive architecture för att ex_mix senare ska gå att simulera i en testbänk. För att kunna använda komponenter i en strukturbeskrivning måste de deklareras som COMPONENT s. Detta görs vanligtvis i ett PACKAGE som sedan hänvisas till i en USE-sats i strukturbeskrivningen. 2
Blockschemat nedan ger en bild av hur konstruktionen är tänkt att fungera. ex_mix in1 in2 u1:lux a0) ut1 a1) x u2:fux b1) b2) h utg u3:dux in3 in4 i j k ut2 y b3) v Observera att varje komponents beteckning skrivs inuti komponentblocket. 3
Här följer nu en VHDL-kod som beskrivs steg för steg. Först komponenternas entity och architecture utan kommentarer). entity lux is a :in std_logic_vector1 downto 0 ut1 :out std_logic architecture b_lux of lux is ut1 <= a0) and a1 entity dux is i,j,k :in std_logic; ut2 :out std_logic architecture b_dux of dux is ut2 <= i xor j) or k; entity fux is b :in std_logic_vector3 downto 1 v :in std_logic; h :out std_logic architecture b_fux of fux is p0: processb,v) if v='0' then h <= b1) xor b2) xor b3 else h <= b1) xnor b2) xnor b3 end if; end process; 4
COMPONENT-deklaration och PACKAGE. En komponent som ska användas i en strukturbeskrivning måste deklareras som COMPONENT. Denna deklaration ska vara en kopia av ENTITY för komponenten. COMPONENT-deklarationerna kan sedan placeras i ett PACKAGE som sedan anropas vid komponentinstansieringen. COMPONENT-deklarationen kan även göras i samma programdel där komponenterna kopplas samman strukturbeskrivningen/komponentinstansieringen). package mix_pkg is component lux a :in std_logic_vector1 downto 0 ut1 :out std_logic component dux i,j,k :in std_logic; ut2 :out std_logic component fux b :in std_logic_vector3 downto 1 v :in std_logic; h :out std_logic end package; 5
STRUKTURBESKRIVNING/KOMPONENTINSTANSIERING Portarna för ex_mix finns i blockschemat tidigare i kompendiet. Här har ingen av dem deklarerats som vektorer. Denna omständighet gör att vi i ARCHITECTURE måste deklarera två temporära signaler a_temp och b_temp. I PORT MAP måste de mappade signalerna vara av samma typ. Det finns skrivsätt i VHDL där enskilda ar kan sammanfogas till vektorer, men vår mjukvara Warp/Galaxy)har svårt med dessa skrivkonstruktioner. Här följer källkoden för strukturbeskrivningen ex_mix med några kommentarer. use work.mix.pkg.all; entity ex_mix is in1,in2,in3,in4 :in std_logic; v :in std_logic; utg :out std_logic architecture b_ex_mix of ex_mix is signal x,y :std_logic;-- signals for wireing COMPONENTS signal a_temp :std_logic_vector1 downto 0 -- signal for typeadapt -- a in lux signal b_temp :std_logic_vector3 downto 1-- signal for typ adapt -- b in fux a_temp1) <= in2;-- elementtilldelning a_temp0) <= in1; -- elementtilldelning b_temp1) <= x; -- elementtilldelning b_temp2) <= in2; -- elementtilldelning b_temp3) <= y; -- elementtilldelning u1: lux mapa_temp,x--position mapping ; u2: dux mapj=>in3,i=>in2, k=>in4, ut2=>y-- name mapping u3: fux mapb_temp,v,utg--position mapping Kommentarer: a i lux är en vektor och i fux är b en vektor u1, u2, u3 är etiketter som måste finnas med. Namnvalet på etiketterna kan väljas godtyckligt. OBServera att komponentnamnet måste finnas med. Två olika typer av mappning kan användas: 1) positionsmappning innebär att toppentitetens ex_mix) ar och deklarerade signaler skrivs in i den position/ordnig somde är deklareradei komponentens entity. 2) namnmappning innebär att ar i komponentens entity kopplas till toppentitetens ex_mix) ar och signaler med operatorn =>. Här spelar ordningen ingen roll. OBSservera att ar och signaler måste vara av samma typ vid mappningen. 6
Testbänkar När en konstruktion har beskrivits med VHDL, behövs en kontroll för att se om specifikatiionen följts. Vid simulering är en vanlig metod att man ger insignalerna olika stimuli och därefter avläser utsignalerna. Nackdelen är mångfalden av simuleringsspråk och sätten att ge insignalerna värden varierar. VHDL erbjuder ett sätt att skriva testmönstergenereringen. Det finns även möjlighet att kontrollera utsignalerna i en VHDL-testbänk. Vid större konstruktioner är det omöjligt att kontrollera utsignalerna för alla insignalskombinationer.under konstruktionsarbetet utsätts ingående komponenter för omfattande simuleringar. I den konstruktion där komponenterna ingår testas därför endast kritska insignaler, det vill säga sådana signaler som man tror kan generera felaktiga utsignaler. En testbänk i VHDL-kod liknar en srtukturbeskrivning. Man deklarerar sin konstruktion som en komponent och ansluter signaler till arna. Stimuli värden)till insignalerna kan på olika sätt ges värden vid olika tidpunkter och utsignalerna kan kontrolleras antigen manuellt eller med en assert-sats i VHDL. I detta kompendium förutsätts att utsignalerna kontrolleras manuellt. Två exempel på testbänkar kommer att exemplifieras där insignalerna ges värden på olika sätt. OBServera!! Simulatorn som vi använder, Aktiv HDL-sim, kräver att all kod finns i simuleringsfilen. Den mjukvaruegenskapen är något besvärande, men med copy-paste i editorn samt att programmet är gratis gör att man kan ha överseende med detta krav. En komplett simuleringsfil redovisas först, sedan med en modifierad kod för insignalstimuli. 7
VHDL-kod för simuleringsfilen sim_ex_mix0 entity lux is a :in std_logic_vector1 downto 0 ut1 :out std_logic architecture b_lux of lux is ut1 <= a0) and a1 entity dux is i,j,k :in std_logic; ut2 :out std_logic architecture b_dux of dux is ut2 <= i xor j) or k; entity fux is b :in std_logic_vector3 downto 1 v :in std_logic; h :out std_logic architecture b_fux of fux is p0: processb,v) if v='0' then h <= b1) xor b2) xnor b3) else h <= b1) xnor b2) and b3) end if; end process; 8
library ieee; package mix_pkg is component lux a :in std_logic_vector1 downto 0 ut1 :out std_logic component dux i,j,k :in std_logic; ut2 :out std_logic component fux b :in std_logic_vector3 downto 1 v :in std_logic; h :out std_logic end package; 9
use work.mix_pkg.all;-- call of COMPONENTs in PACKAGE mix_pkg entity ex_mix is in1,in2,in3,in4 : in std_logic; v : in std_logic; utg : out std_logic architecture b_ex_mix of ex_mix is signal x,y :std_logic;-- signals for wireing COMPONENTS signal a_temp :std_logic_vector1 downto 0 -- signal for type adapt -- a in lux signal b_temp :std_logic_vector3 downto 1 -- signal for type adapt -- b in fux a_temp1) <= in2; a_temp0) <= in1; b_temp1) <= x; b_temp2) <= in2; b_temp3) <= y; u1: lux mapa_temp,x --position mapping u2: dux mapj=>in3,i=>in2, k=>in4, ut2=>y --name mapping u3: fux mapb_temp,v,utg --position mapping package ex_mix_pkg is component ex_mix in1,in2,in3,in4 : in std_logic; v : in std_logic; utg : out std_logic end package; 10
use work.ex_mix_pkg.all; entity sim_ex_mix is -- en entity utan ar!! architecture b_sim_ex_mix of sim_ex_mix is signal in1,in2,in3,in4 : std_logic; signal v : std_logic; signal utg : std_logic; u: ex_mix mapin1,in2,in3,in4,v,utg v <= '0', '1' after 200 ns; in1 in2 <= '0', <= '0', '1' after 300 ns; '1' after 50 ns, '0' after 100 ns, '1' after 200 ns, '0' after 350 ns; in3 <= '1', in4 <= '0', '0' after 150 ns, '1' after 400 ns; '1' after 50 ns, '0' after 100 ns, '1' after 200 ns, '0' after 350 ns; 11
Här visas ett annat sätt att tilldela insignalerna stimuli. Koden som redovisas är bara den som skiljer sig från sim_ex_mix0 OBServera att signalerna måste ges ett startvärde.värdena ges med operatorn := i signaldeklarationen. Utsignaler får aldrig ges några värden. VHDL-kod för simuleringsfilen sim_ex_mix1 use work.ex_mix_pkg.all; entity sim_ex_mix is -- en entity utan ar!! architecture b_sim_ex_mix of sim_ex_mix is signal in1,in2,in3,in4 : std_logic:='0';--ges startvärdena 0 signal v : std_logic:='0'; ;--ges startvärdet 0 signal utg : std_logic; u: ex_mix mapin1,in2,in3,in4,v,utg in1 <= not in1 after 10 ns; in2 <= not in2 after 20 ns; in3 <= not in3 after 40 ns; in4 <= not in4 after 100 ns; v <= not v after 200 ns; 12