sdasfasf
Các BT giải sẵn về VHDL 2011 – trang 1 ĐHBK Tp HCM–Khoa ĐĐT–BMĐT Môn học: Kỹ thuật số GVPT: Hồ Trung Mỹ Bài tập giải sẵn về VHDL (AY1112-S1) (Các mã VHDL đã được chạy thử trên Altera MaxplusII v10.2) 1. Viết mã VHDL để đếm số bit 1 của số nhị phân 3 bit A với các cách sau: a) Dùng mô hình hành vi b) Dùng mô hình luồng dữ liệu c) Lệnh case-when d) Dùng mô hình cấu trúc Bài giải. Với yêu cầu của đề bài, ta có được bảng chân trị sau: Ngõ vào Ngõ ra A2 A1 A0 C1 C0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 Phần đầu dùng thư viện IEEE và khai báo entity thì giống nhau cho các cách: TD: Với khai báo của cách 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ô hình hành 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 Các BT giải sẵn về VHDL 2011 – trang 2 Loop IF A(i) = '1' then num := num+1; end if; end Loop; -- -- Transfer "num" Variable Value to a SIGNAL -- CASE num is WHEN 0 => C <= "00"; WHEN 1 => C <= "01"; WHEN 2 => C <= "10"; WHEN 3 => C <= "11"; end CASE; end process; end Algorithmic; Dạng sóng mô phỏng hoạt động: Chú ý: Có cách giải khác trong thí dụ của 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 Các BT giải sẵn về VHDL 2011 – trang 3 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ô hình luồng dữ liệu architecture Two_Level of ONES_CNT_EX2 is begin 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; Dạng sóng mô phỏng hoạt động: c) Lệnh 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"; Các BT giải sẵn về VHDL 2011 – trang 4 WHEN "111" => C <= "11"; WHEN OTHERS => C <="ZZ"; end CASE; end process; end Truth_Table; d) Dùng mô hình cấu trúc Có nhiều cách giải cho phần này. Từ bảng chân trị ta có biểu thức Boole cho các ngõ ra: C1 = A1A0 + A0A2 + A1A2 + A0A1A2 C1 = A1A0 + A0A2 + A1A2 => cần AND 2 ngõ vào và OR 3 ngõ vào và C0 = A2’A1’A0 + A2’A1A0’ + A2A1’A0’ + A2A1A0 C0 = ((A2’A1’A0)’.( A2’A1A0’)’ .(A2A1’A0’)’.(A2A1A0)’)’ => Cần NAND 3 ngõ vào, NAND 4 ngõ vào và cổng NOT Mạch cho C1 được đặt tên là MAJ3 và mạch cho C0 được đặt tên là OPAR3. Từ đó có bài giải 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 Các BT giải sẵn về VHDL 2011 – trang 5 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 Các BT giải sẵn về VHDL 2011 – trang 6 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); Các BT giải sẵn về VHDL 2011 – trang 7 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; Dạng sóng ra mô phỏng: Chú ý: Ta có thể sử dụng luôn các component có sẵn của Altera MaxplusII. Tuy nhiên lưu ý phải khai báo component đúng với khai báo của Altera MaxplusII! Các cổng logic của Maxplus II có các khai báo sau: 1) Cổng NOT với tên là A_NOT có khai báo sau: COMPONENT a_not PORT( a_in: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; Các BT giải sẵn về VHDL 2011 – trang 8 2) Cổng AND có thể có n ngõ vào (ANDn) với n=2, 3, 4, 6, 8 và 12. TD: Khai báo sau cho cổng AND có 2 ngõ vào: COMPONENT and2 PORT( IN1, IN2: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; 3) Cổng OR có thể có n ngõ vào (ORn) với n=2, 3, 4, 6, 8 và 12. TD: Khai báo sau cho cổng OR có 2 ngõ vào: COMPONENT or3 PORT(IN1, IN2, IN3: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; 4) Cổng NAND có thể có n ngõ vào (NANDn) với n=2, 3, 4, 6, 8 và 12. 5) Cổng NOR có thể có n ngõ vào (NANDn) với n=2, 3, 4, 6, 8 và 12. 6) Cổng XOR 2 ngõ vào có tên là a_XOR với khai báo sau: COMPONENT a_xor PORT(IN1, IN2: in STD_LOGIC; a_out: out STD_LOGIC); END COMPONENT; 7) Cổng XNOR 2 ngõ vào có tên là a_XNOR Như vậy ta có lời giải khác ngắn hơn nếu sử dụng các component có sẵn của 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 Các BT giải sẵn về VHDL 2011 – trang 9 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 Các BT giải sẵn về VHDL 2011 – trang 10 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. Với mạch tổ hợp sau: Hãy viết mã VHDL với các cách sau (không thiết kế riêng mạch giải mã, mà chỉ cài đặt hàm F): 1) Lệnh đồng thời với phép gán dùng các toán tử logic 2) Lệnh đồng thời WHEN-ELSE 3) Lệnh đồng thời WITH-SELECT-WHEN 4) Lệnh tuần tự IF-THEN-ELSE 5) Lệnh tuần tự CASE-WHEN Bài giải. 1) Lệnh đồng thời với phép gán dùng các toán 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;