Tải bản đầy đủ (.docx) (65 trang)

thiết kế logic số VHDL

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.14 MB, 65 trang )

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA ĐIỆN TỬ

BÀI TẬP LỚN MƠN THIẾT KẾ LOGIC SỐ
Nhóm 01
Thành viên nhóm:
Phạm Thế Anh – B20DCDT017
Nguyễn Tiến Duy – B20DCDT037

Hà Nội, 2023


MỤC LỤC
Câu 1: Viết chương trình mơ tả thanh ghi 8 bit (CLK, CLR, D). Viết testbench
để kiểm tra hoạt động của mạch............................................................................4
1.1.

Mơ hình......................................................................................................4

1.2.

Ngun lý...................................................................................................4

1.3.

Mơ tả VHDL..............................................................................................5

1.4.

Mơ tả testbench..........................................................................................5


1.5.

Code VHDL...............................................................................................6

1.6.

Kết quả mơ phỏng......................................................................................8

Câu 2: Viết chương trình nhị phân mơ tả bộ đếm tiến nhị phân 4 bit (CLK,
CLR, Pause) dùng trigơ JK. Viết testbench để kiểm tra hoạt động của mạch..9
2.1.

Mơ hình......................................................................................................9

2.2.

Trigơ JK.....................................................................................................9

2.3.

Bộ đếm tiến nhị phân 4 bit.......................................................................15

Câu 3: Viết chương trình miêu tả bộ đếm tiến BCD hiển thị trên led 7 đoạn
Anode chung (CLK, CLR, Pause). Viết testbench để kiểm tra hoạt động của
mạch........................................................................................................................22
3.1. Lên ý tưởng thiết kế mạch............................................................................22
3.2. Thiết kế khối đếm tiến BCD.........................................................................22
3.3. Thiết kế khối giải mã BCD sang led 7 đoạn loại Anode chung...................34
3.4. Kết hợp hai khối trên để tạo thành mạch hồn chỉnh...................................40
Câu 4: Viết chương trình mơ tả bộ hợp kênh 8:1 (Enable hoạt động mức

thấp). Viết testbench để kiểm tra hoạt động của mạch......................................46
4.1.

Mơ hình....................................................................................................46

4.2.

Ngun lý.................................................................................................46

4.3.

Mơ tả VHDL............................................................................................47

4.4.

Mô tả testbench........................................................................................48

4.5.

Code VHDL.............................................................................................49

4.6.

Kết quả mô phỏng....................................................................................51
2


Câu 5: Viết mô tả VHDL (Entity và Architecture) cho mạch đó. Viết
testbench để kiểm tra hoạt động của mạch.........................................................52
5.1. Mơ tả mơ hình chung của một trigger D......................................................52

5.2. Kết nối các trigger D đã mô tả ở phần trên theo mạch đã cho.....................57
5.3. Phân tích hoạt động của mạch......................................................................60
5.4. Viết testbench mô phỏng cho mạch..............................................................62
5.5. Kết quả mô phỏng:.......................................................................................64

3


Câu 1: Viết chương trình mơ tả thanh ghi 8 bit (CLK, CLR, D). Viết
testbench để kiểm tra hoạt động của mạch.
1.1.

Mơ hình

1.2.

Ngun lý
- Thanh ghi 8 bit gồm: Đầu vào 8 bit, đầu ra 8 bit, xung Clock đầu vào tích
cực cao, đầu vào Clear tích cực thấp.
- Hoạt động:
 Đầu vào 8 bit xác định giá trị đầu ra 8 bit tương ứng
 Mỗi khi xung Clock thay đổi trạng thái theo hướng tích cực cao thì đầu ra
sẽ được lập giá trị tương ứng đầu vào hoặc bằng 0x00 tùy theo giá trị đầu
vào Clear:
. Clear tích cực cao thì đầu ra bằng đầu vào
. Clear tích cực thấp thì đầu ra bằng 0x00
Clear
0
1


D
X
X

Q
0
X
4


1.3.

Mô tả VHDL
- Register 8 bit  Chọn đơn vị thiết kế Entity
Mơ tả đơn vị thiết kế
Port

Kiểu dữ liệu

Hướng

Kích thước

D(dữ liệu vào)
Q(dữ liệu ra)
Clock
Clear

std_logic_vector
std_logic_vector

std_logic
std_logic

in
out
in
in

8
8
1
1

entity reg8 is
port( D: in std_logic_vector (7 downto 0);
CLK: in std_logic;
CLR: in std_logic;
Q: out std_logic_vector (7 downto 0):=(others => '0') );
end reg8;

- Tạo process cho entity Register 8 bit có các hành vi:
 Phát hiện trạng thái xung Clock, tiếp tục xử lý khi tích cực cao
if rising_edge(CLK) then

 Kiểm tra trạng thái chân Clear sử dụng lệnh if
 Xác định đầu ra theo 2 trường hợp:
. Clear = 0  Q = 0x00
. Clear = 1  Q = D
if CLR = '0' then
Q <= (others => '0');

else Q <= D;
end if;

1.4.

Mô tả testbench
- Mô tả hệ thống theo mơ hình cấu trúc sử dụng component, port map và các
tín hiệu nội bộ signal:
 Khai báo trong architecture
 Khai báo thực thể con component có port tương ứng entity Register 8 bit
 Khai báo các tín hiệu nội bộ cho từng port tương ứng entity Register 8
bit
5


 Gọi component Register 8 bit bằng port map
architecture Behaviorial of tb_reg8 is
component reg8
port(
D: in std_logic_vector (7 downto 0);
CLK: in std_logic;
CLR: in std_logic;
Q: out std_logic_vector (7 downto 0) );
end component;
signal D : std_logic_vector (7 downto 0) := (others => '0');
signal Q : std_logic_vector (7 downto 0) := (others => '0');
signal CLK : std_logic;
signal CLR : std_logic := '1';
begin
Register8 : reg8 port map ( D => D, CLK => CLK, CLR => CLR, Q => Q );


- Các process mô phỏng:
 Clock: lật trạng thái mỗi 100 ns
 Đầu vào:
. Gán D bằng 0x01, chờ 200 ns
. Gán D bằng 0x80, chờ 200 ns
. Gán Clear bằng 0, chờ vô cùng
CLK_PROCESS: process
begin
CLK <= '0'; wait for 100 ns;
CLK <= '1'; wait for 100 ns;
end process;
SIMULATE: process
begin
D <= "00000001"; wait for 200 ns;
D <= "10000000"; wait for 200 ns;
CLR <= '0';
wait;
end process;

1.5.

Code VHDL

6


reg8.vhd
library ieee;
use ieee.std_logic_1164.all;

entity reg8 is
port( D: in std_logic_vector (7 downto 0);
CLK: in std_logic;
CLR: in std_logic;
Q: out std_logic_vector (7 downto 0):=(others => '0') );
end reg8;
architecture Behaviorial of reg8 is
begin
process(CLK)
begin
if rising_edge(CLK) then
--Clock tich cuc cao
if CLR = '0' then
--Clear tich cuc thap
Q <= (others => '0');
else Q <= D;
end if;
end if;
end process;
end Behaviorial;

tb_reg8.vhd
library ieee;
use ieee.std_logic_1164.all;
entity tb_reg8 is
end tb_reg8;
architecture Behaviorial of tb_reg8 is
component reg8
port(
D: in std_logic_vector (7 downto 0);

CLK: in std_logic;
CLR: in std_logic;
Q: out std_logic_vector (7 downto 0) );
end component;
signal D : std_logic_vector (7 downto 0) := (others => '0');
signal Q : std_logic_vector (7 downto 0) := (others => '0');
signal CLK : std_logic;
signal CLR : std_logic := '1';
begin
Register8 : reg8 port map (D => D, CLK => CLK, CLR => CLR, Q => Q );
CLK_PROCESS: process
begin
CLK <= '0'; wait
CLK <= '1'; wait
end process;
SIMULATE: process
begin
D <= "00000001";
D <= "10000000";
CLR <= '0';
wait;
end process;
end Behaviorial;

for 100 ns;
for 100 ns;

wait for 200 ns;
wait for 200 ns;


7


1.6.

Kết quả mơ phỏng
Lập giá trị đầu ra

Xóa giá trị đầu ra

8


Câu 2: Viết chương trình nhị phân mơ tả bộ đếm tiến nhị phân 4 bit
(CLK, CLR, Pause) dùng trigơ JK. Viết testbench để kiểm tra hoạt
động của mạch.
2.1.

Mơ hình

Thực hiện mơ tả các thành phần trigơ JK, sau đó mơ tả bộ đếm 4 bit

2.2.

Trigơ JK

2.2.1. Mơ hình

9



2.2.2. Nguyên lý
Bảng trạng thái
J
0

K
0

CLK
Falling

Q
Q0

QR
!Q0

0
1
1

1
0
1

Falling
Falling
Falling


0
1
!Q0

1
0
Q0

State
nochang
e
clear
set
flip

- Trigơ cho giá trị đầu ra tương đương bảng trạng thái
- Ngồi ra tín hiệu CLR tích cực thấp sẽ đưa giá trị đầu ra Q về 0
2.2.3. Mô tả VHLD
- Chọn đơn vị thiết kế Entity
Mô tả đơn vị thiết kế
Port
J
K
CLK, CLR
Q, QR

Kiểu dữ liệu
std_logic
std_logic
std_logic

std_logic

Hướng
in
in
in
out

Kích thước
1
1
1
1

entity ff_jk is
port(
J, K: in std_logic;
CLR: in std_logic;
CLK: in std_logic;
Q: out std_logic;
QR: out std_logic );
end ff_jk;

- Tạo process cho entity FF_JK có các hành vi:
10


 Sử dụng một tín hiệu nội bộ signal QT để lưu giá trị tạm thời cho
đầu ra, khai báo trong architecture
architecture Behaviorial of ff_jk is

signal QT : std_logic;
begin

 Phát hiện trạng thái xung Clock, tiếp tục xử lý khi tích cực thấp
if(CLK'event and CLK='0') then

 Kiểm tra trạng thái chân Clear sử dụng lệnh if
 Xác định giá trị cho QT tương ứng với các giá trị đầu vào J, K dựa
vào bảng trạng thái
if CLR='0' then
else
if
(J='0'
elsif(J='0'
elsif(J='1'
elsif(J='1'
end if;
end if;

QT <= '0';
and
and
and
and

K='0')
K='1')
K='0')
K='1')


then
then
then
then

QT
QT
QT
QT

<=
<=
<=
<=

QT;
'0';
'1';
not (QT);

 Gán giá trị đầu ra Q và QR
Q <= QT;
QR <= not (QT);

2.2.4. Mô tả testbench
- Mô tả hệ thống theo mơ hình cấu trúc sử dụng component, port map
và các tín hiệu nội bộ signal:
 Khai báo trong architecture
 Khai báo thực thể con component có port tương ứng entity FF_JK
 Khai báo các tín hiệu nội bộ cho từng port tương ứng entity FF_JK

 Gọi component FF_JK bằng port map
architecture Behaviorial of tb_ff_jk is
component ff_jk
port(
J, K: in std_logic;
CLR: in std_logic;
CLK: in std_logic;
Q: out std_logic;
QR: out std_logic );
end component;
signal J, K, CLR, CLK, Q, QR: std_logic := '0';
begin
FFJK: ff_jk port map(
J => J, K => K, CLR => CLR, CLK => CLK,
Q => Q, QR => QR );

11


12


- Các process mô phỏng:
 Clock: lật trạng thái mỗi 3 ns
CLK_LOOP: process
begin
CLK <= not CLK; wait for 3 ns;
end process;

 Clear: đưa lên mức 1 và đợi 50 ns, đưa về mức 0 và đợi 20 ns. Lặp

lại quá trình đó.
CLR_LOOP: process
begin
CLR <= '1'; wait for 50 ns;
CLR <= '0'; wait for 20 ns;
end process;

 Đầu vào: lật J và đợi 5 ns, lật K và đợi 5 ns.
SIMULATE: process
begin
J <= not J; wait for 5 ns;
K <= not K; wait for 5 ns;
end process;

2.2.5. Code VHDL
ff_jk.vhd
library ieee;
use ieee.std_logic_1164.all;
entity ff_jk is
port(
J, K: in std_logic;
CLR: in std_logic;
CLK: in std_logic;
Q: out std_logic;
QR: out std_logic );
end ff_jk;
architecture Behaviorial of ff_jk is
signal QT : std_logic;
begin
process(CLK)

begin
if(CLK'event and CLK='0') then
if CLR='0' then QT <= '0';
else
if
(J='0' and K='0') then
elsif(J='0' and K='1') then
elsif(J='1' and K='0') then
elsif(J='1' and K='1') then
end if;
end if;
end if;
end process;
Q <= QT;
QR <= not (QT);
end Behaviorial;

QT
QT
QT
QT

<=
<=
<=
<=

QT;
'0';
'1';

not (QT);

13


tb_ff_jk.vhd
library ieee;
use ieee.std_logic_1164.all;
entity tb_ff_jk is
end tb_ff_jk;
architecture Behaviorial of tb_ff_jk is
component ff_jk
port(
J, K: in std_logic;
CLR: in std_logic;
CLK: in std_logic;
Q: out std_logic;
QR: out std_logic );
end component;
signal J, K, CLR, CLK, Q, QR: std_logic := '0';
begin
FFJK: ff_jk port map(
J => J,
K => K,
CLR => CLR,
CLK => CLK,
Q => Q,
QR => QR );
CLK_LOOP: process
begin

CLK <= not CLK; wait for 3 ns;
end process;
CLR_LOOP: process
begin
CLR <= '1'; wait for 50 ns;
CLR <= '0'; wait for 20 ns;
end process;
SIMULATE: process
begin
J <= not J; wait for 5 ns;
K <= not K; wait for 5 ns;
end process;
end Behaviorial;

2.2.6. Kết quả mô phỏng

14


2.3.

Bộ đếm tiến nhị phân 4 bit

2.3.1. Mơ hình

2.3.2. Ngun lý
Trạng thái đầu ra của bộ đếm tiến 4 bit

- Dễ thấy các đầu ra có chu kỳ tự đảo trạng thái khi Clock tích cực thấp
và sự thay đổi trạng thái các đầu ra trước đó, ta chọn trạng thái lật cho

cả 4 JK( J=K=1 ):
 Q0 đảo trạng thái cùng với chu kỳ của Clock
 Ngõ vào mặc định mức 1
15


 Q1 đảo trạng thái cùng xung xuống Q0
 Ngõ vào là Q0
 Q2 đảo trạng thái cùng xung xuống Q0 và Q1
 Ngõ vào là Q0.Q1
 Q3 đảo trạng thái cùng xung xuống Q0, Q1 và Q2
 Ngõ vào là Q0.Q1.Q2
- Tạm dừng bộ đếm bằng việc luôn đưa lối vào xung Clock ở mức 1
 Lối vào Clock là CLK+Pause, như vậy Pause mức 1 sẽ tạm
dừng bộ đếm, Pause mức 0 sẽ tiếp tục bộ đếm
- Từ đây ta có bảng trạng thái (Pause = 0)
Dạng thập phân
(Qn)
0
1
2
3
4
5
6
7
8
9
10
11

12
13
14
15

Q3Q2Q1Q0(n)

Q3Q2Q1Q0(n+1)

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

0001
0010
0011
0100

0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
0000

Dạng thập phân
(Qn+1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

0

2.3.3. Mô tả VHDL
- Tương tự, sử dụng các đơn vị thiết kế và các thành phần giống các
phần trước để mô tả entity Counter4b
entity counter_4b is
port(
Clear: in std_logic;
Clock: in std_logic;
Pause: in std_logic := '0';
Count: out std_logic_vector (3 downto 0) );
end counter_4b;

16


- Khai báo component con FF_JK
component ff_jk
port(
J, K: in std_logic;
CLR: in std_logic;
CLK: in std_logic;
Q: out std_logic;
QR: out std_logic );
end component;

- Khai báo các signal cho 3 cổng logic PA0, PA1, PA2 như trong mơ
hình
- Khai báo các signal phục vụ thu tín hiệu đầu ra tại các trigger JK lần
lượt Q0Q3, QR0QR3, sau đó tiến hành port map 4 trigger

signal PA0: std_logic := '0';
signal PA1, PA2: std_logic := '0';
signal Q1, Q2, Q3, Q4, QR1, QR2, QR3, QR4: std_logic :=
'0';
PA0 <= Clock or Pause;
PA1 <= Q1 and Q2;
PA2 <= Q1 and Q2 and Q3;
JK1:
JK2:
JK3:
JK4:

ff_jk
ff_jk
ff_jk
ff_jk

port
port
port
port

map
map
map
map

('1', '1', Clear, PA0, Q=>Q1,
( Q1, Q1, Clear, PA0, Q=>Q2,
(PA1, PA1, Clear, PA0, Q=>Q3,

(PA2, PA2, Clear, PA0, Q=>Q4,

QR=>QR1);
QR=>QR2);
QR=>QR3);
QR=>QR4);

- Cuối cùng gán lần lượt các tín hiệu đầu ra Q0Q1 vào vector
Counter 4 bit thể hiện sự thay đổi giá trị đếm
2.3.4. Mô tả testbench
- Tương tự, sử dụng các thành phần mô tả như các phần test bench
trước để khai báo và mô phỏng component con Counter4b
architecture Behaviorial of tb_counter_4b is
component counter_4b
port(
Clear: in std_logic;
Clock: in std_logic;
Pause: in std_logic;
Count: out std_logic_vector (3 downto 0) );
end component;
signal Clear: std_logic := '0';
signal Clock: std_logic := '0';
signal Pause: std_logic := '0';
signal Count: std_logic_vector (3 downto 0);

17


- Các process mô phỏng:
 Clock: lật trạng thái mỗi 5 ns

CLK_LOOP: process
begin
Clock <= not Clock; wait for 5 ns;
end process;

 Pause: đưa về mức 0 và chờ 80 ns, đưa lên mức 1 và chờ 20 ns,
như vậy bộ đếm sẽ tạm dừng trong 20 ns
PAUSE_LOOP: process
begin
Pause <= '0'; wait for 80 ns;
Pause <= '1'; wait for 20 ns;
Pause <= '0'; wait;
end process;

 Clear: mỗi 200 ns sẽ đưa Clear về mức 0 sau đó chờ 10 ns để bộ
đếm reset đếm về 0
SIMULATE: process
begin
Clear <= '0'; wait for 10 ns;
Clear <= '1'; wait for 200 ns;
end process;

2.3.5. Code VHDL
18


counter_4b.vhd
library ieee;
use ieee.std_logic_1164.all;
entity counter_4b is

port(
Clear: in std_logic;
Clock: in std_logic;
Pause: in std_logic := '0';
Count: out std_logic_vector (3 downto 0) );
end counter_4b;
architecture Behaviorial of counter_4b is
component ff_jk
port(
J, K: in std_logic;
CLR: in std_logic;
CLK: in std_logic;
Q: out std_logic;
QR: out std_logic );
end component;
signal PA0: std_logic := '0';
signal PA1, PA2: std_logic := '0';
signal Q1, Q2, Q3, Q4, QR1, QR2, QR3, QR4: std_logic := '0';
begin
PA0 <= Clock or Pause;
PA1 <= Q1 and Q2;
PA2 <= Q1 and Q2 and Q3;
JK1:
JK2:
JK3:
JK4:

ff_jk
ff_jk
ff_jk

ff_jk

Count(0)
Count(1)
Count(2)
Count(3)

<=
<=
<=
<=

port
port
port
port

map
map
map
map

('1', '1', Clear, PA0, Q=>Q1,
( Q1, Q1, Clear, PA0, Q=>Q2,
(PA1, PA1, Clear, PA0, Q=>Q3,
(PA2, PA2, Clear, PA0, Q=>Q4,

QR=>QR1);
QR=>QR2);
QR=>QR3);

QR=>QR4);

Q1;
Q2;
Q3;
Q4;

end Behaviorial;

tb_counter_4b.vhd
19


library ieee;
use ieee.std_logic_1164.all;
entity tb_counter_4b is
end tb_counter_4b;
architecture Behaviorial of tb_counter_4b is
component counter_4b
port(
Clear: in std_logic;
Clock: in std_logic;
Pause: in std_logic;
Count: out std_logic_vector (3 downto 0) );
end component;
signal Clear: std_logic := '0';
signal Clock: std_logic := '0';
signal Pause: std_logic := '0';
signal Count: std_logic_vector (3 downto 0);
begin

Counter4b: counter_4b port map (Clear, Clock, Pause, Count);
CLK_LOOP: process
begin
Clock <= not Clock; wait for 5 ns;
end process;
PAUSE_LOOP: process
begin
Pause <= '0'; wait for 80 ns;
Pause <= '1'; wait for 20 ns;
Pause <= '0'; wait;
end process;
SIMULATE: process
begin
Clear <= '0'; wait for 10 ns;
Clear <= '1'; wait for 200 ns;
end process;
end Behaviorial;

2.3.6. Kết quả mô phỏng
20



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×