Till KTH:s startsida Till KTH:s startsida

Ändringar mellan två versioner

Här visas ändringar i "VHDL for a codelock (en)" mellan 2014-11-03 14:05 av William Sandqvist och 2014-11-04 17:04 av William Sandqvist.

Visa < föregående | nästa > ändring.

VHDL for a codelock (en)

VHDL för ett kodlås Beskrivning av kodlåsmallen [IMAGE] 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¶



Visa tidigare händelser (2) ¶