DESIGN AV SEKVENTIELL LOGIK Innehåll Timing i synkrona nätverk Synkrona processer i VHDL VHDL-kod som introducerar vippor (flip-flops) och latchar Initiering av register Mealy- och Moore-maskiner i VHDL Räknare, register, RAM/ROM FSMD FSM med Dataflöde 1
TIMING I SYNKRONA SYSTEM Generell modell för ett synkront system t C-Q och t SETUP är fördröjningar i vipporna Q1 D2 Q2 Kombinatorisk logik t SETUP C t C-Q t LOGIC C En klockcykel är summan av fördröjningarna: T t C Q t LOGIC t SETUP t MARGIN Q1 D2 t C-Q t LOGIC t MARGIN t SETUP Utan någon tidsmarginal får vi den högsta möjliga klockfrekvensen: f max 1 T min t C Q t 1 LOGIC t SETUP 2
SYNKRONA PROCESSER I VHDL Synkrona processer Kallas även klockade processer Alla aktiveras samtidigt vid den aktiva klockflanken Signaltilldelning i en synkron process resulterar i vippor inputs outputs clock 3
EXEMPEL: POSITIVE EDGE- TRIGGERED D-FF I VHDL library ieee; use ieee.std_logic_1164.all d DFF q entity dff IS port (d, clk : in std_logic; q : buffer std_logic); end dff; architecture behavior of dff is process(clk) clk if (clk event and clk = 1 ) then q <= d; else q <= q; clk event end process; end behavior; clk event and clk= 1 clk 4
FLER EXEMPEL PÅ VIPPOR architecture dataflow of pos_dff is q <= d when (clk event and clk= 1 ) else q; end dataflow; D Q architecture dataflow of neg_dff is q <= d when (clk event and clk= 0 ) else q; End dataflow; D Q 5
EXEMPEL: D-LATCH architecture dataflow of dlatch is q <= d when (clk = 1 ) else q; end dataflow; D Q 6
EXEMPEL: KOD SOM INTRODUCERAR VIPPOR I DESIGNEN Skriv en funktion som lagrar ett 8-bitars tal i ett register om talet är större än 10. Om talet är mindre än 10 ska istället registret få värdet 10. entity load_ge_10 is port ( clk : in std_logic; d : in std_logic_vector (7 downto 0); q : out std_logic_vector (7 downto 0)); end load_ge_10; architecture rtl of load_ge_10 is process (clk) if (clk'event and clk = '1') then if d > 10 then q <= d; else q <= conv_std_logic_vector(10,8); end process; end rtl; d 10 10 2:1 MUX 0 1 Signaltilldelning resulterar i introduktion av vippor. d>10 clk q 7
INITIERING AV VIPPOR När systemet startar måste vipporna initieras Två sorters initiering Synkron reset/preset Asynkron reset/preset Exempel: synkron reset if (clk event and clk = 1 ) then if reset = 1 then q <= 0 ; else q <= d; D Q reset 8
FORTS. INITIERING AV VIPPOR Exempel: Asynkron reset process (clk, reset) if reset = 1 then q <= 0 ; elsif (clk event and clk = 1 ) then q <= d; end process; D Q reset Exempel: Asynkron preset process (clk, preset) if preset = 1 then q <= 1 ; elsif (clk event and clk = 1 ) then q <= d; end process; D Q preset 9
DESIGN AV TILLSTÅNDSMASKINER Arbetsflöde för manuell design Skapa ett tillståndsdiagram som beskriver problemet Ta fram en tillståndstabell Koda tillstånden Ta fram en transitionstabell Välj minneselement (D-,T-,JK-?) Ta fram en excitationstabell Ta fram booleska uttryck för och Designa kretsen på grindnivå 10
DESIGN AV TILLSTÅNDSMASKINER Automatisk syntes Ta fram ett tillståndsdiagram för problemet Skriv VHDL-kod som beskriver problemet Automatisk syntes genomför kodningen av tillståndstabellen, och genererar en netlist på grind-nivå 11
EXEMPEL PÅ TILLSTÅNDSMASKIN I VHDL architecture rtl of fsm_simple is type state_type is (start, r1, r2); signal state : state_type; A=1 A=0 Moore -- rtl update_state : process (clk, reset) -- process fsm if reset = '0' then state <= start; elsif clk'event and clk = '1' then case state is when start => if A = '0' then state <= start; else state <= r1; when r1 => if A = '0' then state <= r1; else state <= r2; when r2 end case; end process update_state; output_logic : process(state) case state is when start => z <= '0'; when r1 => z <= '1'; when r2 => z <= '0'; end case; end process output_logic; end rtl; => if A = '0' then state <= r2; else state <= start; start z=0 r2 z=0 A=0 A=1 r1 z=1 A=1 A=0 12
MEALY-MASKIN I VHDL architecture mealy of fsm2 is type state is (S1, S2, S3, S4); signal present_state, next_state: state; process (ain, present_state) CASE present_state IS when s1 => if (ain = 1 ) then yout <= 0 ; next_state <= s4; else yout <= 1 ; next_state <= s3; when s2 => yout <= 1 ; next_state <= s3; when s3 => yout <= 1 ; next_state <= s1; when s4 => if (ain = 1 ) then yout <= 1 ; next_state <= s2; else yout <= 0 ; next_state <= s1; end case; end process; process wail until rising_edge(clk); present_state <= next_state; end process; end mealy; ain=-/ yout=1 ain=0/yout=0 S1 ain present_state S3 ain=1/ yout=0 ain=0/ yout=1 S4 S2 ain=-/yout=1 Q D ain=1/ yout=1 yout next_state 13
RÄKNARE I VHDL Modulo-8 räknare library ieee; use ieee.std_logic_1164.all; use work.numeric_std.all; entity modulo8 IS PORT(clk: in std_logic; cnt: buffer unsigned (7 downto 0)); END modulo8; architecture rtl of count8 is process (clk) if rising_edge(clk) then cnt <= cnt +1; end if end process; end rtl; 14
SHIFT-REGISTER I VHDL entity shift_r is port ( clk, resetn, d_in, shift_en : in std_logic; shift_out : out std_logic_vector(3 downto 0)); end shift_r; architecture rtl of shift_r is signal shift_reg: std_logic_vector(3 downto 0); process (clk, resetn) if resetn = '0' then shift_reg <= (others=>'0'); elsif clk'event and clk = '1' then if shift_en='1' then shift_reg(3 downto 1) <= shift_reg(2 downto 0); -- shift_reg <= shl(shift_reg, "1"); -- shift_reg <= shift_reg sll 1; shift_reg(0) <= d_in; end process; d_in shift_out shift_en resetn Alternativa metoder shift_out <= shift_reg; end rtl; 15
MINNEN I VHDL Ett RAM eller ROM kan designas på två sätt Använd datatypen array Använd ett fördefinierat makro för minneskretsen 16
EXEMPEL: 4 8 ROM I VHDL library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ROM is port ( address : in std_logic_vector(1 downto 0); dout : out std_logic_vector(7 downto 0)); end ROM; architecture rtl of ROM is type rom_table is array (0 to 3) of std_logic_vector(7 downto 0); constant rom_contents : rom_table := rom_table'("00101111", "11010000", "01101010", "11101101"); -- rtl dout <= rom_contents(conv_integer(address)); end rtl; 17
EXEMPEL #1: RAM I VHDL architecture rtl of rmodul is component RAM4_8 port ( din: in std_logic_vector(7 downto 0), address0, address1, we : in std_logic; dout : out std_logic_vector(7 downto 0)); end component; Definiera en förexisterande RAMmodul som finns i ett library -- rtl ram1: RAM4_8 port map ( din => d, address0 => a0, address1 => a1, we => we, dout => q) end rtl; d a0 a1 we RAM4_8 din dout address0 address1 we q 18
EXEMPEL #2: RAM I VHDL library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ram32_16 is port ( addr : in std_logic_vector(4 downto 0); clk, we_n : in std_logic; din : in std_logic_vector(15 downto 0); dout : out std_logic_vector(15 downto 0)); end ram32_16; architecture rtl of ram32_16 is type ram_type is array (31 downto 0) of std_logic_vector(15 downto 0); signal ram_array : ram_type; Definiera en matris RAM32_16 process(clk) if clk'event and clk='1' then if we_n='0' then ram_array(conv_integer(addr)) <= din; end process; dout <= ram_array(conv_integer(addr)); end rtl; din addr we_n dout 19
KOMPONENTER I EN DIGITAL DESIGN En digital design har generellt Minst en kontrollenhet (FSM) Minst en enhet för dataflöde Till exempel: adderare, multiplikator, komparator Register for tillfällig lagring av variabler Ofta har en design flera kontrollenheter och flera enheter för dataflöden Designmodell: FSM med dataflöde Beskriver funktionen för en design med både kontrollenhet och dataflöde 20
FSM MED DATAFLÖDE Kontrollingångar Kontrollsignaler Dataingångar Kontrollenhet Enhet för dataflöde Kontrollutgångar Statussignaler Datautgångar Kontrollingångar Dataingångar FSMD Kontrollutgångar Datautgångar 21
DESIGNEXEMPEL Designa en funktion som beräknar: y a x b Typ Beskrivning #bits D in, data Positiva heltalsvärden för a, x och b i sekvens 8 start in, control Påbörja beräkningen av Y, active high 1 busy out, control Indikera att enheten är upptagen med att beräkna 1 Y out, data Det beräknade värdet av Y 17 reset in, control Initiera enheten 1 clk start D a = 5 x = 3 b = 10 busy Y Y=25 22
FORTS. DESIGNEXEMPEL D start reset clk Y = a x + b Y busy Externa kontrollsignaler som styr enheten reset start interna kontrollsignaler Externa datasignaler D Control unit storea storepr Datapath Extern kontrollsignal busy Y 23
FORTS. DESIGNEXEMPEL Start=0 D a = 5 x = 3 b = 10 D start Start=1 busy = 0 storea = 0 storepr = 0 clk storea EN geta busy = 1 storea = 1 storepr = 0 A X multax busy = 1 storea = 0 storepr = 1 clk storepr EN addb busy = 1 storea = 0 storepr = 0 A X + B A X+B Y 24
SAMMANFATTNING I en generell design används ofta modellen för FSMD Designflöde Specificera vilken algoritm som ska implementeras Identifiera Vilka komponenter som krävs för dataflödet Vilka tillstånd som krävs för kontrollenheten Vilka kontrollsignaler som krävs för dataflödet Vilka statussignaler som krävs för kontrollenheten Utveckla Tillståndsdiagram för kontrollenheten Blockdiagram för dataflödet 25
SLUT PÅ FÖRELÄSNING 7 Innehåll Timing i synkrona nätverk Synkrona processer i VHDL VHDL-kod som introducerar vippor (flip-flops) och latchar Initiering av register Mealy- och Moore-maskiner i VHDL Räknare, register, RAM/ROM FSMD FSM med Dataflöde 26