1. Khối cộng đơn giản
Khối cộng đơn giản: thực hiện phép cộng giữa hai số được biểu diễn
dưới dạng std_logic_vector hay bit_vector. Các cổng vào gồm hạng tử A, B, bit
nhớ Cin, các cổng ra bao gồm tổng Sum, và bit nhớ ra Cout:
Σ
A B
Cin
Cout
Sum
Hình 2.6: Sơ đồ khối bộ cộng
Bước 1: Viết mô tả (adder.vhd) cho khối cộng sử dụng trực tiếp toán tử cộng,
đầu vào A, B và đầu ra Sum có kiểu STD_LOGIC_VECTOR 32 bit, Cout và Cin có
kiểu STD_LOGIC.
Hướng dẫn: Khi đó buộc phải khai báo thư viện như sau:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
Khối cộng đơn giản có thể viết bằng cú pháp
SUM <= a +b;
Lệnh này đặt trực tiếp mô tả kiến trúc (dạng mô tả Dataflow). Tuy vậy để
có được bit nhớ Cout thì cần bổ xung thêm 1 bit ‘0’vào các giá trị A, B như sau:
Khai báo các tín hiệu bổ xung trong phần khai báo kiến trúc:
Signal A1 : std_logic_vector(32 downto 0);
Signal B1 : std_logic_vector(32 downto 0);
Signal Sum1 : std_logic_vector(32 downto 0);
Và thực hiện trong phần mô tả kiến trúc như sau:
A1 = ‘0’ & A;
B1 = ‘0’ & B;
Sum1 = A1 + B1;
7 trang |
Chia sẻ: hoang10 | Lượt xem: 713 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Thực hành: Thiết kế logic số - Bài 02: Xây dựng bộ cộng trừ trên cơ sở khối cộng bằng toán tử, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Khoa Vô tuyến điện tử
Bộ môn Kỹ thuật Xung, số, VXL
Thực hành: Thiết kế logic số
Bài 02: Xây dựng bộ cộng trừ trên cơ sở
khối cộng bằng toán tử
Mục đích
Thông qua ví dụ xây dựng khối cộng trừ sử dụng toán tử +, trong
bài thực hành này sinh viên tự viết mô tả cho các khối thiết kế, qua đó
ôn tập lại các cấu trúc lệnh tuần tự, cách sử dụng tham số tĩnh, cách cài
đặt module con, và cuối cùng là cách thức kiểm tra thiết kế.
Công cụ phục vụ thực hành : Máy vi tính
Thời gian : 1h30
1. Khối cộng đơn giản
Khối cộng đơn giản: thực hiện phép cộng giữa hai số được biểu diễn
dưới dạng std_logic_vector hay bit_vector. Các cổng vào gồm hạng tử A, B, bit
nhớ Cin, các cổng ra bao gồm tổng Sum, và bit nhớ ra Cout:
Σ
A B
Cin
Cout
Sum
Hình 2.6: Sơ đồ khối bộ cộng
Bước 1: Viết mô tả (adder.vhd) cho khối cộng sử dụng trực tiếp toán tử cộng,
đầu vào A, B và đầu ra Sum có kiểu STD_LOGIC_VECTOR 32 bit, Cout và Cin có
kiểu STD_LOGIC.
Hướng dẫn: Khi đó buộc phải khai báo thư viện như sau:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
Khối cộng đơn giản có thể viết bằng cú pháp
SUM <= a +b;
Lệnh này đặt trực tiếp mô tả kiến trúc (dạng mô tả Dataflow). Tuy vậy để
có được bit nhớ Cout thì cần bổ xung thêm 1 bit ‘0’vào các giá trị A, B như sau:
Khai báo các tín hiệu bổ xung trong phần khai báo kiến trúc:
Signal A1 : std_logic_vector(32 downto 0);
Signal B1 : std_logic_vector(32 downto 0);
Signal Sum1 : std_logic_vector(32 downto 0);
Và thực hiện trong phần mô tả kiến trúc như sau:
A1 = ‘0’ & A;
B1 = ‘0’ & B;
Sum1 = A1 + B1;
Khi đó giá trị Cout là bit cao nhất của Sum1
Cout <= Sum1(32);
Còn Sum là 32 bit thấp:
Sum = Sum1(31 down to 0);
Bước 2: Viết module kiểm tra cho bộ cộng vừa viết bằng VHDL, thực hiện mô
phỏng kiểm tra. Kết quả mô phỏng phải thể hiện được như sau:
Hình 1: Kết quả mô phỏng bộ cộng
Hướng dẫn: Sơ đồ kiểm tra nhanh như sau:
DUT
INPUTs
ASIGNMENT
Module kiểm tra nhanh là module không có đầu ra đầu vào, nhiệm vụ chính là
đặt các giá trị cho các cổng đầu vào của khối kiểm tra.
Module được khai báo thực thể là
entity test_adder4_gen is
end test_adder4_gen;
Để cài đặt module con của khối adder cần khai báo module con (khai báo
component) như sau trong phần khái báo kiến trúc:
component adder is
port(
A : in std_logic_vector(31 downto 0);
B : in std_logic_vector(31 downto 0);
Cin : in std_logic;
SUM : out std_logic_vector(31 downto 0);
Cout : out std_logic
);
Cài đặt module con trực tiếp trong phâng mô tả kiến trúc (khối begin/end
chính):
DUT: component adder
port map ( A, B, Cin, Sum, Cout);
Bước 3: Xem lại phần lý thuyết về khai báo tham số tĩnh, bổ xung vào bộ cộng tham
số tĩnh N là số bit.
Hướng dẫn: Tham số tĩnh khai báo trong khai báo thực thể của thiết kế. Ví dụ:
Entity adder is
Generic (N : natural :=32);
Port (
Sử dụng giá trị tham số tĩnh này trong thiết kế để tùy biến số Bit của các hạng
tử và kết quả như sau:
Với các cổng
A : in std_logic_vector(N-1 downto 0);
Sum : out std_logic_vector(N-1 downto 0);
Với các tín hiệu:
Signal A1 : std_logic_vector(N downto 0);
Bước 4: Thực hiện thay đổi module kiểm tra để kiểm tra cho bộ cộng dùng tham số
tĩnh N, thay đổi giá trị N = 16 và thực hiện kiểm tra lại như bước 2.
Hướng dẫn: Để cài đặt module có tham số tĩnh thì phải cài đặt tham số tĩnh tương tự
như cài đặt các tín hiệu cho cổng, xem ví dụ sau đây:
Adder32: component adder
generic map (32)
port map (A, B, Cin, Sum, Cout);
*Lưu ý là sau generic map () không có dấu ; hay , mà để trống.
2. Khối trừ
Bước 5: Nghiên cứu cấu trúc khối trừ như sau:
Vì các số có dấu trên máy tính được biểu diễn dưới dạng số bù 2
(2’complement), do đó để thực hiện phép trừ A-B thì tương đương với thực
hiện A + bù2(B)
Xét ví dụ A = 10 = 1010, B = 5 = 0101 biểu diễn dưới dạng số có dấu 5-bit
ta phải thêm bit dấu bằng 0 vào trước.
A = 01010, Bù2(A) = not (A) + 1 = 10101 + 1 = 10110
B = 00101, Bù2(B) = not (B) + 1 = 11010 + 1 = 11011
Tính A – B:
A 01010 01010
- = - = +
B 00101 11011
1 00101
Loại bỏ bit nhớ ở kết quả cuối cùng ta được A – B = 00101 = 5.
Tính B – A:
B 00101 00101
- = - = +
A 01010 10110
0 11011
Loại bỏ bit nhớ ta được B – A = 11101, đây là số âm, muốn tính giá trị tuyệt đối
để kiểm tra lại lấy bù 2 của 11101
Bù 2 (11101) = 00100 + 1 = 00101 = 5
vậy B – A = -5
Dựa trên tính chất trên của số bù hai ta chỉ cần thay đổi một chút trong
cấu trúc của bộ cộng để nó có khả năng thực hiện cả phép cộng lẫn phép trừ
mà không phải thay đổi nhiều về cấu trúc phần cứng. Tại đầu vào có thêm tín
hiệu SUB, tín hiệu này quyết định sẽ thực hiện phép cộng hay phép trừ. Khi
SUB = 1 để lấy bù 2 của B sẽ lấy đảo B và cho giá trị đầu vào Cin =1, để hiện
thực trên mạch cấu trúc bộ cộng được bổ xung một khối MUX trước cổng B,
khối này có hai đầu vào là B và not B, nếu SUB= 0 thì B được chọn, nếu SUB = 1
thì not B được chọn. Đầu vào Cin được OR với SUB trước khi vào bộ cộng.
ΣA
Cin
Cout
Sum
MUX
B Sub
Hình 2.8: Sơ đồ khối bộ cộng trừ đơn giản
Bước 6: Viết mô tả cho khối MUX 2 đầu vào trên hình vẽ, số bit của các dữ liệu
đầu cài đặt bằng tham số tĩnh N như trường hợp của khối cộng, viết module mô
phỏng kiểm tra hoạt động của khối MUX.
Hướng dẫn:
Để viết khối MUX có thể dùng cấu trúc Process có danh sách Sensitive list là các tín
hiệu đầu vào và cấu trúc IF THEN / END IF;
process (Sel, data_in1, data_in2)
if Sel = '1' then
data_out <= data_in1;
else
data_out <= data_in1;
end if;
Để kiểm tra khối MUX có thể thực hiện tương tự như kiểm tra khối cộng.
Bước 7: Viết mô tả bộ cộng trừ theo sơ đồ trên, khối trên thực hiện phép cộng nếu
như tín hiệu Sub = 0 và thực hiện trừ nếu như Sub = 0.
Hướng dẫn: Khối trừ được ghép bởi khối cộng, khối MUX, và cổng OR hai đầu vào,
với cổng OR hai đầu vào dùng trực tiếp toán tử logic OR, còn hai khối cộng và MUX
đã mô tả như trên. Khối cộng/trừ viết theo kiểu cấu trúc.
Bước 8: Thực hiện mô phỏng kiểm tra khối cộng trừ, tín hiệu SUB cần được thay
đổi theo thời gian để quan sát kết quả với các phép toán khác nhau.
Hướng dẫn: Để thay đổi tín hiệu SUB (hoặc bất kỳ tín hiệu nào theo thời gian dùng
cấu trúc WAIT FOR của VHDL:
wait for 20 ns;
SUB <= '0';
wait for 100 ns;
SUB <= '0';
wait for 100 ns;
SUB <= '1';
Bước 9: Thay đổi mô tả của bộ cộng theo sơ đồ trên bằng bộ cộng nối tiếp đã mô tả
ở bài thí nghiệm thứ nhất.