Till KTH:s startsida Till KTH:s startsida

Visa version

Version skapad av William Sandqvist 2014-11-04 16:34

Visa < föregående | nästa >
Jämför < föregående | nästa >

VHDL för ett kodlås (sw)

VHDL för ett kodlås   

Beskrivning av kodlåsmallen

 codelockVHDL.pdf

Kodlåsmallen gäller för ett förenklat lås som öppnar när man trycker på tangenten för "1" och sedan släpper tangenten.

Så gott som all digital design sker numera med hjälp av högnivåspråk som VHDL/VERILOG. Vår grundkurs i digital-teknik ger inte utrymme att lära ut VHDL-språket, däremot kommer Du att kunna omforma "kodlåsmallen" till användbar VHDL-kod inför laborationen.

Tycker Du att VHDL-språket verkar intressant, så har skolan sedan flera digitaltekniska fortsättningskurser.


lockmall.vhd

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

entity codelock is
   port( clk:      in  std_logic;
           K:      in  std_logic_vector(1 to 3);
           R:      in  std_logic_vector(1 to 4);
           q:      out std_logic_vector(4 downto 0);
           UNLOCK: out std_logic );
end codelock;

architecture behavior of codelock is
subtype state_type is integer range 0 to 31;
signal state, nextstate: state_type;
  
begin
nextstate_decoder: -- next state decoding part
process(state, K, R)
 begin
   case state is
      when 0 => if (K = "001" and R ="0001")     then nextstate <= 1;
                else nextstate <= 0;
                end if;
      when 1 => if (K = "001" and R = "0001")    then nextstate <= 1;
                elsif (K = "000" and R = "0000") then nextstate <= 2;
                else nextstate <= 0;
                end if;
      when 2 to 30 => nextstate <= state + 1;
      when 31 => nextstate <= 0;
   end case;
end process;

debug_output:  -- display the state
q <= conv_std_logic_vector(state,5);
	
output_decoder: -- output decoder part
process(state)
begin
  case state is
     when 0 to 1  => UNLOCK <= '0';
     when 2 to 31 => UNLOCK <= '1';
  end case;	
end process;

state_register: -- the state register part (the flipflops)
process(clk)
begin
  if rising_edge(clk) then
     state <= nextstate;
  end if;
end process;
end behavior;

 lockmall.vhd


Mooreautomat

Kodlåset är utformat som en Moore-atomat.

De olika blocken identifieras i koden med etiketter, "labels".


VHDL processer

Med "processer" kan man beskriva vad ett block ska utföra utan att behöva gå in på detaljer om hur detta skall gå till.

VHDL-koden är skriven som ett antal sådana processer.


Programmets delar

entityarchitecturenext_state_decoder:output_decoder:state_registers:


entity

Programmets entity är en beskrivning av kodlåset som en "black box" med insignaler och utsignaler.


Bitar och Bitvektorer

Genom att välja datatyper som stämmer överens med problemet, blir det mindre risk för misstag. Man kan tex. anpassa indexeringen av variabler så att den överensstämmer med hur detta anges i datablad, på så sätt minimerar man risken att man "skriver av" fel.


Architecture - egendefinierade datatyper

Avsnittet architecture innehåller beskrivningen av blockets beteende.

Vi skapar här en egendefinierad datatyp state_type som passar för att beskriva Moore-automatens tillstånd. Fördelen med detta är att kompilatorns felutskrifter kan hjälpa oss, om vi råkar använda värden utanför variablernas definitionsområden.


Architecture - tillståndsavkodaren

Nästa tillstånds avkodaren är programmets centrala del. Genom att använda case-satsen kan man skriva koden så att den helt följer tillståndsdiagrammet.


Felsökningshjälpmedel - state som visas med fem lysdioder

För att kunna felsöka hårdvaran, labutrustningen, vill vi kunna följa vilket tillstånd automaten befinner sig i. Funktionen conv_std_logic_vector() omvandlar state (ett heltal mellan 0...31) till en 5-bitars bitvektor q, q(4) ... q(0). För att kunna använda denna konverteringsfunktion behöver man ta med biblioteket IEEE.std_logic_arith.all.


Utgångsavkodaren

Utgångsavkodaren är skriven "rakt på sak" med ett case-uttryck.


Tillståndsregistret

Genom att vi använder funktionen rising_edge(clk) "förstår" kompilatorn att vi vill utnyttja vipporna som finns i MAX-kretsen för att bygga ett register.



Vid laborationen utökar Du denna kod till ett fyrsiffrigt kombinationslås!