KTS - Cac BT Giai San Ve VHDL 2011

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 32

HBK Tp HCMKhoa TBMT Mn hc: K thut s GVPT: H Trung M Bi tp gii sn v VHDL (AY1112-S1) (Cc m VHDL c chy th trn Altera

a MaxplusII v10.2) 1. Vit m VHDL m s bit 1 ca s nh phn 3 bit A vi cc cch sau: a) Dng m hnh hnh vi b) Dng m hnh lung d liu c) Lnh case-when d) Dng m hnh cu trc Bi gii. Vi yu cu ca bi, ta c c bng chn tr sau: Ng vo A2 A1 A0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 Ng ra C1 C0 0 0 0 1 0 1 1 0 0 1 1 0 1 0 1 1

Phn u dng th vin IEEE v khai bo entity th ging nhau cho cc cch: TD: Vi khai bo ca cch 1: library ieee; use ieee.std_logic_1164.all; entity ONES_CNT_EX1 is

port ( A : in std_logic_vector(2 downto 0); C : out std_logic_vector(1 downto 0)); end ONES_CNT_EX1; a) M hnh hnh vi: architecture Algorithmic of ONES_CNT_EX1 is begin Process(A) -- Sensitivity List Contains only Vector A Variable num: INTEGER range 0 to 3; begin num :=0; For i in 0 to 2
Cc BT gii sn v VHDL 2011 trang 1

Loop IF A(i) = '1' then num := num+1; end if; end Loop; ---Transfer "num" Variable Value to a SIGNAL C C C C <= <= <= <= "00"; "01"; "10"; "11";

CASE num is WHEN 0 => WHEN 1 => WHEN 2 => WHEN 3 => end CASE; end process; end Algorithmic; Dng sng m phng hot ng:

Ch : C cch gii khc trong th d ca MaxplusII: -- MAX+plus II VHDL Example -- Combinatorial Process Statement -- Copyright (c) 1994 Altera Corporation ENTITY proc IS PORT ( d : IN BIT_VECTOR (2 DOWNTO 0); q : OUT INTEGER RANGE 0 TO 3 ); END proc; ARCHITECTURE maxpld OF proc IS BEGIN -- count the number of bits with the value 1 in word d PROCESS (d) VARIABLE num_bits : INTEGER; BEGIN
Cc BT gii sn v VHDL 2011 trang 2

num_bits := 0; FOR i IN d'RANGE LOOP IF d(i) = '1' THEN num_bits := num_bits + 1; END IF; END LOOP; q <= num_bits; END PROCESS; END maxpld; b) M hnh lung d liu architecture Two_Level of begin ONES_CNT_EX2 is

C(1) <= (A(1) and A(0)) or (A(2) and A(0)) or (A(2) and A(1)); C(0) <= (A(2) and not A(1) and not A(0)) or (not A(2) and not A(1) and A(0)) or (A(2) and A(1) and A(0)) or (not A(2) and A(1) and not A(0)); end Two_Level; Dng sng m phng hot ng:

c) Lnh case-when Process(A) -- Sensitivity List Contains only Vector A begin CASE A is WHEN "000" => C <= "00"; WHEN "001" => C <= "01"; WHEN "010" => C <= "01"; WHEN "011" => C <= "10"; WHEN "100" => C <= "01"; WHEN "101" => C <= "10"; WHEN "110" => C <= "10";
Cc BT gii sn v VHDL 2011 trang 3

WHEN "111" => C <= "11"; WHEN OTHERS => C <="ZZ"; end CASE; end process; end Truth_Table; d) Dng m hnh cu trc C nhiu cch gii cho phn ny. T bng chn tr ta c biu thc Boole cho cc ng ra: C1 = A1A0 + A0A2 + A1A2 + A0A1A2 C1 = A1A0 + A0A2 + A1A2 => cn AND 2 ng vo v OR 3 ng vo v C0 = A2A1A0 + A2A1A0 + A2A1A0 + A2A1A0 C0 = ((A2A1A0).( A2A1A0) .(A2A1A0).(A2A1A0)) => Cn NAND 3 ng vo, NAND 4 ng vo v cng NOT Mch cho C1 c t tn l MAJ3 v mch cho C0 c t tn l OPAR3. T c bi gii sau: ----------------- NOT gate ----------------------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY notgate IS PORT( i: IN STD_LOGIC; o: OUT STD_LOGIC); END notgate; ARCHITECTURE Dataflow OF notgate IS BEGIN o <= NOT i; END Dataflow; ----------------- 3-input NAND gate --------------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand3gate IS PORT( i1, i2, i3: IN STD_LOGIC; o: OUT STD_LOGIC); END nand3gate; ARCHITECTURE Dataflow OF nand3gate IS BEGIN o <= NOT(i1 AND i2 AND i3); END Dataflow; ----------------- 4-input NAND gate --------------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand4gate IS
Cc BT gii sn v VHDL 2011 trang 4

PORT( i1, i2, i3, i4: IN STD_LOGIC; o: OUT STD_LOGIC); END nand4gate; ARCHITECTURE Dataflow OF nand4gate IS BEGIN o <= NOT(i1 AND i2 AND i3 AND i4); END Dataflow; ----------------- 2-input AND gate --------------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY and2gate IS PORT( i1, i2: IN STD_LOGIC; o: OUT STD_LOGIC); END and2gate; ARCHITECTURE Dataflow OF and2gate IS BEGIN o <= i1 AND i2; END Dataflow; ----------------- 3-input OR gate ---------------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY or3gate IS PORT( i1, i2, i3: IN STD_LOGIC; o: OUT STD_LOGIC); END or3gate; ARCHITECTURE Dataflow OF or3gate IS BEGIN o <= i1 OR i2 OR i3; END Dataflow; ----------------- Majority of 3 bit number---------------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity MAJ3 is PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); end MAJ3; architecture Structural_M of MAJ3 is COMPONENT and2gate PORT( I1, I2: in STD_LOGIC; -- Declare Components O: out STD_LOGIC); -- To Be Instantiated
Cc BT gii sn v VHDL 2011 trang 5

END COMPONENT; COMPONENT or3gate PORT(I1, I2, I3: in STD_LOGIC; O: out STD_LOGIC); END COMPONENT; -SIGNAL A1, A2, A3: STD_LOGIC; -- Declare Maj3 Local Signals begin -- Instantiate Gates g1: and2gate PORT MAP (X(0), X(1), A1); g2: and2gate PORT MAP (X(0), X(2), A2); -- Wiring of g3: and2gate PORT MAP (X(1), X(2), A3); -- Maj3 g4: or3gate PORT MAP (A1, A2, A3, Z); -- Compts. end Structural_M; ------------------OPAR3 Circuit-----------------------------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity OPAR3 is PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); end OPAR3; architecture Structural_O of OPAR3 is COMPONENT notgate PORT( i: in STD_LOGIC; O: out STD_LOGIC); END COMPONENT; COMPONENT nand3gate PORT( I1, I2, I3: in STD_LOGIC; O: out STD_LOGIC); END COMPONENT; COMPONENT nand4gate PORT( I1, I2, I3, I4: in STD_LOGIC; O: out STD_LOGIC); END COMPONENT; -SIGNAL A1B, A2B, A0B, Z1, Z2, Z3, Z4: STD_LOGIC; begin -- Instantiate Gates g1: notgate PORT MAP (X(0), A0B); g2: notgate PORT MAP (X(1), A1B); g3: notgate PORT MAP (X(2), A2B); g4: nand3gate PORT MAP (X(2), A1B, A0B, Z1); g5: nand3gate PORT MAP (X(0), A1B, A2B, Z2); g6: nand3gate PORT MAP (X(0), X(1), X(2), Z3); g7: nand3gate PORT MAP (X(1), A2B, A0B, Z4);
Cc BT gii sn v VHDL 2011 trang 6

g8: nand4gate PORT MAP (Z1, Z2, Z3, Z4, Z); end Structural_O; -----------------ONES_CNT_EX4: Main Circuit-----------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity ONES_CNT_EX4 is port ( A : in STD_LOGIC_VECTOR(2 downto 0); C : out STD_LOGIC_VECTOR(1 downto 0)); end ONES_CNT_EX4; architecture Structural of ONES_CNT_EX4 is COMPONENT MAJ3 PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); END COMPONENT; COMPONENT OPAR3 PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); END COMPONENT; -begin -- Instantiate Components -c1: MAJ3 PORT MAP (A, C(1)); c2: OPAR3 PORT MAP (A, C(0)); end Structural; Dng sng ra m phng:

Ch : Ta c th s dng lun cc component c sn ca Altera MaxplusII. Tuy nhin lu phi khai bo component ng vi khai bo ca Altera MaxplusII! Cc cng logic ca Maxplus II c cc khai bo sau: 1) Cng NOT vi tn l A_NOT c khai bo sau: COMPONENT a_not PORT( a_in: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT;
Cc BT gii sn v VHDL 2011 trang 7

2) Cng AND c th c n ng vo (ANDn) vi n=2, 3, 4, 6, 8 v 12. TD: Khai bo sau cho cng AND c 2 ng vo: COMPONENT and2 PORT( IN1, IN2: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; 3) Cng OR c th c n ng vo (ORn) vi n=2, 3, 4, 6, 8 v 12. TD: Khai bo sau cho cng OR c 2 ng vo: COMPONENT or3 PORT(IN1, IN2, IN3: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; 4) Cng NAND c th c n ng vo (NANDn) vi n=2, 3, 4, 6, 8 v 12. 5) Cng NOR c th c n ng vo (NANDn) vi n=2, 3, 4, 6, 8 v 12. 6) Cng XOR 2 ng vo c tn l a_XOR vi khai bo sau: COMPONENT a_xor PORT(IN1, IN2: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; 7) Cng XNOR 2 ng vo c tn l a_XNOR Nh vy ta c li gii khc ngn hn nu s dng cc component c sn ca Maxplus II: ----- Use built-in components of MaxplusII ----------------- Majority of 3 bit number---------------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity MAJ3 is PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); end MAJ3; architecture Structural_M of MAJ3 is COMPONENT and2 PORT( IN1, IN2: in STD_LOGIC; -- Declare Components a_out: out STD_LOGIC); -- To Be Instantiated END COMPONENT; COMPONENT or3 PORT(IN1, IN2, IN3: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; -SIGNAL A1,A2,A3: STD_LOGIC; -- Declare Maj3 Local Signals begin -- Instantiate Gates g1: and2 PORT MAP (X(0), X(1), A1); g2: and2 PORT MAP (X(0), X(2), A2); -- Wiring of g3: and2 PORT MAP (X(1), X(2), A3); -- Maj3
Cc BT gii sn v VHDL 2011 trang 8

g4: or3 PORT MAP (A1, A2, A3, Z); -- Compts. end Structural_M; ------------------OPAR3 Circuit--------------------------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity OPAR3 is PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); end OPAR3; architecture Structural_O of OPAR3 is COMPONENT a_not PORT( a_in: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; COMPONENT nand3 PORT( IN1, IN2, IN3: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; COMPONENT nand4 PORT( IN1, IN2, IN3, IN4: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; -SIGNAL A1B, A2B, A0B, Z1, Z2, Z3, Z4: STD_LOGIC; begin -- Instantiate Gates g1: a_not PORT MAP (X(0), A0B); g2: a_not PORT MAP (X(1), A1B); g3: a_not PORT MAP (X(2), A2B); g4: nand3 PORT MAP (X(2), A1B, A0B, Z1); g5: nand3 PORT MAP (X(0), A1B, A2B, Z2); g6: nand3 PORT MAP (X(0), X(1), X(2), Z3); g7: nand3 PORT MAP (X(1), A2B, A0B, Z4); g8: nand4 PORT MAP (Z1, Z2, Z3, Z4, Z); end Structural_O; -----------------ONES_CNT_EX4: Main Circuit-----------LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; entity ONES_CNT_EX4B is port ( A : in STD_LOGIC_VECTOR(2 downto 0); C : out STD_LOGIC_VECTOR(1 downto 0)); end ONES_CNT_EX4B; architecture Structural of ONES_CNT_EX4B is
Cc BT gii sn v VHDL 2011 trang 9

COMPONENT MAJ3 PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); END COMPONENT; COMPONENT OPAR3 PORT( X: in STD_LOGIC_VECTOR(2 downto 0); Z: out STD_LOGIC); END COMPONENT; -begin -- Instantiate Components c1: MAJ3 PORT MAP (A, C(1)); c2: OPAR3 PORT MAP (A, C(0)); end Structural; 2. Vi mch t hp sau:

Hy vit m VHDL vi cc cch sau (khng thit k ring mch gii m, m ch ci t hm F): 1) Lnh ng thi vi php gn dng cc ton t logic 2) Lnh ng thi WHEN-ELSE 3) Lnh ng thi WITH-SELECT-WHEN 4) Lnh tun t IF-THEN-ELSE 5) Lnh tun t CASE-WHEN Bi gii. 1) Lnh ng thi vi php gn dng cc ton t logic --- signal assignment with logic operators library ieee; use ieee.std_logic_1164.all; entity Q02_1 is port ( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_1; architecture a of Q02_1 is signal D1, D5, D7: std_logic; begin D1 <= not(A) and not(B) and C;
Cc BT gii sn v VHDL 2011 trang 10

D5 <= A and not(B) and C; D7 <= A and B and C; F <= D1 or D5 or D7; end a;

2) Lnh ng thi WHEN-ELSE --- signal assignment with WHEN-ELSE library ieee; use ieee.std_logic_1164.all; entity Q02_2 is port( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_2; architecture a of Q02_2 is signal ABC: std_logic_vector(2 downto 0); begin ABC <= A&B&C; F <= '1' when ABC="001" or ABC="101" or ABC ="111" else '0'; end a; 3) Lnh ng thi WITH-SELECT-WHEN --- signal assignment with WITH-SELECT-WHEN library ieee; use ieee.std_logic_1164.all; entity Q02_3 is port( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_3; architecture a of Q02_3 is signal ABC: std_logic_vector(2 downto 0); begin ABC <= A&B&C; with ABC select F <= '1' when "001" | "101" | "111", '0' when others; end a;
Cc BT gii sn v VHDL 2011 trang 11

4) Lnh tun t IF-THEN-ELSE --- signal assignment with IF-THEN-ELSE library ieee; use ieee.std_logic_1164.all; entity Q02_4 is port( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_4; architecture a of Q02_4 is signal ABC: std_logic_vector(2 downto 0); begin ABC <= A&B&C; process(ABC) begin if (ABC= "001" or ABC = "101" or ABC ="111") then F <= '1'; else F <= '0'; end if; end process; end a; 5) Lnh tun t CASE-WHEN --- signal assignment with CASE-WHEN library ieee; use ieee.std_logic_1164.all; entity Q02_5 is port( A, B, C: in std_logic; -- C: LSB F: out std_logic); end Q02_5; architecture a of Q02_5 is signal ABC: std_logic_vector(2 downto 0); begin ABC <= A&B&C; process(ABC) begin case (ABC) is when "001" | "101" | "111" => F <= '1'; when others => F <= '0'; end case; end process; end a;

Cc BT gii sn v VHDL 2011 trang 12

3. Hy v mch logic tng ng (khng n gin ha hm Boole v c th s dng cc thnh phn t hp c bn nh cng logic, mux, decoder, FA, HA, ) ca m VHDL sau: library ieee; use ieee.std_logic_1164.all; entity blackbox is port( a, b, cin: in std_logic; inst: in std_logic_vector(2 downto 0); F, cout: out std_logic); end blackbox; architecture bg of blackbox is signal s0, s1, s2, s3, s4 : std_logic; --signal command : std_logic_vector(1 downto 0); begin s0 <= a and s4; s1 <= a or s4; s2 <= a xor s4; s3 <= a xor s4 xor cin; cout <= (a and s4) or ( s4 and cin) or (a and cin); U1: process(inst) begin case(inst(2 downto 1)) is when "00" => F <= s0; when "01" => F <= s1; when "10" => F <= s2; when others => F <= s3; end case; end process; U2: process(inst) begin if (inst(0) = '0') then s4 <= b; else s4 <= not b; end if; end process; end bg; Bi gii. Ta thy 2 php gn sau : s3 <= a xor s4 xor cin; cout <= (a and s4) or ( s4 and cin) or (a and cin); nhm thc hin mch FA, do c th dng khi ny trong mch logic. Process U1 chnh l MUX 4 sang 1 vi ng chn l inst(2:1). Process U2 chnh l MUX 2 sang 1 vi ng chn l inst(0). T ta c mch logic ca m VHDL trn l: (ALU 1 bit)
Cc BT gii sn v VHDL 2011 trang 13

4. Hy v mch logic tng ng (khng n gin ha hm Boole v c th s dng cc thnh phn t hp c bn nh cng logic, mux, decoder, FA, HA, ) ca m VHDL sau: library ieee; use ieee.std_logic_1164.all; entity CIRCUIT is port(A, B, C: in std_logic; S:in std_logic_vector (1 downto 0); Z: out std_logic); end CIRCUIT; architecture a of CIRCUIT is begin process(A, B, C, S) begin if (S(0)= 1) then Z <= A; elsif (S(1) = 1) then Z <= B; else Z <= C; end if; end process; end a;
Cc BT gii sn v VHDL 2011 trang 14

Bi gii. T m VHDL ta c th vit trc tip cc biu thc Boole cho cc bin ra vi loi lnh IF : Lnh Biu thc Boole tng ng F = C1.X + C1(C2.Y + C2.Z) if (cond1) then F = C1.X + C1C2.Y + C1 C2.Z F <= X ; elsif (cond2) then Vi C1 = cond1 v C2 = cond2 F <= Y ; else F <= Z ; end if ; p dng qui tc ny ta tm c biu thc Boole cho Z: Z = S(0).A + S(0)(S(1).B + S(1).C) Nh li vi MUX 2 sang 1c ng ra Y v cc ng vo I0, I1 v S th ng ra l: Y = S.I0 + S.I1 Nh vy ta phi dng 2 mch MUX 2 sang 1 thc hin mch trn:

5. Hy v mch logic tng ng (khng n gin ha hm Boole v c th s dng cc thnh phn t hp c bn nh cng logic, mux, decoder, FA, HA, ) ca m VHDL sau: entity CIRCUIT is port (A, B, S1, S2, S3, CLK: in std_logic; Y: out std_logic); end CIRCUIT; architecture a of CIRCUIT is begin process(CLK) begin if (CLK'event and CLK='1') then if (A='1') then Y <= S3; elsif (B = '0') then Y <= S2; else Y <= S1; end if; end if; end process; end a;
Cc BT gii sn v VHDL 2011 trang 15

Bi gii. NX : Ng ra ch c cp nht khi c cnh ln ti CLK y l D F/F kch cnh ln vi ng vo l mch t hp nh cu trn.

6. Ta cn thit k 1 mch t hp m xut pht t thit k s thng thng, mch ny c ghp t mch m ha u tin t 10 ng vo (in_n) sang 4 (BCD): ng vo tch cc thp v u tin bit c trng s thp nht, ng ra l s BCD 4 bit ch ng vo no c tch cc thp. o TD: Ng vo in_n = 11111100 th ng ra l BCD = 0000 Mch gii m BCD ra 7 on ni vi LED (gi s logic 1 lm cho on LED sng) : mch ny nhn gi tr ra t mch trn v chuyn sang m 7 on hin trn LED 7 on. a) Hy vit m VHDL vi 2 mch ny c lp. b) Hy vit m VHDL ch c 1 mch duy nht. Bi gii. Ta c th dng when-else hay with-select-when m t cc mch ny. a) M VHDL vi 2 mch c lp library ieee; use ieee.std_logic_1164.all; entity Q06_1 is port( in_n: in std_logic_vector(9 downto 0); -- in_n : low active and higher priority LSB LED_7seg: out std_logic_vector(6 downto 0)); -- LED_7seg(0) = segment a end Q06_1; architecture bg of Q06_1 is signal s_BCD : std_logic_vector (3 downto 0); begin -- Priority Encoder s_BCD <= "0000" when (in_n(0) = '0') else "0001" when in_n(1) = '0' else "0010" when in_n(2) = '0' else "0011" when in_n(3) = '0' else "0100" when in_n(4) = '0' else "0101" when in_n(5) = '0' else "0110" when in_n(6) = '0' else "0111" when in_n(7) = '0' else "1000" when in_n(8) = '0' else "1001" when in_n(9) = '0' else "1111"; -- invalid BCD
Cc BT gii sn v VHDL 2011 trang 16

-- BCD to 7 segment Decoder: LED_7seg = gfedcba LED_7seg <= "0111111" when s_BCD = "0000" else "0000110" when s_BCD = "0001" else "1011011" when s_BCD = "0010" else "1001111" when s_BCD = "0011" else "1100110" when s_BCD = "0100" else "1101101" when s_BCD = "0101" else "1111101" when s_BCD = "0110" else "0000111" when s_BCD = "0111" else "0000000" when s_BCD = "1000" else "1101111" when s_BCD = "1001" else (others => '0'); end bg; Dng sng m phng :

b) M VHDL vi 1 mch duy nht library ieee; use ieee.std_logic_1164.all; entity Q06_2 is port( in_n: in std_logic_vector(9 downto 0); LED_7seg: out std_logic_vector(6 downto 0)); end Q06_2; architecture bg of Q06_2 is begin LED_7seg <= "0111111" when in_n(0) = '0' else "0000110" when in_n(1) = '0' else "1011011" when in_n(2) = '0' else "1001111" when in_n(3) = '0' else "1100110" when in_n(4) = '0' else "1101101" when in_n(5) = '0' else "1111101" when in_n(6) = '0' else
Cc BT gii sn v VHDL 2011 trang 17

"0000111" when in_n(7) = '0' else "0000000" when in_n(8) = '0' else "1101111" when in_n(9) = '0' else (others => '0'); end bg; 7. Thit k JK flipfop nh hnh bn di (cc ng Preset PR v Clear CLR tch cc cao v bt ng b, CLR c u tin cao hn PR) a) Dng phng trnh c tnh ca JK FF. b) Dng bng hot ng ca JK FF. c) Nu mun Preset PR ng b th phi sa li nh th no? Bi gii. a) Dng phng trnh c tnh ca JK FF:
library ieee; use ieee.std_logic_1164.all; entity JK_FF is port( J, K, CLK, PR, CLR: in std_logic; -- PR, CLR: Asynchronous Preset and Clear Q, Q_n: out std_logic); end JK_FF; architecture bg of JK_FF is signal Q_int: std_logic; begin process(CLK, PR, CLR) begin if (CLR = '1') then Q_int <= '0'; elsif (PR = '1') then Q_int <= '1'; elsif rising_edge(CLK) then Q_int <= (J and not Q_int) or (not K and Q_int); end if; end process; Q <= Q_int; Q_n <= not Q_int; end bg;

Dng sng m phng:

Cc BT gii sn v VHDL 2011 trang 18

b) Dng bng hot ng ca JK FF: library ieee; use ieee.std_logic_1164.all; entity JK_FF is port( J, K, CLK, PR, CLR: in std_logic; Q, Q_n: out std_logic); end JK_FF; architecture bg of Q07_2 is signal Q_int: std_logic; signal JK: std_logic_vector(1 downto 0); begin JK <= J & K; process(CLK, PR, CLR) begin if (CLR = '1') then Q_int <= '0'; elsif (PR = '1') then Q_int <= '1'; elsif rising_edge(CLK) then case JK is when "01" => Q_int <= '0'; -- Reset when "10" => Q_int <= '1'; -- Set when "11" => Q_int <= not Q_int;-- Toggle when others => null; end case; end if; end process; Q <= Q_int; Q_n <= not Q_int; end bg; c) Ta ch cn vit li nh sau : if (CLR = '1') then Q_int <= '0'; elsif rising_edge(CLK) then if (PR = '1') then Q_int <= '1'; else --Phn m gn Q_int end if ; end if ;

Cc BT gii sn v VHDL 2011 trang 19

Dng sng m phng :

8. Thit k mch cng song song 2 s nh phn N bit (dng pht biu generic thit k tng qut, mc nhin N =4) l A v B. Tng l Sum v s nh/mn l C_out. a) M t VHDL cho mch ny. b) Thm vo tn hiu iu khin cho php cng/tr vi tn l Add_Sub (0: cng v 1:tr) th phi chnh sa nh th no? Bi gii. a) Khi s dng ton t cng/tr th ta phi dng gi ieee.std_logic_unsigned.all : -- Parallel Adder library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Q08_1 is generic (N: integer := 4); port( A, B: in std_logic_vector(N-1 downto 0); C_out: out std_logic; Sum: out std_logic_vector(N-1 downto 0)); end Q08_1; architecture bg of Q08_1 is signal Sum_int: std_logic_vector(Num downto 0); begin Sum_int <= ('0' & A) + ('0' & B); Sum <= Sum_int(N-1 downto 0); C_out <= Sum_int(N); end bg; b) Thm tn hiu iu khin Add_Sub: Ta ch cn nh ngha thm Add_sub v vit li lnh gn ca Sum_int : Sum_int <= ('0' & A) + ('0' & B) when Add_sub = '0' else ('0' & A) - ('0' & B); Dng sng m phng :

Cc BT gii sn v VHDL 2011 trang 20

9. Thit k mch cng ni tip 2 s nh phn vi A v B c chiu di l Num_bits bit (mc nhin cho Num_bits = 4). D liu vo c nhp ni tip vi LSB i trc. Kt qu l tng Sum c chiu di Num_bits bit v c s nh ra l C_out. Tn hiu Start =1 ch bt u thc hin cng (ch tn ti < 1 chu k xung nhp). C tn hiu Finished bo hon tt php cng. Mch hot ng theo cnh xung xung nhp CLK. Hy vit m VHDL cho mch ny. Bi gii.
library ieee; use ieee.std_logic_1164.all; entity Q09_1 is generic (Num_bits: integer := 4); port( A, B, Start, CLK: in std_logic; C_out, Finished: out std_logic; Sum: out std_logic_vector(Num_bits-1 downto 0)); end Q09_1; architecture bg of Q09_1 is begin process(CLK, Start) variable FIN: std_logic; -- Internal Finish signal variable N: integer range 0 to Num_bits; variable S, C_in: std_logic; variable Sum_int: std_logic_vector(Num_bits-1 downto 0); begin if (Start = '1') then FIN := '0'; N := Num_bits; C_in := '0'; Finished <= '0'; elsif (CLK'event and CLK = '0') then -- and FIN = '0') if (FIN = '0') then S := A xor B xor C_in; C_in := (A and B) or ( B and C_in) or ( A and C_in); Sum_int:= S & Sum_int(Num_bits-1 downto 1); N := N - 1;
Cc BT gii sn v VHDL 2011 trang 21

end if; end process; end bg;

if N = 0 then FIN := '1'; Finished <= '1'; Sum <= Sum_int; C_out <= C_in; end if; end if;

Dng sng m phng : Vi A = 0110 v B = 1011 => A + B = 10001 => C_out = 1 v Sum = 0001

Ch : C 1 cch gii khc l tn dng ton t + (trong ieee.std_logic_unsigned.all) tm C v S :


library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; . . . -- Thay dng: variable S, C_in: std_logic; bng dng sau: variable CS: std_logic_vector(1 downto 0); -- Carry v Sum . . . -- M mi phn tnh full adder nh sau: if (FIN = '0') then CS := ('0' & CS(1)) + ('0' & A) + ('0' & B) ; Sum_int := CS(0) & Sum_int(Num_bits-1 downto 1); N := N - 1; if N = 0 then FIN := '1'; Finished <= '1'; Sum <= Sum_int; C_out <= CS(1); end if; end if;
Cc BT gii sn v VHDL 2011 trang 22

10. Cho trc h tun t ng b sau:

a) Lp bng chuyn trng thi ca mch trn. b) Vit m VHDL cho cu a) c thm tn hiu reset_n tch cc thp cho chy t trng thi Q1Q2=00. Bi gii. a) T s mch ta c th tm c cc phng trnh c tnh cho cc FF v ng ra Z : D1 = Q1+ = Q1 + Q2 ; D2 = Q2+ = XQ2 ; Z = Q1 + Q2 Suy ra bng chuyn trng thi sau: PS NS (Q1+Q2+) Z Q1Q2 X=0 X =1 00 10 01 1 01 10 10 0 11 00 10 1 10 00 01 1 b) M VHDL cho cu a): library ieee; use ieee.std_logic_1164.all; entity Q10_1 is port( X, CLK, reset_n: in std_logic; Z: out std_logic); end Q10_1; architecture bg of Q10_1 is signal state: std_logic_vector( 1 downto 0); signal state_X: std_logic_vector( 2 downto 0); begin state_X <= state & X; Z <= '0' when state = "01" else '1'; process(CLK, reset_n) begin if (reset_n = '0') then state <= "00"; elsif rising_edge(CLK) then case state_X is when "000" => state <= "10"; when "001" => state <= "01";
Cc BT gii sn v VHDL 2011 trang 23

when "010" | "011" => when "110" => state <= when "111" => state <= when "100" => state <= when "101" => state <= when others => null; end case; end if; end process; end bg; Dng sng m phng:

state <= "10"; "00"; "10"; "00"; "01";

Ch : C nhiu cch vit khc m t FSM, th d sau y l 1 cch vit khc: library ieee; use ieee.std_logic_1164.all; entity Q10_2 is port( X, CLK, reset_n: in std_logic; Z: out std_logic); end Q10_2; architecture bg of Q10_2 is signal Present_state: std_logic_vector( 1 downto 0); PS signal Next_state: std_logic_vector( 1 downto 0); NS begin Z <= '0' when Present_state = "01" else '1'; State_transition: process(CLK, reset_n) begin if (reset_n = '0') then Present_state <= "00"; elsif rising_edge(CLK) then Present_state <= Next_state ; end if; end process;
Cc BT gii sn v VHDL 2011 trang 24

---

Find_Next_state: process(Present_state) begin case Present_state is when "00" => if else when when

X = '0' then Next_state <= "10";

when

when end case; end process; end bg;

Next_state <= "01"; end if; "01" => Next_state <= "10"; "11" => if X = '0' then Next_state <= "00"; else Next_state <= "10"; end if; "10" => if X = '0' then Next_state <= "00"; else Next_state <= "01"; end if; others => null;

Dng sng m phng:

11. Thit k mch pht hin chui bit vo ni tip c tr l "101". Vit m VHDL vi: a) Dng FSM loi Mealy vi m t FSM. b) FSM loi Mealy dng thanh ghi dch cha 3 bit lin tip v so snh vi "101". Bi gii. a) FSM loi Mealy Ta c c gin trng thi v bng chuyn trng thi nh sau (kt qu ly t bi ging thit k h tun t ng b)

Cc BT gii sn v VHDL 2011 trang 25

Ta nh ngha thm kiu mi cho cc trng thi khng cn gn trng thi m CAD s t gn tr cho n. library ieee; use ieee.std_logic_1164.all; entity Q11_1 is port( X, CLK, reset_n: in std_logic; Z: out std_logic); end Q11_1; architecture bg of Q11_1 is type state_type is (S0, S1, S2); signal state: state_type; begin Z <= '1' when (state = S2 and X = '1') else '0'; process(CLK, reset_n) begin if (reset_n = '0') then state <= S0; elsif rising_edge(CLK) then case state is when S0 => if X = '1' then state <= S1; end if; when S1 => if X = '0' then state <= S2; end if; when S2 => if X = '0' then state <= S0; else state <= S1; end if; when others => null; end case; end if; end process; end bg;

Cc BT gii sn v VHDL 2011 trang 26

b) Thanh ghi dch library ieee; use ieee.std_logic_1164.all; entity Q11_2 is port( X, CLK, reset_n: in std_logic; Z: out std_logic); end Q11_2; architecture bg of Q11_2 is signal pattern: std_logic_vector(2 downto 0); begin Z <= '1' when (pattern = "101" and X = 1) else '0'; process(CLK, reset_n) begin if (reset_n = '0') then pattern <= (others => '0') ; elsif rising_edge(CLK) then pattern <= pattern(1 downto 0) & X; end if; end process; end bg;

12. Thit k mch gii m 3 sang 8 v mch m ha u tin 8 sang 3 (u tin ng vo c trng s thp nht khi c nhiu bit vo l 1). Mch gii m c cc ng vo l C, B, v A (LSB) v ra l Y. Mch m ha c ng vo 8 bit D_in v ng ra 3 bit D_out. Bi gii.
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; -- Dung cho ham conv_std_logic_vector(integer, number of bits) use ieee.std_logic_unsigned.all; -- Dung cho ham conv_integer(std_logic_vector) entity Q12_1 is port( C, B, A: in std_logic; -- A: LSB Y: out std_logic_vector(0 to 7); D_in: in std_logic_vector(0 to 7); D_out: out std_logic_vector(0 to 2)); end Q12_1; Cc BT gii sn v VHDL 2011 trang 27

architecture bg of Q12_1 is signal CBA: std_logic_vector(0 to 2); signal CBA_int: integer range 0 to 7; begin -- Decoder 3 to 8 CBA <= C & B & A; CBA_int <= conv_integer(CBA); process (CBA_int) variable Y_int: std_logic_vector(0 to 7); begin Y_int := (others => '0'); Y_int(CBA_int) := '1'; Y <= Y_int; end process; --- Priority Encoder 8 to 3 process(D_in) variable index_in: integer; begin for i in D_in'length -1 downto 0 loop if D_in(i) = '1' then index_in := i; end if; end loop; D_out <= conv_std_logic_vector(index_in,3); end process; end bg;

Dng sng m phng ca mch gii m:

Dng sng m phng ca mch m ha:

Cc BT gii sn v VHDL 2011 trang 28

13. Thit k b m ln 3 bit loi ni tip (cn gi l b m gn hay bt ng b) vi xung nhp vo CLK (kch cnh). Mch c ng reset tch cc thp reset_n. Hy vit m VHDL vi a) M hnh cu trc vi component DFF c sn. b) Cc lnh tun t. Bi gii. a) Dng component DFF c sn ca Maxplus II library ieee; use ieee.std_logic_1164.all; entity Q13_1 is port( CLK, reset_n: in std_logic; Q2, Q1, Q0: out std_logic); -- Q0: LSB end Q13_1; architecture bg of Q13_1 is COMPONENT DFF PORT (d : IN STD_LOGIC; clk : IN STD_LOGIC; clrn: IN STD_LOGIC; prn : IN STD_LOGIC; q : OUT STD_LOGIC ); END COMPONENT; -Inputs | Output --prn clrn CLK D | Q -- L H X X | H -- H L X X | L -- L L X X | Illegal -- H H L | L -- H H H | H -- H H L X | Qo* -- H H H X | Qo -- * Qo = level of Q before Clock pulse -- All flipflops are positive-edge-triggered. signal D0, D1, D2, prn: std_logic; signal Q2_int, Q1_int, Q0_int: std_logic; begin U1: DFF port map(D0, CLK, reset_n, prn, Q0_int); U2: DFF port map(D1, D0, reset_n, prn, Q1_int); U3: DFF port map(D2, D1, reset_n, prn, Q2_int); prn <= '1'; D0 <= not Q0_int; D1 <= not Q1_int; D2 <= not Q2_int; Q0 <= Q0_int; Q1 <= Q1_int; Q2 <= Q2_int; end bg;
Cc BT gii sn v VHDL 2011 trang 29

c) Cc lnh tun t: library ieee; use ieee.std_logic_1164.all; entity Q13_2 is port( CLK, reset_n: in std_logic; Q2, Q1, Q0: out std_logic); -- Q0: LSB end Q13_2; architecture bg of Q13_2 is signal Q2_int, Q1_int, Q0_int: std_logic; begin process(CLK, reset_n) begin if reset_n = '0' then Q0_int <= '0'; elsif rising_edge(CLK) then Q0_int <= not Q0_int; end if; end process; process(Q0_int) begin if reset_n = '0' then Q1_int <= '0'; elsif falling_edge(Q0_int) then Q1_int <= not Q1_int; end if; end process; process(Q1_int) begin if reset_n = '0' then Q2_int <= '0'; elsif falling_edge(Q1_int) then Q2_int <= not Q2_int; end if; end process; Q0 <= Q0_int; Q1 <= Q1_int; Q2 <= Q2_int; end bg;
Cc BT gii sn v VHDL 2011 trang 30

Ch : Ta c th khai bo buffer cho cc i tng ra Q2, Q1, v Q0, khi khng cn dng cc tn hiu Q2_int, Q1_int, Q0_int. 14. Thit k b m ln 3 bit loi song song (cn gi l b m ng b) vi xung nhp vo CLK (kch cnh). Mch c ng reset tch cc thp reset_n. Hy vit m VHDL vi a) M hnh cu trc vi component JKFF c sn. b) Cc lnh tun t. c) Vi dy m 1, 3, 5, 7, 1, . . Bi gii. a) M hnh cu trc vi component JKFF c sn: library ieee; use ieee.std_logic_1164.all; entity Q14_1 is port( CLK, reset_n: in std_logic; Q2, Q1, Q0: buffer std_logic); -- Q0: LSB end Q14_1; architecture bg of Q14_1 is COMPONENT JKFF PORT (j : IN STD_LOGIC; k : IN STD_LOGIC; clk : IN STD_LOGIC; clrn: IN STD_LOGIC; prn : IN STD_LOGIC; q : OUT STD_LOGIC); END COMPONENT; -Inputs | Output -- PRN CLRN CLK J K | Q -- L H X X X | H -- H L X X X | L -- L L X X X | Illegal -- H H L X X | Qo* -- H H L L | Qo* -- H H H L | H -- H H L H | L -- H H H H | Toggle -- * Qo = level of Q before Clock pulse -- All flipflops are positive-edge-triggered. signal J0, J1, J2, prn: std_logic; begin U1: JKFF port map(J0, J0, CLK, reset_n, prn, Q0); U2: JKFF port map(J1, J1, CLK, reset_n, prn, Q1); U3: JKFF port map(J2, J2, CLK, reset_n, prn, Q2); prn <= '1'; J0 <= '1'; J1 <= Q0; J2 <= Q1 and Q0; end bg;
Cc BT gii sn v VHDL 2011 trang 31

b) Cc lnh tun t: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; -- De tinh cong so nhi phan voi so nguyen entity Q14_2 is port( CLK, reset_n: in std_logic; Q2, Q1, Q0: out std_logic); -- Q0: LSB end Q14_2; architecture bg of Q14_2 is signal Q: std_logic_vector(2 downto 0); begin process(CLK) begin if reset_n ='0' then Q <= "000"; elsif rising_edge(CLK) then Q <= Q + 1; end if; end process; Q2 <= Q(2); Q1 <= Q(1); Q0 <= Q(0); end bg; c) Vi dy m 1, 3, 5, 7, 1, . . Ch cn sa li trong phn process ca b) nh sau: if reset_n ='0' then Q <= "001"; elsif rising_edge(CLK) then if Q = "111" then Q <= "001"; else Q <= Q + 2; end if; end if;

Cc BT gii sn v VHDL 2011 trang 32

You might also like