lOMoARcPSD| 58815430
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA KỸ THUT ĐIỆN TỬ 1
־־־־־־־־־־
O CÁO
BÀI TẬP LỚN MÔN THIẾT KẾ LOGIC SỐ
Nhóm 17
Giảng Viên: TS. Trần Thị Thúy Hà
Tên Thành Viên: Vũ Văn Luật: B20DCDT122
Đoàn Công Minh: B20DCDT134
Hà Nội 2023
lOMoARcPSD| 58815430
MỤC LỤC
Câu 1: Viết chương trình điều khiển 8 led sang lan từ giữa sang hai bên. Viết testbench để
kiểm tra hoạt động của mạch.......................3
1. Sơ đồ khối.........................................................................................3
2. Nguyên lý..........................................................................................3
3. Quá trình thực hiện.........................................................................3
4. Kết qu..............................................................................................5
Câu 2:.........................................................................................................6
Phần 1: Phân ch..................................................................................6
Phần 2: Code VHDL................................................................................9
Câu 3:.......................................................................................................13
Phần 1: Tính mã Gray kếếp............................................................13
Phần 2: Hiển thị sử dụng 2 led 7 đoạn Anode chung....................14
Phần 3: Code VHDL..............................................................................15
Câu 4: Viết chương trình mô tả bộ giải mã 3:8, có đầu vào điều khiển hoạt động ở mức thấp,
lối ra hiển thị trên LED đơn. Viết testbench để kiểm tra
hoạt động của mạch..................................................................................18
1. Sơ đồ khối.......................................................................................18
2. Nguyên lý........................................................................................18
3. Quá trình thực hiện.......................................................................18
4. Kết qu............................................................................................22
Câu 5:.......................................................................................................22
Phần 1: Phân ch mạch logic tuần tự..............................................22
Phần 2: Code VHDL..............................................................................23
lOMoARcPSD| 58815430
Câu 1: Viết chương trình điều khiển 8 led sang lan từ gia sang hai bên. Viết
testbench để kiểm tra hoạt động của mch
1. Sơ đồ khi
2. Nguyên lý
+ Mạch điều khiển LED được kích hoạt bởi n hiệu clk (clock) và n hiệu reset (đặt
lại).
+ Khi n hiệu reset được kích hoạt (ở mức logic '1'), mạch đặt lại trng thái ban đầu
( trang thái ban đầu 00000000 ). Các LED được tắt ( các LED đơn đấu anode chung
).
+ Khi n hiệu reset không, mạch sẽ hoạt động như sau:
Nếu trạng thái hiện tại là 00000000 thì trạng thái ếp theo là 00011000
hai LED ở giữa được bật, còn lại tất cả các LED khác đều tắt.
Nếu trạng thái hiện tại là 00011000 thì trạng thái ếp theo là 00111100
bốn LED ở giữa sáng.
Nếu trạng thái hiện tại là 00111100 thì trạng thái ếp theo là 01111110
sáu LED ở giữa sáng.
Nếu trạng thái hiện tại là 01111110 thì trạng thái ếp theo là 111111 tám
LED sáng.
Nếu trạng thái hiện tại là 11111111 thì trạng thái ếp theo là 00000000
tám LED tắt.
3. Quá trình thực hiện
- Main
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
enty dk_8_led_test is
rst
lOMoARcPSD| 58815430
Port ( clock : in
std_logic; reset : in
std_logic;
led_out : out std_logic_vector(7 downto 0)
);
end dk_8_led_test;
architecture Behavioral of dk_8_led_test is signal t :
std_logic_vector(7 downto 0); begin
process( clock, reset) begin
if (reset = '1') then t
<= "00000000";
elsif ( clock'event and clock = '1' ) then case t is
when "00000000" => t <=
"00011000"; when "00011000"
=> t <=
"00111100"; when "00111100"
=> t <=
"01111110"; when "01111110"
=> t <=
"11111111"; when "11111111"
=> t <=
"00000000"; when others => t <=
"00000000";
end case;
end if;
end process; led_out <= t;
end Behavioral;
- Testbench
lOMoARcPSD| 58815430
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
enty tb_dk_8_led is
-- Port ( );
end tb_dk_8_led; architecture Behavioral of
tb_dk_8_led is
component dk_8_led_test
Port ( clock : in
std_logic; reset : in
std_logic;
led_out : out std_logic_vector(7 downto 0)
);
end component;
signal clock : std_logic := '0'; signal reset :
std_logic;-- := '0';
signal led_out : std_logic_vector(7 downto 0);
begin
u: dk_8_led_test port map(clock=>clock, reset=>reset, led_out=>led_out);
clock <= not clock aer 0.5ns; -- reset <=
not reset aer 12.5ns;
process
begin
reset <= '0';-- aer 12.5ns;
wait for 12.5ns; reset <= '1';-- aer
2ns; wait for 2ns;
end process; end
Behavioral;
lOMoARcPSD| 58815430
4. Kết quả
Câu 2:
Viết chương trình tả mạch phát hiện chuỗi bit nhị phân liên ếp, đầu ra của 1
khi xuất hiện 4 hoặc nhiều hơn 4 bit 1 liên tục và đầu ra 0 trong các trường hợp còn
lại. Viết testbench đkiểm tra hoạt động của mạch. Bài làm
Phần 1: Phân ch
NX: để phát hiện được 4 bit thì phải nhớ được 3 bit trước đó.
S
n+1
= Q1Q0X (dịch X vào đẩy Q2 ra)
Bảng chuyển đổi trạng thái
Sn+1
Z
X=0
X=1
X=0
X=1
Q2Q1Q0
Q2Q1Q0
Q2Q1Q0
Q2Q1Q0
000
001
0
0
010
011
0
0
100
101
0
0
110
111
0
0
000
001
0
0
010
011
0
0
100
101
0
0
lOMoARcPSD| 58815430
110
111
0
1
Mã hóa trạng thái
S
S
Sn+1
Z
X=0
X=1
X=0
X=1
Q2Q1Q0
Q2Q1Q0
Q2Q1Q0
Q2Q1Q0
000
S0
S0
S1
0
0
001
S1
S2
S3
0
0
010
S2
S4
S5
0
0
011
S3
S6
S7
0
0
100
S4
S0
S1
0
0
101
S5
S2
S3
0
0
110
S6
S4
S5
0
0
111
S7
S6
S7
0
1
lOMoARcPSD| 58815430
Rút gọn
S0 S4 S04, S1 S5 S15, S2 S6 S26
S
Sn+1
Z
X=0
X=1
X=0
X=1
Q2Q1Q0
Q2Q1Q0
Q2Q1Q0
S04
S04
S15
0
0
S15
S26
S3
0
0
S26
S04
S15
0
0
S3
S26
S7
0
0
S7
S26
S7
0
1
S04 S26 S0426
S
Sn+1
Z
X=0
X=1
X=0
X=1
Q2Q1Q0
Q2Q1Q0
Q2Q1Q0
S0426
S0426
S15
0
0
S15
S0426
S3
0
0
S3
S0426
S7
0
0
S7
S0426
S7
0
1
Đồ hình trạng thái
Giả sử: S0426 S0, S15 S1, S3 S2, S7 S3
lOMoARcPSD| 58815430
Phần 2: Code VHDL Sơ
đồ khi:
Code: library IEEE;
use IEEE.STD_LOGIC_1164.ALL; --use
IEEE.NUMERIC_STD.ALL; --use
UNISIM.VComponents.all; enty cau_2 is
lOMoARcPSD| 58815430
Port ( clock : in std_logic;
x : in std_logic; z : out
std_logic
);
end cau_2;
architecture Behavioral of cau_2 is type th is (s0, s1, s2, s3);--kieu du lieu
liet ke tu DN signal s : th := s0; begin
process( clock )
begin if( clock'event and clock = '1' ) then case s is when
s0 => if(x='0') then s<=s0;
elsif(x='1') then s<=s1;
end if;
when s1 => if(x='0') then s<=s0;
elsif(x='1') then s<=s2;
end if;
when s2 => if(x='0') then s<=s0;
elsif(x='1') then s<=s3;
end if;
when s3 => if(x='0') then s<=s0;
elsif(x='1') then s<=s3;
end if;
end case;
end if;
end process;
process( clock ) begin
if( clock'event and clock = '1' ) then if(
s=s3 and x='1') then z<='1'; else
lOMoARcPSD| 58815430
z<='0'; end if; end if; end process; end
Behavioral;
Testbench:
library IEEE; use
IEEE.STD_LOGIC_1164.ALL; --use
IEEE.NUMERIC_STD.ALL; --use
UNISIM.VComponents.all; enty
tb_cau_2 is
-- Port ( );
end tb_cau_2;
architecture Behavioral of tb_cau_2 is component
cau_2
port(
clock : in std_logic; x
: in std_logic; z : out
std_logic
);
end component; signal clock : std_logic :=
'0'; signal x : std_logic := '0'; signal z :
std_logic := '0'; begin
u : cau_2 port map( clock=>clock, x=>x, z=>z); clock <= not
clock aer 0.5ns;-- chu ky clock 1ns process begin x
<= '0'; wait for 0.2ns; x <= '0'; wait for 2ns;
x <= '1'; wait
for 1ns; x <= '0';
wait for 1ns; x <=
'1'; wait for 3ns;
x <= '0'; wait for
lOMoARcPSD| 58815430
1ns; x <= '1';
wait for 4ns; x <=
'0'; wait for 1ns;
x <= '1'; wait for
5ns;
-- x = 001011101111011111 end
process;
end Behavioral; Run
simulaon
Câu 3:
Viết chương trình mô tả bộ đếm Gray 4 bit và hiển thị kết quả ới dạng thập phân
trên LED 7 thanh. Viết testbench để kiểm tra hoạt động của mạch.
Bài làm
Phần 1: Tính mã Gray kế ếp.
Mã Gray: là mã có 2 từ mã liên ếp chỉ khác nhau đúng một bit. Để xác định mã
Gray kế ếp ta sử dụng cách:
Từ mã Gray hiện tai -> BCD tương ứng -> lấy mã BCD đó +1 ->
Gray (gray kế ếp)
lOMoARcPSD| 58815430
Từ Gray sang BCD :
G3G2G1G0 -> B3B2B1B0
B3 = G3 = 0 xor 0 xor 0 xor G3
B2 = G3 xor G2= 0 xor 0 xor G3 xor G2
B1 = G3 xor G2 xor G1 = 0 xor G3 xor G2 xor G1
B0 = G3 xor G2 xor G1 xor G0= G3 xor G2 xor G1xor
G0
-> code: B(3 downto 0) = G( 3 downto 0) xor ( ‘0’ & G( 3 downto 1))
xor ( “00” & G(3 downto 2)) xor (“000” & G(3)).
Từ BCD sang Gray:
B3B2B1B0 -> G3G2G1G0
G3 = 0 xor B3
G2 = B3 xor B2
G1 = B2 xor B1
G0 = B1 xor B0
-> code: G(3 downto 0) = B(3 downto 0) xor ( ‘0’ & B(3 downto
lOMoARcPSD| 58815430
1))
Phần 2: Hiển thị sử dụng 2 led 7 đoạn Anode chung. Led 7 đoạn
Anode chung
h g f e d c b a
11000000 : s0 - các thanh từ a-f sáng
11111001 : số 1
10100100 : số 2
10110000 : số 3
10011001 : số 4
10010010 : số 5
10000011 : số 6
11111000 : số 7
10000000 : số 8
10010000 : số 9
Sử dụng 2 chuỗi 8 bit để điều khiển 2 led 7 thanh.
Phần 3: Code VHDL
Sơ đồ khi:
lOMoARcPSD| 58815430
Code: library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use
IEEE.NUMERIC_STD.ALL; --use
UNISIM.VComponents.all;
enty cau_3 is
Port ( clock : in std_logic;
reset : in std_logic;
gray_out : out std_logic_vector(3 downto 0); don_vi : out
std_logic_vector(7 downto 0);
chuc : out std_logic_vector(7 downto 0);
);
end cau_3;
architecture Behavioral of cau_3 is signal t_g_chuyen : std_logic_vector(3
downto 0) := "1000"; signal t_b : std_logic_vector(3 downto 0); signal
t_b_1 : std_logic_vector(3 downto 0); signal t_g_out : std_logic_vector(3
downto 0);
begin
process( clock, reset) begin if (reset = '1') then
t_g_chuyen <= "1000"; elsif ( clock'event and clock = '1' )
then t_g_chuyen <= t_g_out; end if;
end process;
t_b(3 downto 0) <= t_g_chuyen(3 downto 0) xor ( '0' & t_b(3 downto 1));
t_b_1 <= std_logic_vector(unsigned(t_b) + 1);-- IEEE.NUMERIC_STD.ALL
t_g_out(3 downto 0) <= t_b_1(3 downto 0) xor ( '0' & t_b_1(3 downto 1));
gray_out <= t_g_out;
lOMoARcPSD| 58815430
process( t_g_out )
begin case t_b_1 is
when "0000" => chuc <= "11000000"; don_vi <=
"11000000";-- h g f e d c b a
when "0001" => chuc <= "11000000"; don_vi <=
"11111001";-- 01
when "0010" => chuc <= "11000000"; don_vi <=
"10100100";-- 02
when "0011" => chuc <= "11000000"; don_vi <=
"10110000";-- 03
when "0100" => chuc <= "11000000"; don_vi <=
"10011001";-- 04
when "0101" => chuc <= "11000000"; don_vi <=
"10010010";-- 05
when "0110" => chuc <= "11000000"; don_vi <=
"10000011";-- 06
when "0111" => chuc <= "11000000"; don_vi <=
"11111000";-- 07
when "1000" => chuc <= "11000000"; don_vi <=
"10000000";-- 08
when "1001" => chuc <= "11000000"; don_vi <=
"10010000";-- 09
when "1010" => chuc <= "11111001"; don_vi <=
"11000000";-- 10
when "1011" => chuc <= "11111001"; don_vi <=
"11111001";-- 11
when "1100" => chuc <= "11111001"; don_vi <= "10100100";-- 12
when "1101" => chuc <= "11111001"; don_vi <=
"10110000";-- 13
when "1110" => chuc <= "11111001"; don_vi <=
"10011001";-- 14
when "1111" => chuc <= "11111001"; don_vi <=
"10010010";-- 15
when others => chuc <= "01111111"; don_vi <=
"01111111";
end case; end
process; end
Behavioral;
lOMoARcPSD| 58815430
Testbench:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.NUMERIC_STD.ALL; --use
UNISIM.VComponents.all;
enty tb_cau_3 is
-- Port ( );
end tb_cau_3;
architecture Behavioral of tb_cau_3 is component
cau_3
Port ( clock : in std_logic;
reset : in std_logic;
gray_out : out std_logic_vector(3 downto 0); don_vi : out
std_logic_vector(7 downto 0);
chuc : out std_logic_vector(7 downto 0)
);
end component;
signal clock : std_logic := '0'; signal reset :
std_logic;
signal gray_out : std_logic_vector(3 downto 0); signal don_vi :
std_logic_vector(7 downto 0); signal chuc : std_logic_vector(7
downto 0);
begin
u : cau_3 port map(clock=>clock, reset=>reset, gray_out=>gray_out,
don_vi=>don_vi, chuc=>chuc);
clock <= not clock aer 0.5ns;
process
begin reset <=
'0'; wait for 20ns;
reset <= '1'; wait
for 1ns; end process;
end Behavioral; Run
simulaon
lOMoARcPSD| 58815430
lOMoARcPSD| 58815430
Câu 4: Viết chương trình mô tả bộ giải mã 3:8, có đầu vào điều khiển hoạt động ở mức
thấp, lối ra hiển thị trên LED đơn. Viết testbench để kiểm tra hoạt động của mạch.
1. Sơ đồ khi
2. Nguyên lý
Mạch này nhận hai đầu vào chính: input_control và inputs.
input_control là n hiệu kiểm soát, có 2 trạng thái: '0' và '1'. Khi
input_control là '0', mạch sẽ hoạt động ở chế độ bình thường và sẽ giải mã giá
trị của inputs thành một trong tám đèn LED được bật.
inputs là một n hiệu 3 bit, biểu thị một trong tám trạng thái khả dụng.
Mạch này sẽ chọn đèn LED cần bật dựa trên giá trị của inputs. Mỗi giá trị của
inputs tương ứng với một đèn LED. • Khi input_control là '1', tất cả các đèn
LED sẽ tắt (output_led = "00000000").
inpu ts
output_
led
E
I2
I1
I0
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
1
x
x
x
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
1
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
1
0
0
1
0
0
0
0
0
0
1
1
0
0
1
0
0
0
0
0
0
0
1
1
1
1
0
0
0
0
0
0
0
3. Quá trình thực hiện
- Main
lOMoARcPSD| 58815430

Preview text:

lOMoAR cPSD| 58815430
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA KỸ THUẬT ĐIỆN TỬ 1
־־־־־ ־־־־־ BÁO CÁO
BÀI TẬP LỚN MÔN THIẾT KẾ LOGIC SỐ Nhóm 17
Giảng Viên: TS. Trần Thị Thúy Hà
Tên Thành Viên: Vũ Văn Luật: B20DCDT122
Đoàn Công Minh: B20DCDT134 Hà Nội – 2023 lOMoAR cPSD| 58815430 MỤC LỤC
Câu 1: Viết chương trình điều khiển 8 led sang lan từ giữa sang hai bên. Viết testbench để
kiểm tra hoạt động của mạch.......................3 1.
Sơ đồ khối.........................................................................................3 2.
Nguyên lý..........................................................................................3 3.
Quá trình thực hiện.........................................................................3 4.
Kết quả..............................................................................................5
Câu 2:.........................................................................................................6
Phần 1: Phân tích..................................................................................6
Phần 2: Code VHDL................................................................................9
Câu 3:.......................................................................................................13
Phần 1: Tính mã Gray kế tiếp............................................................13
Phần 2: Hiển thị sử dụng 2 led 7 đoạn Anode chung....................14
Phần 3: Code VHDL..............................................................................15
Câu 4: Viết chương trình mô tả bộ giải mã 3:8, có đầu vào điều khiển hoạt động ở mức thấp,
lối ra hiển thị trên LED đơn. Viết testbench để kiểm tra
hoạt động của mạch..................................................................................18 1.
Sơ đồ khối.......................................................................................18 2.
Nguyên lý........................................................................................18 3.
Quá trình thực hiện.......................................................................18 4.
Kết quả............................................................................................22
Câu 5:.......................................................................................................22
Phần 1: Phân tích mạch logic tuần tự..............................................22
Phần 2: Code VHDL..............................................................................23 lOMoAR cPSD| 58815430
Câu 1: Viết chương trình điều khiển 8 led sang lan từ giữa sang hai bên. Viết
testbench để kiểm tra hoạt động của mạch 1. Sơ đồ khối rst 2. Nguyên lý
+ Mạch điều khiển LED được kích hoạt bởi tín hiệu clk (clock) và tín hiệu reset (đặt lại).
+ Khi tín hiệu reset được kích hoạt (ở mức logic '1'), mạch đặt lại trạng thái ban đầu
( trang thái ban đầu 00000000 ). Các LED được tắt ( các LED đơn đấu anode chung ).
+ Khi tín hiệu reset không, mạch sẽ hoạt động như sau: •
Nếu trạng thái hiện tại là 00000000 thì trạng thái tiếp theo là 00011000
hai LED ở giữa được bật, còn lại tất cả các LED khác đều tắt. •
Nếu trạng thái hiện tại là 00011000 thì trạng thái tiếp theo là 00111100 bốn LED ở giữa sáng. •
Nếu trạng thái hiện tại là 00111100 thì trạng thái tiếp theo là 01111110 sáu LED ở giữa sáng. •
Nếu trạng thái hiện tại là 01111110 thì trạng thái tiếp theo là 111111 tám LED sáng. •
Nếu trạng thái hiện tại là 11111111 thì trạng thái tiếp theo là 00000000 tám LED tắt.
3. Quá trình thực hiện - Main library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity dk_8_led_test is lOMoAR cPSD| 58815430 Port ( clock : in std_logic; reset : in std_logic;
led_out : out std_logic_vector(7 downto 0) ); end dk_8_led_test;
architecture Behavioral of dk_8_led_test is signal t :
std_logic_vector(7 downto 0); begin process( clock, reset) begin if (reset = '1') then t <= "00000000";
elsif ( clock'event and clock = '1' ) then case t is when "00000000" => t <= "00011000"; when "00011000" => t <= "00111100"; when "00111100" => t <= "01111110"; when "01111110" => t <= "11111111"; when "11111111" => t <=
"00000000"; when others => t <= "00000000"; end case; end if; end process; led_out <= t; end Behavioral; - Testbench lOMoAR cPSD| 58815430 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity tb_dk_8_led is -- Port ( );
end tb_dk_8_led; architecture Behavioral of tb_dk_8_led is component dk_8_led_test Port ( clock : in std_logic; reset : in std_logic;
led_out : out std_logic_vector(7 downto 0) ); end component;
signal clock : std_logic := '0'; signal reset : std_logic;-- := '0';
signal led_out : std_logic_vector(7 downto 0); begin
u: dk_8_led_test port map(clock=>clock, reset=>reset, led_out=>led_out);
clock <= not clock after 0.5ns; -- reset <= not reset after 12.5ns; process begin
reset <= '0';-- after 12.5ns;
wait for 12.5ns; reset <= '1';-- after 2ns; wait for 2ns; end process; end Behavioral; lOMoAR cPSD| 58815430 4. Kết quả Câu 2:
Viết chương trình mô tả mạch phát hiện chuỗi bit nhị phân liên tiếp, đầu ra của nó là 1
khi xuất hiện 4 hoặc nhiều hơn 4 bit 1 liên tục và đầu ra là 0 trong các trường hợp còn
lại. Viết testbench để kiểm tra hoạt động của mạch. Bài làm Phần 1: Phân tích
NX: để phát hiện được 4 bit thì phải nhớ được 3 bit trước đó.
Sn+1 = Q1Q0X (dịch X vào đẩy Q2 ra)
Bảng chuyển đổi trạng thái S Sn+1 Z X=0 X=1 X=0 X=1 Q2Q1Q0 Q2Q1Q0 Q2Q1Q0 Q2Q1Q0 Q2Q1Q0 000 000 001 0 0 001 010 011 0 0 010 100 101 0 0 011 110 111 0 0 100 000 001 0 0 101 010 011 0 0 110 100 101 0 0 lOMoAR cPSD| 58815430 111 110 111 0 1 Mã hóa trạng thái S S Sn+1 Z X=0 X=1 X=0 X=1 Q2Q1Q0 Q2Q1Q0 Q2Q1Q0 Q2Q1Q0 000 S0 S0 S1 0 0 001 S1 S2 S3 0 0 010 S2 S4 S5 0 0 011 S3 S6 S7 0 0 100 S4 S0 S1 0 0 101 S5 S2 S3 0 0 110 S6 S4 S5 0 0 111 S7 S6 S7 0 1 lOMoAR cPSD| 58815430 Rút gọn
S0 S4 S04, S1 S5 S15, S2 S6 S26 S Sn+1 Z X=0 X=1 X=0 X=1 Q2Q1Q0 Q2Q1Q0 Q2Q1Q0 S04 S04 S15 0 0 S15 S26 S3 0 0 S26 S04 S15 0 0 S3 S26 S7 0 0 S7 S26 S7 0 1 S04 S26 S0426 S Sn+1 Z X=0 X=1 X=0 X=1 Q2Q1Q0 Q2Q1Q0 Q2Q1Q0 S0426 S0426 S15 0 0 S15 S0426 S3 0 0 S3 S0426 S7 0 0 S7 S0426 S7 0 1 Đồ hình trạng thái
Giả sử: S0426 S0, S15 S1, S3 S2, S7 S3 lOMoAR cPSD| 58815430
Phần 2: Code VHDL Sơ đồ khối: Code: library IEEE;
use IEEE.STD_LOGIC_1164.ALL; --use IEEE.NUMERIC_STD.ALL; --use
UNISIM.VComponents.all; entity cau_2 is lOMoAR cPSD| 58815430 Port ( clock : in std_logic; x : in std_logic; z : out std_logic ); end cau_2;
architecture Behavioral of cau_2 is type th is (s0, s1, s2, s3);--kieu du lieu
liet ke tu DN signal s : th := s0; begin process( clock )
begin if( clock'event and clock = '1' ) then case s is when
s0 => if(x='0') then s<=s0; elsif(x='1') then s<=s1; end if;
when s1 => if(x='0') then s<=s0; elsif(x='1') then s<=s2; end if;
when s2 => if(x='0') then s<=s0; elsif(x='1') then s<=s3; end if;
when s3 => if(x='0') then s<=s0; elsif(x='1') then s<=s3; end if; end case; end if; end process; process( clock ) begin
if( clock'event and clock = '1' ) then if(
s=s3 and x='1') then z<='1'; else lOMoAR cPSD| 58815430
z<='0'; end if; end if; end process; end Behavioral; Testbench: library IEEE; use
IEEE.STD_LOGIC_1164.ALL; --use IEEE.NUMERIC_STD.ALL; --use
UNISIM.VComponents.all; entity tb_cau_2 is -- Port ( ); end tb_cau_2;
architecture Behavioral of tb_cau_2 is component cau_2 port( clock : in std_logic; x : in std_logic; z : out std_logic );
end component; signal clock : std_logic :=
'0'; signal x : std_logic := '0'; signal z : std_logic := '0'; begin
u : cau_2 port map( clock=>clock, x=>x, z=>z); clock <= not
clock after 0.5ns;-- chu ky clock 1ns process begin x
<= '0'; wait for 0.2ns; x <= '0'; wait for 2ns; x <= '1'; wait for 1ns; x <= '0'; wait for 1ns; x <= '1'; wait for 3ns; x <= '0'; wait for lOMoAR cPSD| 58815430 1ns; x <= '1'; wait for 4ns; x <= '0'; wait for 1ns; x <= '1'; wait for 5ns;
-- x = 001011101111011111 end process; end Behavioral; Run simulation Câu 3:
Viết chương trình mô tả bộ đếm Gray 4 bit và hiển thị kết quả dưới dạng thập phân
trên LED 7 thanh. Viết testbench để kiểm tra hoạt động của mạch. Bài làm
Phần 1: Tính mã Gray kế tiếp.
Mã Gray: là mã có 2 từ mã liên tiếp chỉ khác nhau đúng một bit. Để xác định mã
Gray kế tiếp ta sử dụng cách:
Từ mã Gray hiện tai -> BCD tương ứng -> lấy mã BCD đó +1 -> Gray (gray kế tiếp) lOMoAR cPSD| 58815430 Từ Gray sang BCD : G3G2G1G0 -> B3B2B1B0
B3 = G3 = 0 xor 0 xor 0 xor G3
B2 = G3 xor G2= 0 xor 0 xor G3 xor G2 B1 = G3 xor G2 xor G1 = 0 xor G3 xor G2 xor G1
B0 = G3 xor G2 xor G1 xor G0= G3 xor G2 xor G1xor G0
-> code: B(3 downto 0) = G( 3 downto 0) xor ( ‘0’ & G( 3 downto 1))
xor ( “00” & G(3 downto 2)) xor (“000” & G(3)). Từ BCD sang Gray: B3B2B1B0 -> G3G2G1G0 G3 = 0 xor B3 G2 = B3 xor B2 G1 = B2 xor B1 G0 = B1 xor B0
-> code: G(3 downto 0) = B(3 downto 0) xor ( ‘0’ & B(3 downto lOMoAR cPSD| 58815430 1))
Phần 2: Hiển thị sử dụng 2 led 7 đoạn Anode chung. Led 7 đoạn Anode chung h g f e d c b a
11000000 : số 0 - các thanh từ a-f sáng 11111001 : số 1 10100100 : số 2 10110000 : số 3 10011001 : số 4 10010010 : số 5 10000011 : số 6 11111000 : số 7 10000000 : số 8 10010000 : số 9
Sử dụng 2 chuỗi 8 bit để điều khiển 2 led 7 thanh. Phần 3: Code VHDL Sơ đồ khối: lOMoAR cPSD| 58815430 Code: library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; --use UNISIM.VComponents.all; entity cau_3 is Port ( clock : in std_logic; reset : in std_logic;
gray_out : out std_logic_vector(3 downto 0); don_vi : out std_logic_vector(7 downto 0);
chuc : out std_logic_vector(7 downto 0); ); end cau_3;
architecture Behavioral of cau_3 is signal t_g_chuyen : std_logic_vector(3
downto 0) := "1000"; signal t_b : std_logic_vector(3 downto 0); signal
t_b_1 : std_logic_vector(3 downto 0); signal t_g_out : std_logic_vector(3 downto 0); begin
process( clock, reset) begin if (reset = '1') then
t_g_chuyen <= "1000"; elsif ( clock'event and clock = '1' )
then t_g_chuyen <= t_g_out; end if; end process;
t_b(3 downto 0) <= t_g_chuyen(3 downto 0) xor ( '0' & t_b(3 downto 1));
t_b_1 <= std_logic_vector(unsigned(t_b) + 1);-- IEEE.NUMERIC_STD.ALL
t_g_out(3 downto 0) <= t_b_1(3 downto 0) xor ( '0' & t_b_1(3 downto 1)); gray_out <= t_g_out; lOMoAR cPSD| 58815430 process( t_g_out ) begin case t_b_1 is
when "0000" => chuc <= "11000000"; don_vi <= "11000000";-- h g f e d c b a
when "0001" => chuc <= "11000000"; don_vi <= "11111001";-- 01
when "0010" => chuc <= "11000000"; don_vi <= "10100100";-- 02
when "0011" => chuc <= "11000000"; don_vi <= "10110000";-- 03
when "0100" => chuc <= "11000000"; don_vi <= "10011001";-- 04
when "0101" => chuc <= "11000000"; don_vi <= "10010010";-- 05
when "0110" => chuc <= "11000000"; don_vi <= "10000011";-- 06
when "0111" => chuc <= "11000000"; don_vi <= "11111000";-- 07
when "1000" => chuc <= "11000000"; don_vi <= "10000000";-- 08
when "1001" => chuc <= "11000000"; don_vi <= "10010000";-- 09
when "1010" => chuc <= "11111001"; don_vi <= "11000000";-- 10
when "1011" => chuc <= "11111001"; don_vi <= "11111001";-- 11
when "1100" => chuc <= "11111001"; don_vi <= "10100100";-- 12
when "1101" => chuc <= "11111001"; don_vi <= "10110000";-- 13
when "1110" => chuc <= "11111001"; don_vi <= "10011001";-- 14
when "1111" => chuc <= "11111001"; don_vi <= "10010010";-- 15
when others => chuc <= "01111111"; don_vi <= "01111111"; end case; end process; end Behavioral; lOMoAR cPSD| 58815430 Testbench: library IEEE; use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.NUMERIC_STD.ALL; --use UNISIM.VComponents.all; entity tb_cau_3 is -- Port ( ); end tb_cau_3;
architecture Behavioral of tb_cau_3 is component cau_3 Port ( clock : in std_logic; reset : in std_logic;
gray_out : out std_logic_vector(3 downto 0); don_vi : out std_logic_vector(7 downto 0);
chuc : out std_logic_vector(7 downto 0) ); end component;
signal clock : std_logic := '0'; signal reset : std_logic;
signal gray_out : std_logic_vector(3 downto 0); signal don_vi :
std_logic_vector(7 downto 0); signal chuc : std_logic_vector(7 downto 0); begin
u : cau_3 port map(clock=>clock, reset=>reset, gray_out=>gray_out,
don_vi=>don_vi, chuc=>chuc);
clock <= not clock after 0.5ns; process begin reset <= '0'; wait for 20ns; reset <= '1'; wait for 1ns; end process; end Behavioral; Run simulation lOMoAR cPSD| 58815430 lOMoAR cPSD| 58815430
Câu 4: Viết chương trình mô tả bộ giải mã 3:8, có đầu vào điều khiển hoạt động ở mức
thấp, lối ra hiển thị trên LED đơn. Viết testbench để kiểm tra hoạt động của mạch. 1. Sơ đồ khối 2. Nguyên lý
Mạch này nhận hai đầu vào chính: input_control và inputs. •
input_control là tín hiệu kiểm soát, có 2 trạng thái: '0' và '1'. Khi
input_control là '0', mạch sẽ hoạt động ở chế độ bình thường và sẽ giải mã giá
trị của inputs thành một trong tám đèn LED được bật. •
inputs là một tín hiệu 3 bit, biểu thị một trong tám trạng thái khả dụng.
Mạch này sẽ chọn đèn LED cần bật dựa trên giá trị của inputs. Mỗi giá trị của
inputs tương ứng với một đèn LED. •
Khi input_control là '1', tất cả các đèn
LED sẽ tắt (output_led = "00000000"). inpu ts output_ led E I2 I1 I0 Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 1 x x x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 3.
Quá trình thực hiện - Main lOMoAR cPSD| 58815430