Giáo trình môn Kỹ thuật số - Bài tập giải sẵn về VHDL - Hồ Trung Mỹ

Đ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
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
0
0
1
0
1
1
1
0
1
1
0
1
0
0
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  
C
: in  
std_logic_vector(2 downto 0);  
: out std_logic_vector(1 downto 0));  
end  
ONES_CNT_EX1;  
a) Mô hình hành vi:  
architecture  
begin  
Algorithmic  
of  
ONES_CNT_EX1  
is  
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 1  
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
q
: IN BIT_VECTOR (2 DOWNTO 0);  
: 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 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ô 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 3  
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 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  
Các BT giải sẵn 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;  
begin  
-- Declare Maj3 Local Signals  
-- Instantiate Gates  
g1: and2gate PORT MAP (X(0), X(1), A1);  
g2: and2gate PORT MAP (X(0), X(2), A2);  
g3: and2gate PORT MAP (X(1), X(2), A3);  
g4: or3gate PORT MAP (A1, A2, A3, Z);  
-- Wiring of  
-- Maj3  
-- 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 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  
C
: in  
STD_LOGIC_VECTOR(2 downto 0);  
: out STD_LOGIC_VECTOR(1 downto 0));  
end  
ONES_CNT_EX4;  
architecture  
COMPONENT MAJ3  
Structural  
of  
ONES_CNT_EX4  
is  
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  
a_out: out STD_LOGIC);  
END COMPONENT;  
STD_LOGIC;  
Các BT giải sẵn về VHDL 2011 – trang 7  
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);  
g3: and2 PORT MAP (X(1), X(2), A3);  
-- Wiring of  
-- Maj3  
Các BT giải sẵn về VHDL 2011 – trang 8  
g4: or3 PORT MAP (A1, A2, A3, Z);  
end Structural_M;  
-- Compts.  
------------------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  
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;  
--  
STD_LOGIC;  
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  
STD_LOGIC_VECTOR(2 downto 0);  
: out STD_LOGIC_VECTOR(1 downto 0));  
port ( A  
: in  
C
end  
ONES_CNT_EX4B;  
architecture  
Structural  
of  
ONES_CNT_EX4B  
is  
Các BT giải sẵn 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. 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;  
Các BT giải sẵn 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) Lệnh đồng thời 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) Lệnh đồng thời WITH-SELECT-WHEN  
--- signal assignment with WITH-SELECT-WHEN  
library ieee;  
use ieee.std_logic_1164.all;  
entity Q02_3 is  
port(  
F: out std_logic);  
end Q02_3;  
A, B, C: in std_logic; -- C: LSB  
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;  
Các BT giải sẵn về VHDL 2011 – trang 11  
4) Lệnh tuần 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) Lệnh tuần 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;  
Các BT giải sẵn về VHDL 2011 – trang 12  
3. Hãy vẽ mạch logic tương ứng (không đơn giản hóa hàm Boole và có thể sử dụng các thành  
phần tổ hợp cơ bản như cổng logic, mux, decoder, FA, HA, …) của 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;  
Bài giải.  
Ta thấy 2 phép gán sau :  
s3 <= a xor s4 xor cin;  
cout <= (a and s4) or ( s4 and cin) or (a and cin);  
nhằm thực hiện mạch FA, do đó có thể dùng khối này trong mạch logic.  
Process U1 chính là MUX 4 sang 1 với ngõ chọn là inst(2:1).  
Process U2 chính là MUX 2 sang 1 với ngõ chọn là inst(0).  
Từ đó ta có mạch logic của mã VHDL trên là: (ALU 1 bit)  
Các BT giải sẵn về VHDL 2011 – trang 13  
4. Hãy vẽ mạch logic tương ứng (không đơn giản hóa hàm Boole và có thể sử dụng các thành  
phần tổ hợp cơ bản như cổng logic, mux, decoder, FA, HA, …) của 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;  
Các BT giải sẵn về VHDL 2011 – trang 14  
Bài giải.  
Từ mã VHDL ta có thể viết trực tiếp các biểu thức Boole cho các biến ra với loại lệnh IF :  
Lệnh  
(cond1) then  
F <= X ;  
Biểu thức Boole tương đương  
F = C1.X + C1’(C2.Y + C2’.Z)  
F = C1.X + C1’C2.Y + C1’ C2’.Z  
if  
elsif (cond2) then  
F <= Y ;  
Với C1 = cond1 và C2 = cond2  
else  
F <= Z ;  
end if ;  
Áp dụng qui tắc này ta tìm được biểu thức Boole cho Z:  
Z = S(0).A + S(0)’(S(1).B + S(1)’.C)  
Nhớ lại với MUX 2 sang 1có ngõ ra Y và các ngõ vào I0, I1 và S thì ngõ ra là:  
Y = S’.I0 + S.I1  
Như vậy ta phải dùng 2 mạch MUX 2 sang 1 để thực hiện mạch trên:  
5. Hãy vẽ mạch logic tương ứng (không đơn giản hóa hàm Boole và có thể sử dụng các thành  
phần tổ hợp cơ bản như cổng logic, mux, decoder, FA, HA, …) của 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;  
Các BT giải sẵn về VHDL 2011 – trang 15  
Bài giải.  
NX : Ngõ ra chỉ được cập nhật khi có cạnh lên tại CLK Đây là D F/F kích cạnh lên với ngõ  
vào là mạch tổ hợp như câu trên.  
6. Ta cần thiết kế 1 mạch tổ hợp mà xuất phát từ thiết kế số thông thường, mạch này được  
ghép từ  
mạch mã hóa ưu tiên từ 10 ngõ vào (in_n) sang 4 (BCD): ngõ vào tích cực thấp và ưu  
tiên bit có trọng số thấp nhất, ngõ ra là số BCD 4 bit chỉ ngõ vào nào được tích cực thấp.  
o TD: Ngõ vào in_n = 11111100 thì ngõ ra là BCD = 0000  
Mạch giải mã BCD ra 7 đoạn nối với LED (giả sử logic 1 làm cho đoạn LED sáng) :  
mạch này nhận giá trị ra từ mạch trên và chuyển sang mã 7 đoạn hiện trên LED 7 đoạn.  
a) Hãy viết mã VHDL với 2 mạch này độc lập.  
b) Hãy viết mã VHDL chỉ có 1 mạch duy nhất.  
Bài giải.  
Ta có thể dùng when-else hay with-select-when để mô tả các mạch này.  
a) Mã VHDL với 2 mạch độc lập  
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  
Các BT giải sẵn 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;  
Dạng sóng mô phỏng :  
b) Mã VHDL với 1 mạch duy nhất  
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  
Các BT giải sẵn 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. Thiết kế JK flipfop như hình bên dưới (các ngõ Preset PR và Clear CLR  
tích cực cao và bất đồng bộ, CLR có ưu tiên cao hơn PR)  
a) Dùng phương trình đặc tính của JK FF.  
b) Dùng bảng hoạt động của JK FF.  
c) Nếu muốn Preset PR đồng bộ thì phải sửa lại như thế nào?  
Bài giải.  
a) Dùng phương trình đặc tính của 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;  
Dạng sóng mô phỏng:  
Các BT giải sẵn về VHDL 2011 – trang 18  
b) Dùng bảng hoạt động của 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ỉ cần viết lại như sau :  
if (CLR = '1') then  
Q_int <= '0';  
elsif rising_edge(CLK) then  
if (PR = '1') then  
Q_int <= '1';  
else  
--Phần mã gán Q_int  
end if ;  
end if ;  
Các BT giải sẵn về VHDL 2011 – trang 19  
Dạng sóng mô phỏng :  
8. Thiết kế mạch cộng song song 2 số nhị phân N bit (dùng phát biểu generic để thiết kế tổng  
quát, mặc nhiên N =4) là A và B. Tổng là Sum và số nhớ/mượn là C_out.  
a) Mô tả VHDL cho mạch này.  
b) Thêm vào tín hiệu điều khiển cho phép cộng/trừ với tên là Add_Sub (0: cộng và 1:trừ)  
thì phải chỉnh sửa như thế nào?  
Bài giải.  
a) Khi sử dụng toán tử cộng/trừ thì ta phải dùng gói 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) Thêm tín hiệu điều khiển Add_Sub:  
Ta chỉ cần định nghĩa thêm Add_sub và viết lại lệnh gán của Sum_int :  
Sum_int <= ('0' & A) + ('0' & B) when Add_sub = '0' else  
('0' & A) - ('0' & B);  
Dạng sóng mô phỏng :  
Các BT giải sẵn về VHDL 2011 – trang 20  
Tải về để xem bản đầy đủ
pdf 32 trang baolam 25740 Free
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình môn Kỹ thuật số - Bài tập giải sẵn về VHDL - Hồ Trung Mỹ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_mon_ky_thuat_so_bai_tap_giai_san_ve_vhdl_ho_trung.pdf