Các bài tập VHDL
Hiệutú_HY ^_^
Bài 1: mạch so sánh 4 bit:
+mô tả:
-mạch gồm có 2 đầu vào là a,b và 3 đầu ra là y1,y2,y3. với mỗi
đầu vào chứa 4bit. mạch sẽ thực hiện so sánh giá trị của 2 đầu vào
a và b và sẽ hiện thì ra tại các đầu ra y. đầu ra y hiện thị giá trị
logic 1 và logic 0.
+chương trình:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Entity sosanh is
Port (a,b: in std_logic_vector (3 downto 0);
Y1: out std_logic;
Y2:out std_logic;
Y3: out std_logic);
End sosanh;
Architecture Behavioral of sosanh is
Begin
Process(a,b)
Begin
If (a>b) then y1<=’1’;
Elsif (y1=’0’);
End if;
If (a Dout <= "1111110"; --0
when "0001" => Dout <= "0110000"; --1
when "0010" => Dout <= "1101101"; --2
when "0011" => Dout <= "1111001"; --3
when "0100" => Dout <= "0111011"; --4
when "0101" => Dout <= "1011011"; --5
when "0110" => Dout <= "1011111"; --6
when "0111" => Dout <= "1110000"; --7
when "1000" => Dout <= "1111111"; --8
when "1001" => Dout <= "1111011"; --9
when others => Dout <= null;
End case;
End if;
End process;
End Behavioral;
số
0
1
2
3
4
5
6
7
8
9
10->15
Led 7
1111110
0110000
1101101
1111001
0111011
1011011
1011111
1110000
1111111
1111011
0000000
Bài 6: Mạch mã hoá 8:3 sử dụng case:
+mô tả hoạt động:
-mạch gồm có đầu vào input chứa 8 bit và đầu ra
output chứa 3 bit.
Khi ta thay đổi giá trị tại đầu vào của mạch thì mạch sẽ
mã hoá cho ta các ra giá trị ra tương ứng tại đầu ra.
+chương trình:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Entity mahoa_83 is
Port(input:in std_logic_vector(7 downto 0);
Output : out std_logic_vector(2 downto 0));
End mahoa_83;
Architecture Behavioral of mahoa_83 is
Begin
Process(input)
Begin
Case input is
When “00000001” => output<=”000”;
When “00000010” => output<=”001”;
When “00000100” => output<=”010”;
When “00001000” => output<=”011”;
When “00010000” => output<=”100”;
When “00100000” => output<=”101”;
When “01000000” => output<=”110”;
When “10000000” => output<=”111”;
When others => output<=null;
End case;
End process;
End behavioral;
A
7
0
0
0
0
0
0
0
1
A
6
0
0
0
0
0
0
1
0
A
5
0
0
0
0
0
1
0
0
A
4
0
0
0
0
1
0
0
0
A
3
0
0
0
1
0
0
0
0
A
2
0
0
1
0
0
0
0
0
A
1
0
1
0
0
0
0
0
0
A
0
1
0
0
0
0
0
0
0
Y
2
0
0
0
0
1
1
1
1
Y
1
0
0
1
1
0
0
1
1
Y
0
0
1
0
1
0
1
0
1
Bài 7: Bộ ghép kênh 8:1:
+mô tả hoạt động:
bộ ghép kênh 8 lối vào 1 lối ra gồm có 8 lối vào từ x0 đến
x7,với mỗi lối vào là 8 bít x0(7:0) đến x7(7:0),1 lối ra y(7:0).
S(2:0) là các đầu vào điều khiển, để thay đổi lần lượt từ
x0(7:0) đến x7(7:0)nphải có đầu vào điều khiển. Vậy đối với
mạch ghép kênh 8 lối vào 1 lối ra cần đầu vào điều khiển là s.
+ các Chương trình:
1.sử dụng if:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Mux_81 is
Port (s : in std_logic_vector(2 downto 0);
X0,x1,x2,x3.x4.x5,x6,x7: in std_logic_vector (7 downto
0);
y : out std_logic_vector (7 downto 0));
end Mux_81;
architecture Behavioral of Mux_81 is
Begin
Process(s)
If (s=”000”) then y<= x0;
Elsif (s=”001”) then y<=x1;
Elsif (s=”010”) then y<=x2;
Elsif (s=”011”) then y<=x3;
Elsif (s=”100”) then y<=x4;
Elsif (s=”101”) then y<=x5;
Elsif (s=”110”) then y<=x6;
Else y<=x7;
End if;
End process;
End Behavioral;
bảng chân lý:
s
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
y
X0
X1
X2
X3
X4
X5
X6
X7
2. sử dụng case
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Mux_81 is
Port (s : in std_logic_vector(2 downto 0);
X0,x1,x2,x3.x4.x5,x6,x7: in std_logic_vector (7 downto
0);
y : out std_logic_vector (7 downto 0));
end Mux_81;
architecture Behavioral of Mux_81 is
Begin
Process(s)
Case input is
When “000” => y<=x0;
When “001” => y<=x1;
When “010” => y<=x2;
When “011” => y<=x3;
When “100” => y<=x4;
When “101” => y<=x5;
When “110” => y<=x6;
When “111” => y<=x7;
End case;
End process;
End behavioral;
Bài 8: thiết kế mạch mã hoá 4 đường sang 2 đường với ngõ vào tích hợp ở
mức cao, sử dụng phát biểu case.
+mô tả:
-mạch gồm có 4 đầu vào từ I0 đến I3 và có 2 đầu ra là Q0 &
Q1. với mỗi giá tại đầu vào thì mạch sẽ mã hoá cho ta 1 giá
trị tại đầu ra của mạch.
+chương trình:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mahoa_42 is
Port (I : in std_logic_vector(3 downto 0);
Q : out std_logic_vector (1 downto 0));
end mahoa_42;
architecture Behavioral of mahoa_42 is
Begin
Process(I)
Begin
Case I is
When “0001” => Q<=”00”;
When “0010” => Q<=”01”;
When “0100” => Q<=”10”;
When “1000” => Q<=”11”;
When others => null;
End case;
End process;
End behavioral;
bảng chân lý
I3
0
0
0
1
Ngõ vào
I2 I1 I0
0 0 1
0 1 0
1 0 0
0 0 0
Ngõ ra
Q1 Q0
0 0
0 1
1 0
1 1
Bài 9: Mạch mã hoá 8:3
+mô tả hoạt động:
Mạch mã hoá dùng để biến đổi dữ liệu rời rạc
thành dạng nhị phân. Mạch mã hoá có 2n hoặc ít
hơn ngõ vào sẽ mã hoá dữ liệu ngõ vào để cung
cấp n ngõ ra được mã hoá. Cần giẩ định chỉ có 1
ngõ vào tích cực (‘1’) ở 1 thời điểm cho trước,
nếu ko ngõ ra sẽ ko có giá trị xác định nào &
mạch trở nên vô nghĩa.
+Các chương trình:
1.sử dụng if:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mahoa_83 is
Port (A : in std_logic_vector(7 downto 0);
y : out std_logic_vector (2 downto 0));
end mahoa_83;
architecture Behavioral of mahoa_83 is
Begin
Process(A)
Begin
If (A=”00000001”) then y<=”000”;
elsIf (A=”00000010”) then y<=”001”;
elsIf (A=”00000100”) then y<=”010”;
elsIf (A=”00001000”) then y<=”011”;
elsIf (A=”00010000”) then y<=”100”;
elsIf (A=”00100000”) then y<=”101”;
elsIf (A=”01000000”) then y<=”110”;
elsIf (A=”10000000”) then y<=”111”;
else y<=”xxx”;
End if;
End process;
End behavioral;
2.sử dụng phát biểu case:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mahoa_83 is
Port (A : in std_logic_vector(7 downto 0);
y : out std_logic_vector (2 downto 0));
A A AA A AA A Y Y Y
7 6 5 4 3 2 1 0 2 1 0
0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0 1
0 0 0 0 0 1 0 0 0 1 0
0 0 0 0 1 0 0 0 0 1 1
0 0 0 1 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 1 0 1
0 1 0 0 0 0 0 0 1 1 0
1 0 0 0 0 0 0 0 1 1 1
end mahoa_83;
architecture Behavioral of mahoa_83 is
Begin
Case A is
When “00000001” => y<=”000”;
When “00000010” => y<=”001”;
When “00000100” => y<=”010”;
When “00001000” => y<=”011”;
When “00010000” => y<=”100”;
When “00100000” => y<=”101”;
When “01000000” => y<=”110”;
When “10000000” => y<=”111”;
When others =>y<=null;
End case;
End process;
End behavioral;
Bài 10: Mạch mã hoá ưu tiên:
+Mô tả hoạt động:
nếu có 2 hay nhiều ngõ vào ở mức logic tích cực
(‘1’),ngõ vào có mức ưu tiên cao nhất sẽ được ưu
tiên hơn và giá trị mã hoá cụ thể của ngõ vào này
sẽ xuất hiện ở các ngõ ra.
+ Các chương trình:
1.sử dụng phát biểu if:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity 83_uutien is
A A A A A A A A Y Y Y valid
Port (A : in std_logic_vector(7 downto 0);
7 6 5 4 3 2 1 0 2 1 0
y : out std_logic_vector (2 downto 0));
0 0 0 0 0 0 0 1 0 0 0 1
end 83_uutien;
0 0 0 0 0 0 1 X 0 0 1 1
architecture logic of 83_uutien is
0 0 0 0 0 1 X X 0 1 0 1
Begin
0 0 0 0 1 XX X 0 1 1 1
Process(A)
0 0 0 1 X XX X 1 0 0 1
Begin
0 0 1 X X XX X 1 0 1 1
If (A(7)=’1’) then y<=”111”;
0 1 XX X XX X 1 1 0 1
elsIf (A(6)=’1’) then y<=”110”;
1 X XX X XX X 1 1 1 1
elsIf (A(5)=’1’) then y<=”101”;
0 0 0 0 0 0 0 0 X Xx 0
elsIf (A(4)=’1’)then y<=”110”;
Begin
elsIf (A(3)=’1’) then y<=”100”;
Process(A)
elsIf (A(2)=’1’) then y<=”011”;
Begin
elsIf (A(1)=’1’) then y<=”001”;
elsIf (A(0)=’1’) then y<=”000”;
A_int:=to_integer (A); Valid <=’1’;
else valid<=’0’;
Case (A) is
y<=”xxx”;
When 128 to 255 => y<=”111”;
End if;
When 64 to 127 => y<=”110”;
End process;
When 32 to 63 => y<=”101”;
End logic;
When 16 to 31 => y<=”100”;
2.Phát biểu case:
When 8 to 15 => y<=”011”;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
When 4 to 7 => y<=”010”;
entity 83_uutien is
When 2 to 3 => y<=”001”;
Port (A : in std_logic_vector(7 downto 0);
When 1 => y<=”000”;
y : out std_logic_vector (2 downto 0));
When others =>y<=valid; Y<=”xxx”;
end 83_uutien;
architecture logic of 83_uutien is
End case;
End process;
End logic;
Bài 11: Mạch giải mã 3:8:
+mô tả hoạt động:
Các mạch giải mã được sử dụng để giải mã dữ
sơ đồ:
liệu,dữ liệu này đc mã hoá trước đây bằng cách dùng
dạng mã hoá nhị phân hoặc có thể 1 dạng mã hoá
khác. 1 mã n bit có thể biểu diễn đén 2n bit phân biệt
của thông tin mã hoá, do vậy 1 mạch giải mã với n
ngõ vào có thể giải mã đến 2n ngõ ra.
+ Các phương trình:
1.sử dụng if:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
bảng chân lý:
entity giaima_38 is
A A AY Y YY Y Y Y Y
Port (A : in std_logic_vector(2 downto 0);
2 1 0 7 6 5 4 3 2 1 0
y : out std_logic_vector (7 downto 0));
end giaima_38;
0 0 0 0 0 0 0 0 0 0 1
architecture logic of giaima_38 is
0 0 1 0 0 0 0 0 0 1 0
Begin
0 1 0 0 0 0 0 0 1 0 0
Process(A)
0 1 1 0 0 0 0 1 0 0 0
Begin
1 0 0 0 0 0 1 0 0 0 0
If (A=”000”) then y<=”00000001”;
1 0 1 0 0 1 0 0 0 0 0
elsIf (A=”001”) then y<=”00000010”;
1 1 0 0 1 0 0 0 0 0 0
elsIf (A=”010”) then y<=”00000100”;
1 1 1 1 0 0 0 0 0 0 0
elsIf (A=”011”) then y<=”00001000”;
Begin
elsIf (A=”100”) then y<=”00010000”;
Case (A) is
elsIf (A=”101”) then y<=”00100000”;
When ”000” => y<=”00000001”;
elsIf (A=”110”) then y<=”01000000”;
When ”001” => y<=”00000010”;
else y<=”10000000”;
When ”010” => y<=”00000100”;
End if;
End process;
When ”011” => y<=”00001000”;
End logic;
When ”100” => y<=”00010000”;
2.sử dụng case:
When ”101” => y<=”00100000”;
library IEEE;
When ”110” => y<=”01000000”;
use IEEE.STD_LOGIC_1164.ALL;
When ”111” => y<=”10000000”;
entity giaima_38 is
When others => y<=null;
Port (A : in std_logic_vector(2 downto 0);
y : out std_logic_vector (7 downto 0));
end giaima_38;
architecture logic of giaima_38 is
End case;
End process;
End logic;
Bài 12: Thiết kế mạch đa hợp 4 ngõ vào,1 ngõ ra,2 ngõ lựa chọn:
+mô tả hoạt động:
-mạch gồm có 4 đầu vào từ I0 đến I3 và 1 đầu ra Q.s0,s1 là
các đầu vào điều khiển. để thay đổi lần lượt từ I0 đến I3 thì
phải có điều khiển,việc đó đc thực hiện bởi 2 đầu vào điều
khiển s0 & s1.
+ch ương trình
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux_41 is
Port (I : in std_logic_vector(3 downto 0);
S: in std_logic_vector (1 downto 0);
Q : out std_logic);
end mux_41;
architecture Behavioral of mux_41 is
Begin
Process(I,s)
Begin
Case s is
When “00” => Q<=I0;
When “10” => Q<=I1;
When “10” => Q<=I2;
When “11” => Q<=I3;
When others => Q <=null;
End case;
End process;
End Behavioral;
S1 S0 I3
0 0 X
0 1 X
1 0 X
1 1 I3
Bảng chân lí
sơ đồ mạch
I2
X
X
I2
X
I1
X
I1
X
X
I0
I0
X
X
X
Q
I0
I1
I2
I3
Bài 13: Các cách mô tả mạch ghép kênh 4:1, 1 bit:
+mô tả hoạt động:
bộ ghép kênh 4 lối vào 1 lối ra gồm có 4 lối vào
A,B,C,D,với mỗi lối vào là 1 bit và 1 lối ra y. S1,s2
là các đầu vào điều khiển, để thay đổi lần lượt các
đầu vào từ A đến D phải có điều khiển, vậy đối với
mạch này thì cần có đầu vào điều khiển là s1,s2.
+ các chương trình:
1.sử dụng phát biểu if:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Mux_41 is
Port (A,B,C,D,s1,s2: in std_logic;
Y: out std_logic);
end Mux_41;
architecture Behavioral of Mux_41 is
Begin
Process(A,B,C,D,s1,s2)
If (s1s2=”00”) then y<= A;
Elsif (s1s2=”01”) then y<=B;
Elsif (s=”10”) then y<=C;
Else y<=D;
End if;
End process;
End Behavioral;
2.sử dụng phép gán tín hiệu có điều kiện
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Mux_41 is
Port (A,B,C,D,s1,s2: in std_logic;
Y: out std_logic);
end Mux_41;
architecture Behavioral of Mux_41 is
Begin
Y<=A When s1s2=“00” else
Bảng chân lý:
S1
0
0
1
1
S2
0
1
0
1
A
1
0
0
0
B
0
1
0
0
C
0
0
1
0
D
0
0
0
1
Y
1
1
1
1
2.sử dụng phát biểu case:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Mux_41 is
Port (A,B,C,D,s1,s2: in std_logic;
Y: out std_logic);
end Mux_41;
architecture Behavioral of Mux_41 is
Begin
Process(A,B,C,D,s1,s2)
Begin
Case s1 s2 is
When “00” => y<=A;
When “10” => y<=B;
When “10” => y<=C;
When “11” => y<=D;
B When s1s2=“10” else
C When s1s2=“10 else
Y<=D;
End behavioral;
End case;
End process;
End behavioral;
Bài 14: Mạch cộng ko đầy đủ 1bit:
+mô tả:
-mạch gồm có 2 đầu vào là A,B và 2 đầu ra là Cout, sum. với sum là tổng
của 2 đầu vào và Cout là bit nhớ.
+chương trình
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity HALF_ADD is
Port ( A,B : in STD_LOGIC;
Sum, Cout : out STD_LOGIC);
end HALF_ADD;
architecture Behavioral of HALF_ADD is
begin
Sum <= A xor B;
Cout <= A and B;
end Behavioral;
Sơ đồ:
bảng chân lý:
A B Cou Sum
t
0 0
0
0
0 1
0
1
1 0
0
1
1 1
1
0
Bài 11: Mạch cộng đầy đủ 1bit:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity FULL_ADD is
Port ( A,B,Cin : in STD_LOGIC;
Cout,Sum : out STD_LOGIC);
end FULL_ADD;
architecture Behavioral of FULL_ADD is
COMPONENT HALF_ADD
PORT(A : IN std_logic;
B : IN std_logic;
Sum : OUT std_logic;
Cout : OUT std_logic);
END COMPONENT;
signal AplusB,CoutHA1,CoutHA2: STD_LOGIC;
begin
HA1: HALF_ADD PORT MAP (
A => A,
B => B,
Sum => APlusB,
Cout => CoutHA1);
HA2: HALF_ADD PORT MAP(
A => AplusB,
B => Cin,
Sum => Sum,
Cout => CoutHA2);
Cout <= CoutHA1 or CoutHA2;
end Behavioral;
+mô tả:
-mạch gồm có 3 đầu vào A,B,Cin và 2 đầu
ra Cout,sum.
-với sum là tổng của 3 đầu vào và Cout là
bit nhớ
+Bảng chân lý:
A B Cin Sum Cout
0 0
0
0
0
0 0
1
1
0
0 1
0
1
0
0 1
1
0
1
1 0
0
1
0
1 0
1
0
1
1 1
0
0
1
1 1
1
1
1
Bài 15: Mạch ghép kênh 2:1, độ rộng 1 bit:
+ mô tả hoạt động:
mạch ghép kênh có lựa chọn 1,2 hoặc nhiều tín hiệu ngõ vào
đến ngõ ra. Một or nhiều tín hiệu điều khiển sẽ điều khiển
giá trị của tín hiệu ngõ vào nào được truyền đến ngõ ra. Mỗi
tín hiệu ngõ vào và tín hiệu ngõ ra có thể là 1 bít đơn or bus
nhiều bit. Các ngõ vào lựa chọn thường được mã hoá nhị
phân sap cho n ngõ vào lựa chọn có thể chọn từ 1 đến 2n ngõ
vào.
+ chương trình:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Entity mux_21 is
Port (A,B:in std_logic;
s: in std_logic;
y: out std_logic);
End mux_21;
Architecture behavioral of mux_21 is
Begin
Process(A,B)
Begin
If (s=’0’) then y<=A;
Else y<=B;
End if;
End process;
End Behavioral;
bảng chân lý:
S
0
0
1
1
A
0
1
X
X
B
X
X
0
1
Y
0
1
0
1
Bài 16: mạch giải mã địa chỉ 4bit:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Entity giaima_4bit is
Port (x:in integer range 0 to 15;
A,C,D: out std_logic;
B: out std_logic_vector(3 downto 0));
End giaima_4bit;
Architecture logic of giaima_4bit is
Begin
Process(x)
Begin
A<=’0’;
B<=(others=>’0’);
C<=’0’;
D<=’0’;
Case (x) is
When 0 to 3 => A<=’1’;
When 4 => B(0)<=’1’;
When 5 => B(1)<=’1’;
When 6 => B(2)<=’1’;
When 7 => B(3)<=’1’;
When 8 to 11 => C<=’1’;
When 12 to 15 => D<=’1’;
End case;
End process;
End logic;
Bài 17: Cổng 3 trạng thái:
Loại 1: sử dụng when:
+mô tả hoạt động:
cổng 3 trạng thái có đầu ra output=input khi ena=0 và có
bằng trở kháng cao khi ena=1.
+chương trình:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Entity 3trangthai is
Port (ena:in std_logic;
input:in std_logic;
output: out std_logic);
End 3trangthai;
Architecture Behavioral of 3trangthai is
Begin
Output<=input when (ena=’0’)
Else (others => ‘z’);
End Behavioral;
Loại 2: sử dụng if:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Entity 3trangthai is
Port (A,E: out std_logic;
y: out std_logic);
End 3trangthai;
Architecture Behavioral of 3trangthai is
Begin
If (E=’0’) then y=’A’;
Else y=’z’;
End Behavioral;
sơ đồ:
bảng chân lý:
En
a
0
1
In Out
1
Z
1
z
Sơ đồ:
bảng chân lý:
E
0
1
A y
1 1
Z z
- Xem thêm -