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

tài liệu cpu 16 bit verilog

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 (278.67 KB, 16 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN TỬ- VIỄN THÔNG

BÁO CÁO BÀI TẬP LỚN
THIẾT KẾ VLSI
Đề tài:
TRIỂN KHAI MCU 16BIT BẰNG VERILOG
Sinh viên thực hiện :
Hoàng Minh Đức
Vương Xuân Hiếu
Đinh Quốc Toàn

Hà Nội, tháng 12 năm 2018

20141110
20141582
20144528


Mục lục

1. Giới thiệu
RISC (viết tắt của Reduced Instructions Set Computer - Máy tính với tập lệnh đơn
giản hóa) là một phương pháp thiết kế các bộ vi xử lý (VXL) theo hướng đơn giản hóa
tập lệnh, trong đó thời gian thực thi tất cả các lệnh đều như nhau. Hiện nay các bộ vi xử
lý RISC phổ biến là ARM, SuperH, MIPS, SPARC, DEC Alpha, PA-RISC, PIC, và
PowerPC của IBM.
Một số đặc điểm của bộ xử lý RISC:
• Có một số ít lệnh.
• Có một số ít các kiểu định vị (thông thường hai kiểu: định vị tức thì và định vị


gián tiếp thông qua một thanh ghi).
• Có một số ít dạng lệnh (một hoặc hai).
• Các lệnh đều có cùng chiều dài.
• Chỉ có các lệnh ghi hoặc đọc ô nhớ mới thâm nhập vào bộ nhớ.
• Dùng bộ tạo tín hiệu điều khiển bằng mạch điện để tránh chu kỳ giải mã các vi
lệnh làm cho thời gian thực hiện lệnh kéo dài.
• Bộ xử lý RISC có nhiều thanh ghi để giảm bớt việc thâm nhập vào bộ nhớ trong.
• Ngoài ra các bộ xử lý RISC đầu tiên thực hiện tất cả các lệnh trong một chu kỳ
máy.
Bộ xử lý RISC có các lợi điểm sau :
• Diện tích của bộ xử lý dùng cho bộ điều khiển giảm từ 60% (cho các bộ xử lý
CISC) xuống còn 10% (cho các bộ xử lý RISC). Như vậy có thể tích hợp thêm vào
bên trong bộ xử lý các thanh ghi, các cổng vào ra và bộ nhớ cache .....


• Tốc độ tính toán cao nhờ vào việc giải mã lệnh đơn giản, nhờ có nhiều thanh ghi
(ít thâm nhập bộ nhớ), và nhờ thực hiện kỹ thuật ống dẫn liên tục và có hiệu quả
(các lệnh đều có thời gian thực hiện giống nhau và có cùng dạng).
• Thời gian cần thiết để thiết kế bộ điều khiển là ít. Điều này góp phần làm giảm chi
phí thiết kế.
• Bộ điều khiển trở nên đơn giản và gọn làm cho ít rủi ro mắc phải sai sót mà ta gặp
thường trong bộ điều khiển.
Trước những điều lợi không chối cãi được, kiến trúc RISC có một số bất lợi:
• Các chương trình dài ra so với chương trình viết cho bộ xử lý CISC. Điều này do
các nguyên nhân sau :
• Cấm thâm nhập bộ nhớ đối với tất cả các lệnh ngoại trừ các lệnh đọc và ghi vào bộ
nhớ. Do đó ta buộc phải dùng nhiều lệnh để làm một công việc nhất định.
• Cần thiết phải tính các địa chỉ hiệu dụng vì không có nhiều cách định vị.
• Tập lệnh có ít lệnh nên các lệnh không có sẵn phải được thay thế bằng một chuỗi
lệnh của bộ xử lý RISC.

• Các chương trình dịch gặp nhiều khó khăn vì có ít lệnh làm cho có ít lựa chọn để
diễn dịch các cấu trúc của chương trình gốc. Sự cứng nhắc của kỹ thuật ống dẫn
cũng gây khó khăn.
• Có ít lệnh trợ giúp cho ngôn ngữ cấp cao.

2. Yêu cầu chức năng
- Triển khai một microcontrol unit có chức năng như 1 CPU
- Có khả năng chạy các lệnh cơ bản như ADD, SUB, AND, OR, JUMP, …
- Mỗi lệnh sau khi được biên dịch có độ dài là 16 bit.
- MCU bao gồm một bộ nhớ lệnh và một bộ nhớ dữ liệu.
- Có 8 thanh ghi đa năng, mỗi thanh ghi có độ rộng 16 bit.
- Ngôn ngữ sử dụng Verilog
- Phần mềm mô phỏng: Modelsim

3. Tập lệnh


3.1 Các lệnh truy cập bộ nhớ
Load word: LD ws, offset(rs1)
=> ws = mem[rs1 + offset]
Lệnh lưu giữ liệu vào thanh ghi: LOAD

Store word: ST rs2, offset(rs1)
=> mem[rs1 + offset] = rs2
Lệnh lưu giữ liệu từ thành ghi vào data memory: STORE

3.2 Các lệnh toán học
Cộng: ADD ws, rs1, rs2
ws = rs1 + rs2
Trừ: SUB ws, rs1, rs2

=> ws = rs1 – rs2
Dịch trái: LSL ws, rs1, rs2
=> ws = rs1 << rs2
Dịch phải: LSR ws, rs1, rs2
=> ws = rs1 >> rs2
Lệnh NOT logic: INV ws, rs1
=> ws = ~rs1
Lệnh AND logic: AND ws, rs1, rs2
=> ws = rs1 & rs2
Lệnh OR logic: OR ws, rs1, rs2
=> ws = rs1 | rs2
Các lệnh toán học


3.3 Các lệnh rẽ nhánh
Rẽ nhánh khi bằng: BEQ rs1, rs2, offset
Nhảy tới địa chỉ lệnh PC + 2 (offset << 1) khi rs1 = rs2
Rẽ nhánh khi không bằng: BNE rs1, rs2, offset
Nhảy tới địa chỉ lệnh PC + 2(offset <<1) khi rs1 != rs2

Lệnh nhảy: JMP offset
Nhảy tới địa chỉ lệnh {PC[15:13], offset << 1}

3.4 Định nghĩa opcode
Opcode
0000
0001
0010
0011
0100

0101
0110
0111
1000
1001
1011
1100
1101

4. Thiết kế khối
4.1 Top block

LD
ST
ADD
SUB
INV
LSL
LSR
AND
OR
SLT
BEQ
BNE
JMP

Mô tả
Load Word
Strore Word
Cộng

Trừ
Invert (Not)
Dịch trái
Dịch phải
AND logic
OR logic
So sánh
Rẽ nhánh khi bằng
Rẽ nhánh khi không bằng
Nhảy


CPU gồm 2 phần chính Datapath và Control Unit
Trong Datapath bao gồm nhiều module nhỏ: alu_control, alu_unit, data_memory,
intruction_memory, register_file.

4.2 Control Unit
Control Unit là phần phát ra các tín hiệu điều khiển các phần còn lại của CPU sau khi
nhận opcode từ datapath.
Tín hiệu
opcode
alu_op
jump
beq
bne
mem_read
mem_write
alu_src
reg_dst
mem_to_reg

reg_write

Độ rộng (bit)
4
2
1
1
1
1
1
1
1
1
1

I/O
Input
Output
Output
Output
Output
Output
Output
Output
Output
Output
Output

Mô tả
phần opcode trong mã lệnh

điều khiển alu control
nhảy
thực hiện lệnh beq
thực hiện lệnh bne
đọc dữ liệu
ghi dữ liệu
load word, store word
các lệnh tính toán số học
ghi kết quả vào tệp thanh ghi
ghi dữ liệu vào tệp thành ghi

• Thuật toán chọn lệnh kế tiếp
Sau mỗi sườn lên của xung clk, Pc_current = Pc_next
Khi có các lệnh rẽ nhánh như JUMP, BNE, BEQ thì các tín hiệu từ control unit như jump,
bne, beq sẽ được set lên 1.


Khi đó địa chỉ lệnh kế tiếp Pc_next sẽ được tính toán bởi ALU và được gán cho Pc_next.
Khi các tín hiệu jump, bne, beq bằng 0, địa chỉ lệnh kế tiếp Pc_next= Pc_current +1

4.3 Data memory
Là bộ nhớ dữ liệu của CPU, tổng dung lượng là 16 Byte
Bao gồm 8 thanh ghi, có độ rộng là 16 bit.
Tín hiệu
clk
mem_access_add
r
mem_write_data
mem_write_en
mem_read_data

mem_read

Độ rộng
1
16

I/O
Input
Input

Mô tả
xung clock
địa chỉ ô nhớ truy cập

16
1
16
1

Input
Input
Output
Input

data ghi vào bộ nhớ
cho phép ghi
data đọc từ bộ nhớ
cho phép đọc

Thuật toán đọc ghi với bộ nhớ dữ liệu



4.4 Intruction memory
- Là bộ nhớ lệnh của CPU, có dung lượng là 30 Byte
- Bao gồm 15 thanh ghi, mỗi thanh ghi có độ rộng 16 bit..
- Có thể chứa tối đa 15 lệnh.
Tín hiệu
pc
instruction

Độ rộng
16
16

I/O
Input
Output

Mô tả
bộ đếm lệnh
mã lệnh

4.5 Alu control
- Có chức năng điều khiển ALU.
- Nhận opcode từ mã lệnh và tín hiệu ALUOp từ control unit để quyết định phép tính
được thực hiện ở ALU.
Tín hiệu
ALU_Cnt
ALUOp
Opcode


Độ rộng
3
2
4

I/O
Output
Input
Input

Mô tả
điều khiển alu unit
tín hiêu từ control unit
phần opcode trong mã lệnh

- Quan hệ giữa đầu vào và đầu ra của ALU control cho các phép tính, ứng với các kiểu
lệnh.


ALUOp
10
01
00
00
00
00
00
00
00

00

Opcode(hex)
xxxx
xxxx
0002
0003
0004
0005
0006
0007
0008
0009

ALU Control
ALUcnt
000
001
000
001
010
011
100
101
110
111

Phép tính ALU
ADD
SUB

ADD
SUB
INVERT
LSL
LSR
AND
OR
SLT

Kiểu lệnh
LW, SW
BEQ, BNE
ADD
SUB
INVERT
LSL
LSR
AND
OR
SLT

4.6 Alu unit
- Là đơn vị thực hiện các phép tính của CPU
- Được điều khiển bởi Alu control
Tín hiệu
a
b
alu control
result
zero


Độ rộng
16
16
3
16
1

I/O
Input
Input
Input
Output
Output

Mô tả
đầu vào cho phép tính
đầu vào cho phép tính
tín hiệu từ alu control
kết quả phép tính
cờ báo kết quả bằng 0

4.7 Register file
- Là tệp thanh ghi của CPU
- Bao gồm 8 thanh ghi được đánh số từ 0 đến 7
- Mỗi thanh ghi có độ rộng 16 bit
Tín hiệu
clk
reg_write_en
reg_write_dest

reg_write_data
reg_read_addr_1
reg_read_data_1
reg_read_addr_2
reg_read_data_2

Độ rộng
1
1
3
16
3
16
3
16

I/O
Input
Input
Input
Input
Input
Ouput
Input
Output

Mô tả
xung clock
cho phép ghi
địa chỉ ghi

data để ghi
địa chỉ đọc 1
data đọc được
địa chỉ đọc 2
data đọc được


5. Mô phỏng
Đồng thời với việc thiết kế kiến trúc, ta lên kế hoạch để kiểm tra thiết kế
- Phương pháp kiểm tra : Dùng mô phỏng , dùng modelsim
- Ngôn ngữ verilog
- Cách kiểm tra: Mô phỏng file mã nguồn thiết kế cùng file testbench để kiểm chứng hoạt
động. Trong file test bench ta sẽ đưa kích thích đầu vào, đầu ra của thiết kế được hiển thị
trên màn hình và được so sánh thủ công với giá trị đúng được tính toán từ đầu vào.

5.1 Control unit
Mô phỏng kiểm tra bằng cách đưa các đầu vào có thể của Opcode và so sanh đầu ra của
mô phỏng với đầu ra chuẩn.
Đầu
vào
Opcode reg_ alu_ mem_to
____
dst src
_reg_
0000
0
1
1
0001
0

1
0
0010
1
0
0
0011
1
0
0
0100
1
0
0
0101
1
0
0
0110
1
0
0
0111
1
0
0
1000
1
0
0

1001
1
0
0
1011
0
0
0
1100
0
0
0
1101
0
0
0
1111
1
0
0

Đầu ra chuẩn
reg_
write
1
0
1
1
1
1

1
1
1
1
0
0
0
1

mem_
read
1
0
0
0
0
0
0
0
0
0
0
0
0
0

mem_
write
0
1

0
0
0
0
0
0
0
0
0
0
0
0

Beq Bne alu_op
__ __
____
0
0
10
0
0
10
0
0
00
0
0
00
0
0

00
0
0
00
0
0
00
0
0
00
0
0
00
0
0
00
1
0
01
0
1
01
0
0
00
0
0
00

Jump

___
0
0
1
0
0
0
0
0
0
0
0
0
1
0


5.2 Data memory
Kịch bản 1: ghi dữ liệu
Ghi giá trị 3 vào địa chỉ 1.
mem_access_addr
mem_write_data
mem_write_en
mem_read

=
=
=
=


16'h1;
16'h3;
1'b1;
1'b0;

=
=
=
=

16'h7;
16'h0;
1'b0;
1'b1;

Kịch bản 2: đọc dữ liệu
Đọc dữ liệu ở địa chỉ 7.
mem_access_addr
mem_write_data
mem_write_en
mem_read


5.3 Instruction memory
Kịch bản test: Lần lượt đọc các giá trị của bộ nhớ lệnh ở địa chỉ 0, 2 , 16, 49
#2
#2
#2
#2


pc
pc
pc
pc

=
=
=
=

16'h0;
16'h2;
16'h10;
16'h31;


5.4 Alu control
Kịch bản test: đưa tất cả các đầu vào có thể của ALUOp và Opcode, kiểm tra đầu ra của
mô phỏng với đầu ra chuẩn.

5.5 Alu unit
Đưa lần lượt các tín hiệu alu_control để thực hiện các phép tính cộng, trừ, đảo, dịch trái,
dịch phải, and, or.

5.6 Register file
Kịch bản test:
- Ghi giá trị 2 vào thanh ghi R1
reg_write_en <= 1'b1;
reg_write_dest <= 3'b001;
reg_write_data <= 16'h2;



- Đọc giá trị từ 2 thanh ghi R3, R4
reg_write_en <= 1'b0;
reg_read_addr_1 <= 3'b011;
reg_read_addr_2 <= 3'b100;

6. Triển khai trên Quartus
6.1 Top block
Module trên cùng của project là module risc_16_bit, là kết nối của 2 module con là
Control Unit, và Datapath


6.2 Control unit
Control Unit là 1 mạch tổ hợp, nhận tín hiệu opcode từ Datapath và gửi đi các tín hiệu
điều khiển.


6.3 Datapath
Datapath bao gồm nhiều module con: Data memory, Instruction memory, Alu control,
Alu.



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

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