Tải bản đầy đủ (.pdf) (12 trang)

Bài thí nghiệm 2 Thiết kế hệ thống số chuyên dụng

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.11 MB, 12 trang )

2. BÀI THÍ NGHIỆM SỐ 2: MÔ PHỎNG THANH GHI, BỘ ĐẾM

2.1. Mục đích, yêu cầu
a) Mục đích
Đây là bài thực hành thiết kế mạch logic tuần tự, cụ thể sinh viên sẽ
sử dụng các cú pháp tuần tự của VHDL để mô tả các thanh ghi và bộ đếm,
khối kiểm tra mạch dãy, phân tích cách thức hoạt động, giản đồ sóng theo
thời gian của các mạch tuần tự điển hình.
b) Yêu cầu
Sinh viên nhớ lại các phát biểu sử dụng trong mạch tuần tự, và viết lại
trong tệp nguồn và tệp kiểm tra.
2.2. Tóm tắt lý thuyết
a) Thanh ghi
Thanh ghi sử dụng D-flipflop và đồng bộ theo sườn dương của xung nhịp
hệ thống. Giá trị đầu ra Q thay đổi chỉ tại các thời điểm có sườn dương của
tín hiệu clk, tại thời điểm đó giá trị của Q sẽ được gán bằng giá trị đầu vào D
của thanh ghi. Tại các thời điểm khác giá trị của Q được giữ không đổi.
CLK, RESET

Q
D Clk
Q

D

Q

N bit

N bit


N D-Flip Flop

Q
D Clk
Q

register
CLK
RESET
D

XXX

QASYNC

XXX

QSYNC

XXXX

15

10

25

30

0


10

25

30

0

10

25

30

Hình 2.1. Cấu trúc và giản đồ thời gian của thanh ghi
b) Bộ đếm
Bộ đếm đồng bộ là một trường hợp đặc biệt của bộ cộng tích lũy. Bộ cộng
tích lũy là sự kết hợp giữa bộ cộng và thanh ghi. Đầu ra của bộ cộng được
41


nối với đầu vào của thanh ghi, còn đầu ra của thanh ghi được dẫn vào cổng
B của bộ cộng, sau mỗi xung nhịp đồng hồ giá trị này được cộng thêm giá trị
ở cổng A và lưu lại vào thanh ghi. Cấu trúc của khối thể hiện trên hình sau.
CLK, RESET, ENABLE

CLK

++


ENABLE
RESET

1

A

Σ

CNT

N bit

B

counter

CNT

SUM
N bit

N bit

register

CLK
RESET
ENABLE

SUM
CNT

XXX
XXX

1
0

2
1

3
2

4
3

5
4

6
5

Hình 2.2. Cấu trúc của bộ đếm kết hợp bộ cộng và thanh ghi
Nếu cho đầu vào của bộ cộng A luôn nhận giá trị bằng 1 thì sau mỗi
xung nhịp giá trị trong thanh ghi tăng thêm 1. Trong trường hợp đếm ngược
cho giá trị của A bằng -1. Giá trị đếm là giá trị lưu trong thanh ghi, xung đếm
chính là xung nhịp hệ thống.
2.3. Nội dung thí nghiệm

Nội dung 1: Viết mã nguồn VHDL và thực hành mô phỏng thanh ghi
trên công cụ mô phỏng ModelSim.
Nội dung 2: Viết mã nguồn VHDL và thực hành mô phỏng bộ đếm
trên công cụ mô phỏng ModelSim.
Nội dung 3: Bài tập phát triển thêm.
2.4. Trình tự thí nghiệm
a) Chuẩn bị thí nghiệm
- Vị trí thực hành bài thí nghiệm:
+ Các bài thí nghiệm môn học Thiết kế logic số được tiến hành tại
phòng thí nghiệm của Bộ môn Kỹ thuật Xung Số & Vi xử lý.
+ Mỗi nhóm học viên được bố trí ngồi một bàn thí nghiệm.
42


- Dụng cụ, vật tư và trang thiết bị thí nghiệm:
+ Trên mỗi bàn thí nghiệm bố trí 01 máy tính, 01 panel thí nghiệm.
+ Học viên tự đăng ký mượn thêm các dụng cụ phục vụ thí nghiệm và
các linh kiện liên quan đến bài thí nghiệm với giáo viên hướng dẫn thí nghiệm.
+ Trong trường hợp khi giáo viên hướng dẫn thí nghiệm đã hướng dẫn
đầy đủ các quy tắc an toàn về nguồn điện, an toàn mạch thí nghiệm mà học viên
làm sai, không tuân thủ theo các nguyên tắc, gây ra hiện tượng chập cháy,
hỏng hóc linh kiện sẽ phải hoàn toàn chịu trách nhiệm.
b) Tiến hành thí nghiệm
Nội dung 1: Viết mã nguồn VHDL và thực hành mô phỏng thanh ghi
trên công cụ mô phỏng ModelSim.
Bước 1. Tạo thư mục lưu trữ.
Tạo thư mục con register trong thư mục D:\DLD_Labs\Basic_Labs.
Bước 2. Tạo file mã nguồn.
Tạo file mã nguồn cho register trong Notepad++ bằng cách chọn menu
File/new, soạn thảo xong chọn File/Save, và lưu file dưới tên reg.vhd trong

thư mục làm việc D:\DLD_Labs\Basic_Labs\register, lưu ý để lưu dưới dạng
.vhd ở ô chọn File types phải chọn là All files(*) (Hình 2.3).
Nội dung của tệp mã nguồn VHDL reg.vhd như sau.
------------------------------------------------------------------------- reg.vhd --------------------------------------------------------------------------library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
----------------------------------------------------entity reg is
generic(n_width: integer:=32);
port(D
: in std_logic_vector((n_width-1)downto 0);
Q
: out std_logic_vector((n_width-1) downto 0);
CLK : in std_logic;
RESET: in std_logic);
end entity;
----------------------------------------------------architecture behavioral of reg is
begin
reg_p: process (CLK)
begin
if RESET = '1' then
Q <= (others => '0');
elsif CLK = '1' and CLK'event then
Q <= D;
end if;

43


end process reg_p;
end architecture;
-----------------------------------------------------


Bước 3. Chọn thư mục làm việc.
Khởi động ModelSim, tại menu File chọn Change Directory, tiếp đó
chọn đường dẫn tới thư mục làm việc D:\DLD_Labs\Basic_Labs\register
chứa file nguồn vừa tạo reg.vhd.
Bước 4. Tạo thư viện làm việc work
Tiến hành bằng cách gõ lệnh sau vào cửa sổ Transcript của ModelSim:
vlib work

Bước 5. Biên dịch file mã nguồn.
Tiến hành bằng cách gõ các lệnh sau vào cửa sổ Transcript.
vcom reg.vhd

Khi trình biên dịch phát hiện ra lỗi về mặt cú pháp thì nó sẽ thông báo
chính xác dòng tương ứng gây ra lỗi. Nếu như mã nguồn của thiết kế không
có lỗi thì biên dịch xong sẽ báo lệnh thực thi thành công.
Bước 6. Kiểm tra nhanh thiết kế bằng cách đưa vào đầu vào của DUT
các giá trị cố định và kiểm tra trực tiếp kết quả đầu ra. Kiểm tra nhanh cho
phép phát hiện và sửa những lỗi về mặt chức năng đơn giản trước khi bước
vào bước kiểm tra với số lượng lớn tổ hợp giá trị đầu vào.
Để kiểm tra nhanh thanh ghi, tạo một file có tên là reg_test.vhd và lưu
trong thư mục làm việc, ở phần này sử dụng các phát biểu tuần tự như lệnh
wait, học viên cần xem lại lý thuyết của phần này, mã nguồn kiểm tra có nội dung
như sau.
-------------------------------------------------------------- reg.test.vhd --------------------------------------------------------------library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
----------------------------------------------entity reg_test is
end reg_test;
----------------------------------------------architecture behavioral of reg_test is
signal D: std_logic_vector(31 downto 0);

signal Q: std_logic_vector(31 downto 0);
signal CLK: std_logic := '0';
signal RESET: std_logic := '0';
----------------------------------------------component reg is
port(D
: in std_logic_vector(31 downto 0);

44


Q
: out std_logic_vector(31 downto 0);
CLK : in std_logic;
RESET: in std_logic);
end component;
begin
create_clock: process
begin
wait for 50 ns;
CLK <= not CLK after 50 ns;
end process create_clock;
create_data: process
begin
RESET <= '0';
D <= x"a0001111";
wait for 10 ns;
RESET <= '1';
wait for 100 ns;
RESET <= '0';
wait for 150 ns;

D <= x"b0011111";
wait for 170 ns;
D <= x"c0111111";
wait for 70 ns;
D <= x"d1110011";
wait for 70 ns;
D <= x"01110dd0";
wait;
end process create_data;
reg_DUT: component reg
port map (
D => D,
Q => Q,
CLK => CLK,
RESET => RESET);
end behavioral;
-----------------------------------------------

Bước 7. Biên dịch file mã nguồn.
Tiến hành biên dịch file reg_test.vhd bằng lệnh sau trong cửa sổ
transcript:
vcom reg_test.vhd

Bước 8. Khởi tạo mô phỏng.
Tiến hành khởi tạo mô phỏng thiết kế bằng lệnh sau (Hình 2.3).
vsim reg_test

Bước 9. Bổ sung các tín hiệu vào cửa sổ wave form để quan sát.
Thực hiện gõ các lệnh sau vào cửa sổ Transcript:
add

add
add
add

wave
wave
wave
wave

sim:/reg_test/RESET
sim:/reg_test/CLK
sim:/reg_test/D
sim:/reg_test/Q

45


Mỗi lệnh trên sẽ hiển thị một tín hiệu tương ứng vào giản đồ sóng,
bằng cách đó học viên có thể lựa chọn các tín hiệu nhất định để theo dõi. Sau khi
thực hiện các bước trên có thể tiến hành chạy mô phỏng. Mô phỏng có thể
chạy bằng nút công cụ Run trên thanh công cụ của cửa sổ giản đồ sóng.

Hình 2.3. Khởi tạo mô phỏng thiết kế
Bước 10. Chạy mô phỏng và quan sát kết quả trên waveform.

Hình 2.4. Giản đồ sóng mô phỏng hoạt động thanh ghi trên ModelSim
Thực hiện gõ lệnh run 1000 ns vào cửa sổ Transcript sau đó mở rộng
cửa sổ Waveform bên phải để quan sát.
run 1000 ns


Kết quả mô phỏng thể hiện như trên hình 2.4.
46


Bước 11. Tạo một kịch bản mô phỏng.
Tạo file run.do và lưu vào trong thư mục làm việc với nội dung sau:
quit –sim
vlib work
vcom reg.vhd
vcom reg_test.vhd
vsim reg_test
add wave sim:/reg_test/RESET
add wave sim:/reg_test/CLK
add wave sim:/reg_test/D
add wave sim:/reg_test/Q
run 1000 ns

Bước 12. Trong cửa sổ transcript của ModelSim để biên dịch và chạy
lại mô phỏng gõ lệnh như sau.
do run.do

Nội dung 2: Viết mã nguồn VHDL và thực hành mô phỏng bộ đếm
trên công cụ mô phỏng ModelSim.
Bước 1. Tạo thư mục lưu trữ.
Tạo thư mục con có tên counter trong thư mục
D:\DLD_Labs\Basic_Labs.
Bước 2. Tạo file mã nguồn.
Tạo file mã nguồn cho counter trong Notepad++ bằng cách chọn menu
File/new, soạn thảo xong chọn File/Save, và lưu file dưới tên counter.vhd
trong thư mục làm việc D:\DLD_Labs\Basic_Labs\counter, lưu ý để lưu dưới

dạng .vhd ở ô chọn File types phải chọn là All files(*).
Nội dung của file code VHDL counter.vhd.
-------------------------------------------------------------------------------- count.vhd --------------------------------------------------------------------------------library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---------------------------------------------------------entity counter is
port(cnt : out std_logic_vector( 3 downto 0);
enable: in std_logic;
clk
: in std_logic;
reset : in std_logic);
end entity;
---------------------------------------------------------architecture rtl of counter is
signal cnt_reg: std_logic_vector( 3 downto 0):= "0000";
begin

47


process(clk, reset)
begin
if (reset = '1') then
cnt_reg <= (others => '0');
elsif (rising_edge(clk)) then
if (enable = '1') then
cnt_reg <= cnt_reg + 1;
end if;
end if;
end process;

cnt <= cnt_reg;
end architecture;
----------------------------------------------------------

Bước 3. Tạo thư mục làm việc trên ModelSim.
Khởi động ModelSim, tại menu File chọn Change Directory, tại hộp
thoại Change directory chọn Chọn đường dẫn tới thư mục làm việc
D:\DLD_Labs\Basic_Labs\counter\ chứa file nguồn vừa tạo counter.vhd.
Bước 4. Tạo thư viện làm việc work.
Tiến hành bằng cách gõ lệnh sau vào cửa sổ Transcript của ModelSim:
vlib work

Bước 5. Biên dịch file mã nguồn.
Tiến hành gõ các lệnh sau vào cửa sổ Transcript.
vcom counter.vhd

Khi trình biên dịch phát hiện ra lỗi về mặt cú pháp thì nó sẽ thông báo
chính xác dòng tương ứng gây ra lỗi. Nếu như mã nguồn của thiết kế không
có lỗi thì biên dịch xong sẽ báo lệnh thực thi thành công.
Bước 6. Kiểm tra nhanh thiết kế.
Tiến hành bằng cách đưa vào đầu vào của DUT các giá trị cố định và
kiểm tra trực tiếp kết quả đầu ra. Kiểm tra nhanh cho phép phát hiện và sửa
các lỗi về mặt chức năng đơn giản trước khi bước vào bước kiểm tra với số
lượng lớn tổ hợp giá trị đầu vào.
Để kiểm tra nhanh bộ đếm, tạo một file có tên là counter_test.vhd và
lưu trong thư mục làm việc, thiết kế này sử dụng các phát biểu tuần tự như lệnh
wait, học viên cần xem lại lý thuyết của phần này.
Mã nguồn kiểm tra có nội dung như sau.
------------------------------------------------------------------counter_test.vhd -------------------------------------------------------------------library ieee;
use ieee.std_logic_1164.all;

use IEEE.STD_LOGIC_ARITH.ALL;

48


use IEEE.STD_LOGIC_UNSIGNED.ALL;
--------------------------------------------------entity counter_test is
end entity;
--------------------------------------------------architecture behavioral of counter_test is
signal cnt
: std_logic_vector( 3 downto 0);
signal enable: std_logic;
signal clk
: std_logic;
signal reset : std_logic;
--------------------------------------------------component counter is
port(cnt
: out std_logic_vector(3 downto 0);
enable: in std_logic;
clk
: in std_logic;
reset : in std_logic);
end component;
--------------------------------------------------begin
create_clock: process
begin
CLK <= '0';
wait for 10 ns;
CLK <= '1';
wait for 10 ns;

end process create_clock;
create_data: process
begin
reset <= '0';
enable <= '1';
wait for 10 ns;
reset <= '1';
wait for 100 ns;
reset <= '0';
wait for 1000 ns;
enable <= '0';
wait for 1000 ns;
enable <= '1';
wait;
end process create_data;
DUT_counter: counter
port map(cnt
=> cnt,
enable => enable,
clk
=> clk,
reset => reset);
end architecture behavioral;
---------------------------------------------------

Bước 7. Biên dịch file mã nguồn.
Tiến hành biên dịch file counter_test.vhd bằng lệnh sau trong cửa sổ
Transcript.
vcom counter_test.vhd


Bước 8. Khởi tạo mô phỏng thiết kế
49


Tiến hành bằng lệnh:
vsim counter_test

Bước 9. Bổ sung các tín hiệu vào cửa sổ wave form để quan sát.
Để thực hiện, gõ các lệnh sau vào cửa sổ Transcript.
add
add
add
add

wave
wave
wave
wave

sim:/counter_test/count
sim:/counter_test/clk
sim:/counter_test/reset
sim:/counter_test/enable

Mỗi lệnh trên sẽ hiển thị một tín hiệu tương ứng vào giản đồ sóng,
bằng cách đó ta có thể lựa chọn các tín hiệu nhất định để theo dõi. Sau khi
thực hiện các bước trên thì có thể tiến hành chạy mô phỏng. Mô phỏng có thể
chạy bằng nút công cụ Run trên thanh công cụ của cửa sổ giản đồ sóng.
Bước 10. Chạy mô phỏng và quan sát kết quả trên waveform.
Thực hiện bằng cách gõ lệnh run 1000 ns vào cửa sổ Transcript sau đó

mở rộng cửa sổ Waveform bên phải để quan sát.
run 1000 ns

Khi gặp lệnh này chương trình sẽ chạy mô phỏng trong 1000 ns.
Kết quả mô phỏng như sau.

Hình 2.5. Giản đồ sóng mô phỏng thanh ghi trên ModelSim
Bước 11. Tạo file kịch bản mô phỏng
Tạo một file run.do lưu vào trong thư mục làm việc với nội dung sau.
quit
vlib
vcom
vcom

50

-sim
work
counter.vhd
counter_test.vhd


vsim counter_test
add wave sim:/counter_test/*
run 1000 ns

Bước 12. Biên dịch và chạy lại mô phỏng.
Trong cửa sổ transcript của ModelSim để biên dịch và chạy lại mô
phỏng tiến hành như sau.
do run.do


Nội dung 3: Bài tập phát triển thêm.
Bài 1. Thiết kế bộ đếm thập phân
ngược, xung đếm CLK, hỗ trợ tín
hiệu RESET đồng bộ tín hiệu
ENABLE đồng bộ, đầu ra mã
NBCD 4-bit (N = 4).

ENABLE
RESET
CNT
N bit

counter

Bài 2. Thiết kế bộ đếm theo mã gray
thuận với Kd = 4 (hệ số đếm bằng 4),
xung đếm CLK, RESET không
đồng bộ, tín hiệu ENABLE đồng
bộ, đầu ra mã Gray 2-bit (N = 2).

ENABLE
RESET

++

CLK

CNT
N bit


counter
CLK_IN
(50Hz)

CLK_OUT (1Hz)

++

Bài 3. Thiết kế bộ đếm chia tần số
CLK_IN 50 Hz thành tần số
CLK_OUT 1Hz.

++

CLK

SL

RESET
ENABLE

Bài 4. Thiết kế thanh ghi dịch đồng
bộ nối tiếp 4 bit sang phải, với đầu
vào nối tiếp SL, hỗ trợ tín hiệu
Reset không đồng bộ và tín hiệu
Enable.

CLK


counter

<<1

DOUT
N bit

Shift register

c) Tổng hợp, xử lý và đánh giá kết quả thí nghiệm
Qua buổi thí nghiệm, giáo viên sẽ tiến hành đánh giá sơ bộ về kết quả
thí nghiệm và ý thức khi tham gia thí nghiệm của các học viên. Kết hợp với
51


phần báo cáo kết quả thí nghiệm, giáo viên sẽ tiến hành chấm điểm bài thí nghiệm
đối với từng học viên.
2.5. Báo cáo thí nghiệm
a) Hướng dẫn viết báo cáo thí nghiệm
Sau mỗi buổi thí nghiệm, học viên sẽ viết báo cáo thí nghiệm theo
mẫu, và nộp bản báo cáo vào đầu buổi thí nghiệm tiếp theo cho giáo viên.
b) Mẫu báo cáo thí nghiệm
Mẫu báo cáo ở Phụ lục của giáo trình.

52



×