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ử

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;

pdf7 trang | Chia sẻ: hoang10 | Lượt xem: 503 | Lượt tải: 0download
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.