THIẾT kế CPU RISC 32 BIT đơn CHU kỳ THỰC HIỆN LỆNH BEQ (có code) THIẾT kế CPU RISC 32 BIT đơn CHU kỳ THỰC HIỆN LỆNH BEQ (có code) THIẾT kế CPU RISC 32 BIT đơn CHU kỳ THỰC HIỆN LỆNH BEQ (có code) THIẾT kế CPU RISC 32 BIT đơn CHU kỳ THỰC HIỆN LỆNH BEQ (có code) THIẾT kế CPU RISC 32 BIT đơn CHU kỳ THỰC HIỆN LỆNH BEQ (có code)
Trang 1KỲ THỰC HIỆN LỆNH BEQ
Trang 4HÌNH 1.1: CÁC TOÁN TỬ TRONG VERILOG 5 HÌNH 1.1: Ý NGHĨA CÁC TOÁN TỬ TRONG VERILOG 6 HÌNH 2.1: CÁC LỆNH DÙNG TRONG 3 KHUÔN DẠNG LỆNH 8
Trang 5CPLD Complex progamable logic device.
IM Instruction memory.
CPU Central Processing Unit.
HDLs Hardware Description Languages
CISC Complex Instruction Set Computer
MIPS Microprocessor without Interlocked Pipeline Stages
RF Register File.
ALU Arithmetic Logic Unit
FPGA Field-programable gate array.
Trang 6CHƯƠNG 1 TỔNG QUAN VỀ CPU RISC VÀ NGÔN NGỮ MÔ TẢ
Hiện nay các bộ vi xử lý RISC phổ biến là ARM, SuperH, MIPS, SPARC, DECAlpha, PA-RISC, PIC, và PowerPC của IBM
Mục tiêu của RISC là đơn giản hóa các lệnh, để mỗi lệnh có thể được thực thi chỉ trong 1chu kỳ máy
Ngoài ra còn 1 hướng thiết kế khác là CISC (Complex Instruction Set Computer - Máytính với tập lệnh phức tạp), đây cũng là một hướng thiết kế trước RISC Dù ở bất kỳ cấp
độ nào, đơn vị logic của một chip RISC bao giờ cũng cần ít transistor hơn so với của mộtchip CISC
Những đặc điểm thường thấy của 1 chip RISC:
- Địng dạng chuẩn mã lệnh (làm quá trình giải mã đơn giản hơn)
- Các thanh ghi đồng nhất (có thể được dùng để thay thế nhau)
- Cách đánh địa chỉ đơn giản
- Hỗ trợ ít kiểu dữ liệu
1.1.2 Ngôn ngữ mô tả phần cứng
Sự phát triển của khoa học công nghệ ngày càng tăng để đáp ứng nhu cầu của con người,
để giải quyết được những vấn đề của công nghệ người ta đã tạo ra những vi mạch lập
Trang 7trình (hay còn gọi là các chip đa chức năng) như FPGA, CPLD…Nhưng do những vimạch con người tạo ra đó lại không thể hiểu được ngôn ngữ của con người, vì vậy người
ta đã tạo ra loại ngôn ngữ có thể giao tiếp được giữa người với vi mạch (hay với phầncứng) được gọi là ngôn ngữ lập trình
Số lượng cổng logic tích hợp bên trong những con chip ngày nay là rất lớn ( có thể lênđến hàng triệu) dẫn đến việc đi dây thủ công gần như bất khả thi, do yêu cầu người lậptrình phải thiết kế được một vi mạch số trong khoảng thời gian cho phép nên ngôn ngữ
mô tả phần cứng HDLs đã ra đời Do HDLs giúp nâng cao năng suất thiết kế cũng nhưtạo ra đa dạng về chức năng của các vi mạch số với tốc độ cao hơn nên ngày càng được
sử dụng phổ biến
HDLs có rất nhiều loại cho người lập trình có thể lựa chọn nhưng có hai loại ngôn ngữtiểu biểu được sử dụng nhiều nhất là VHDL và Verilog HDL
1.2 Verilog HDL
Verilog HDL (thường gọi tắt là Verilog) được phát minh bởi Gateway Design Automatic
và được giới thiệu lần đầu vào năm 1984 Như đã đề cập ở trên thì đây là một trong haingôn ngữ thiết kế vi mạch phổ biến nhất trên thế giới Để hoạt động trong lĩnh vực thiết
kế phần cứng thì người kỹ sư và sinh viên đang theo học rất cần phải biết qua ngôn ngữVerilog HDL này Được đánh giá từ đa số người là khá giống với ngôn ngữ lập trình C(ngôn ngữ lập trình căn bản được giảng dạy khi mới bắt đầu học lập trình) nên VerilogHDL khá dễ làm quen, dễ sử dụng do có cú pháp ngắn gọn và cấu trúc chương trìnhkhông quá phức tạp
Do thư viện và ngôn ngữ Veriog đều được hỗ trợ từ gần như hầu hết các công cụ thiết kế
vi mạch hiện nay nên nó đã trở thành một trong những sự lựa chọn tối ưu của các nhà lậptrình
Trang 81.3 Cơ bản về Verilog HDL
1.3.1 Quy ước chung về từ khóa
- Khoảng trắng: bao gồm phím space, phím tab và phím enter
- Chú thích: bao gồm chú thích đơn dòng (//…) và nhiều dòng (/*…*/) Giúp ghichú ý nghĩa của những câu lệnh, hay giá trị của các biến được thêm vào, hỗ trợcho người lập trình nhanh chóng nắm bắt nội dung chương trình
- Từ định danh: bắt đầu từ chữ cái và “_”, không được bắt đầu từ số và “$”(những ký tự sau ký tự đầu vẫn có thể là số), có phân biệt chữ hoa,chữ thường.Được dùng trong việc đặt tên cho biến, module, trường hợp, các port xuất nhậphay các khối con được lấy ra sử dụng
- Toán tử: 3 loại là toán tử đơn (a = !b), toán tử kép (a = c ^ d) và toán tử điềukiện (a = x ? y : z)
- Chữ số: cho biết độ rộng (hay số bit của số sẽ được khai báo), đi kèm là dạng
số của số được khai báo như ’b (nhị phân), ’o(bát phân), ’d(thập phân), ’h (thậplục phân) và phần chữ số sau khai báo là giá trị của số
- Gạch dưới: giúp phân biệt số nhị phân trong trường hợp quá nhiều bit Ngoàicông dụng là từ định danh thì “_” vẫn có thể được thêm vào khi mà số nhị phân
có quá nhiều bit, giúp dễ phân biệt mà không làm thay đổi giá trị của số
1.3.2 Module
Module có thể là khối chính hoặc là khối nhỏ của mạch được gọi vào sử dụng bởikhối chính, bao gồm 4 phần:
- Tên module (định nghĩa)
- Các chân vào, ra của module
- Chức năng của module
Trang 9Cú pháp: wire [msb:lsb] ten_bien;
- Register: Đóng vai trò như 1 thanh ghi, lưu giữ giá trị cho đến khi nhận được giátrị mới Có công dụng như kiểu Net nhưng được dùng trong các khối always, if…
Cú pháp: reg [msb:lsb] ten_bien;
- Parameter: Đóng vai trò như 1 tham số trong phần thiết kế
Cú pháp: parameter [msb:lsb] ten_tham_so = gia_tri;
1.3.4 Các phép gán
Phép gán liên tục: được dùng để gán giá trị cho các port, các biến wire Khi sử dụng sẽhoạt động một cách đồng thời không phân biệt trước sau và không nằm trong các khốichức năng Từ khóa: “assign”
Phép gán thủ tục: gồm Blocking và Non-blocking, thường nằm trong các khối chức năng
- Blocking: đặt trưng bởi dấu “=” Các phép gán được thực hiện một cách tuần tự,phép gán sau sẽ sử dụng kết quả của phép gán trước đó
- Non-blocking: đặt trưng bởi dấu “<=” Các phép gán được thực hiện một cáchsong song, phép gán sau không còn phụ thuộc vào pháp gán trước nữa mà sẽ lấygiá trị ban đầu của biến đã được gán
Trang 10cũng đóng vai trò như if…else, nó sẽ thực thi lệnh nếu điều kiện được thỏa mãnnhưng nó được dùng trong trường hợp bản thiết kế có quá nhiều điều kiện, khắcphục được nhược điểm dài dòng và phức tạp của phát biểu if…else và giúp choviệc sữa đổi dễ dàng hơn nếu có lỗi xảy ra
Trang 11Bảng 1.1: Các toán rử trong Verilog
Bảng 1.2: Ý nghĩa các toán tử trong Verilog
Toán tử điều kiện:
- Cú pháp: ket_qua = bien_dieu_kien ? ket_qua_1 : ket_qua _2;
- Ý nghĩa: nếu bien_dieu_kien bằng 1 thì kết quả nhận được của lệnh là ket_qua_1
và ngược lại khi bằng 0 thì kết quả của lệnh là ket_qua_2
Toán tử kết nối:
- Cú pháp: bien_a = {bien_b , bien_c};
- Ý nghĩa: toán tử này sẽ tạo ra một biến mới (bien_a) bằng cách kết nối số bit củahai biến khác (bien_b và bien_c)
Trang 12CHƯƠNG 2 NỘI DUNG ĐỀ TÀI
2.1 Các khuôn dạng lệnh
MIPS là kiến trúc vi xử lý của Patterson và Hennessy đã được nghiên cứu rộng rãi, tươngđối đơn giản và có ít đặc tính MIPS là viết tắt của Microprocessor without InterlockedPipeline Stages, là kiến trúc bộ tập lệnh RISC phát triển bởi MIPS Technologies Ban đầukiến trúc MIPS là 32bit, và sau đó nâng cấp thành phiên bản 64 bit
Hình 2.1: Cấu trúc khuôn dạng lệnh MIPS
3 khuôn dạng lệnh R (Register), I(Immediate), J(Jump) chính là các thanh ghi 32 bittrong đó sẽ có:
- Các lệnh được thực thi
- Các địa chỉ nguồn của biến thực hiện phép toán
- Các địa chỉ lưu giá trị sau khi thực hiện phép toán
Trang 13Ý nghĩa của từng nhóm bit trong khuôn dạng lệnh:
- op: mã phép toán
- rs, rt: địa chỉ của các toán hạng nguồn
- rd: địa chỉ lưu kết quả
- sh: các lệnh dịch bit
- fn: chỉ ra lệnh cụ thể để thực thi
Bảng 2.1: Các lệnh dùng trong 3 khuông dạng lệnh
Trang 14Lệnh beq (branch on equal): lệnh thực hiện rẽ nhánh khi các thanh ghi có giá trị bằngnhau, có OpC = 000100, thuộc khuông dạng lệnh I.
2.2 Các khối chính của CPU RISC
2.2.1 Khối Instruction Memory (IM)
Chứa các thanh ghi có cấu trúc theo khuôn dạng lệnh (R, I, J) Khi nhận được tín hiệu vào
từ PC thì lệnh sẽ được đọc ra
Hình 2.2: Khối IM
Thành phần của khối IM:
- Address: ngõ vào 32 bit nhận tín hiệu vào từ PC, rồi dựa vào đó để di chuyển đếnkhuôn dạng lệnh tương ứng trong khối IM
- Read Data: ngõ ra 32 bit xuất dữ liệu từ khuôn lệnh tương ứng đã chọn
- Write Data: ngõ vào 32 bit lưu dữ liệu từ khối khác
Trang 152.2.2 Khối Register File (RF)
Nhận dữ liệu từ khối IM rồi chọn ra thanh ghi tương ứng để xuất dữ liệu đến khối ALU.Một chức năng khác của khối RF là lưu lại kết quả tính toán từ khối ALU
- WA (Write Address): ngõ vào 5 bit, chọn địa chỉ để lưu giá trị
- WD (Write Data): ngõ vào 32 bit, lưu kết quả tính toán được từ khối ALU
Trang 162.2.3 Khối Arithmetic Logic Unit (ALU)
Dựa vào dữ liệu từ khối RF để thực hiện các phép toán số học và logic
Hình 2.4: Khối ALU
Thành phần khối ALU:
- A, B: 2 ngõ vào 32 bit nhận giá trị để thực hiện tính toán
- Op (Operation): ngõ vào 3 bit, quyết định ALU sẽ thực hiện lệnh nào khi thiết kếCPU thực hiện được nhiều lệnh khác nhau
- Output: ngõ ra 32 bit, ngõ ra đưa giá trị ra sau khi tính toán
Trang 172.3 Sơ đồ kết nối các khối
Hình 2.5: Sơ đồ tổng quát kết nối các khối
Ngoài các khối chính đã đề cập ở trên thì trong đề tài thiết kế CPU RISC 32 bit thực hiệnlệnh beq này còn phài có các khối con khác để có thể hoạt động theo đúng yêu cầu, baogồm:
Trang 182.4 Lưu đồ giải thuật
Hình 2.6: Lưu đồ giải thuật 3 khối
Trang 192.5 Các thành phần của chương trình
2.5.1 Module các khối con
Bao gồm các module alu, IM, RF, control, mux21, PC, signextend Mỗi module quy địnhhành vi và chức năng hoạt động của các khối
2.5.2 Module kết nối các khối
Bao gồm các module datacontrol, datapath và cpu Các module này sẽ liên kết các khốilại với nhau thông qua việc gọi các module con ở bên trong nó, tạo thành 1 CPU hoànchỉnh
Trang 20CHƯƠNG 3 KẾT QUẢ MÔ PHỎNG
Hình 3.1: Kết quả mô phỏng
Kết quả mô phỏng lệnh beq đúng như đã yêu cầu, khi giá trị của 2 thanh ghi bằng nhauthì ngõ ra sẽ bật lên, sẽ thực hiện rẽ nhánh
Trang 23TÀI LIỆU THAM KHẢO
Tiếng Việt
[1] Tống Văn On, Thiết kế vi mạch CMOS VLSI, Nhà xuất bản Phương Đông.
[2] Vũ Đức Lung, Lâm Đức Khải, Phan Đình Duy, Ngôn ngữ lập trình phần cứng
Verilog, Nhà xuất bản Đại Học Quốc Gia TP Hồ Chí Minh.
[3] https://vi.wikipedia.org/wiki/
Tiếng Anh
[4] Blaine Readler, Verilog by Example, Full ARC Press, United States.
[5] https://www.google.com.vn/
Trang 27assign RF[0] = sw1;
assign RF[1] = sw2;
assign ReadData1 = RF[ReadAddr1];
assign ReadData2 = RF[ReadAddr2];
Trang 29logic [31:0] PCin, instr;
assign ledg = zero;
assign ledr = sw;
Trang 30datacontrol DC(clk,sw,PCin,instr,zero);
IM IM(PCin,instr);
endmodule