VHDL för ett kodlås (sw)

sw VHDL för ett kodlås   

Beskrivning av kodlåsmallen

pdf  codelockVHDL.pdf

mallstatedia.gif

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;

 vhdlfile  lockmall.vhd   ( text.gif lockmall.txt)


Mooreautomat

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

mooremodel.png

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

labels.gif


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.

process.png

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


Programmets delar

parts.png

entity  architecture  next_state_decoder:  output_decoder:  state_registers:


entity

entity.png

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


Bitar och Bitvektorer

bitvektor.png

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.

datatyp.png

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

next_state_decoder.png

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

debug.png

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

output_decoder.gif

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


Tillståndsregistret

stateregister.png

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!

4digit.png

Lärare William Sandqvist skapade sidan 3 november 2014

Lärare William Sandqvist ändrade rättigheterna 3 november 2014

Kan därmed läsas av alla inloggade användare och ändras av alla inloggade användare.

Lärare William Sandqvist ändrade rättigheterna 3 november 2014

Kan därmed läsas av alla och ändras av alla inloggade användare.
Feedback Nyheter