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

Thiết kế MCU 8 bit bằng ngôn ngữ VHDL

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.98 MB, 38 trang )

BÁO CÁO BÀI TẬP LỚN MÔN FPGA VÀ ỨNG DỤNG
Đề tài: Thiết kế MCU bằng ngôn ngữ VHDL và mô phỏng kết quả với Modelsim.
Nhóm sinh viên thực hiện: Nhóm 15
I. Nhiệm vụ thiết kế
Thiết kế một MCU với vi xử lý 8 bit, 16 cổng vào 8 bit, 16 cổng ra 8 bit, ROM 128
byte và RAM 96 byte.

Hình 1: Tổ chức phần cứng của MCU sẽ được thiết kế

1. Tổ chức bộ nhớ
Bộ nhớ của MCU bao gồm bộ nhớ chương trình, bộ nhớ dữ liệu và các cổng
vào/ra.


Hình 2: Các vùng địa chỉ của bộ nhớ 256 byte

1.1. Bộ nhớ chương trình (Program Memory) là nơi chứa các mã lệnh sẽ được
thực thi bởi MCU. Program Memory được xem là bộ nhớ chỉ đọc trong quá trình
thực hiện lệnh để tránh trường hợp lệnh bị viết đè lên. Vì vậy, Program Memory sẽ
được chế tạo trên một thiết bị ROM để khơng làm mất chương trình khi mất điện.
1.2. Bộ nhớ dữ liệu (Data Memory) là nơi chứa các biến tạm thời cho phép truy
xuất đọc ghi tạo ra bởi các chương trình phần mềm, nhằm phục vụ lưu trữ thơng tin
cho q trình thực hiện lệnh. Data Memory sẽ được thực hiện như một bộ nhớ
RAM.
1.3. Cổng vào ra (I/O Ports) dùng để trao đổi thông tin giữa thế giới bên ngoài
(thiết bị ngoại vi) và MCU.
2. Đơn vị xử lý trung tâm (Central Processing Unit - CPU)
CPU được xem là bộ não của MCU. Công việc của CPU bao gồm đọc lệnh từ bộ
nhớ, giải mã lệnh để hiểu xem lệnh đó dùng để làm gì và thực hiện các bước cần
thiết để hồn thành lệnh đó. CPU bao gồm đơn vị điều khiển (Control Unit - CU),
đơn vị logic số học (Arithmetic Logic Unit - ALU), một tập hợp các thanh ghi có




nhiệm vụ chứa dữ liệu, thông tin trạng thái của hệ thống và hệ thống mạch điện
dùng cho việc thực hiện các phép logic số học của dữ liệu.

Hình 3: Tổ chức CPU

2.1. Đơn vị điều khiển (Control Unit - CU) là một máy trạng thái hữu hạn (FSM)
điều khiển sự vận hành của MCU. CU có các trạng thái thực hiện các công việc là
truy xuất lệnh (fetch), giải mã lệnh (decode) và thực hiện các bước cần thiết để
hồn thành lệnh (execute). Trong q trình chuyển giữa các trạng thái, CU gửi các
tín hiệu điều khiển để di chuyển và thao tác dữ liệu nhằm đạt yêu cầu của lệnh.
2.2. Đường dữ liệu (Data Path) là một subsystem bao gồm các thanh ghi và ALU,
là nơi lưu trữ nhanh và thực hiện thao tác với dữ liệu bên trong CPU.
2.2.1. Thanh ghi (Registers)
- Thanh ghi lệnh (Instruction Register – IR): lưu mã lệnh hiện tại đang được
thực hiện. IR được sử dụng bởi CU để quyết định xem trạng thái nào cần chuyển
tới để hoàn thành lệnh.
- Thanh ghi địa chỉ bộ nhớ (Memory Address Register – MAR): lưu địa chỉ
hiện tại đang được sử dụng để truy cập bộ nhớ để biết cần truy xuất lệnh từ ROM
hay truy xuất dữ liệu từ RAM hoặc I/O.


- Bộ đếm chương trình (Program Counter – PC): lưu địa chỉ của lệnh đang
được thực hiện. PC sẽ tự động tăng lên qua mỗi lần đọc lệnh từ bộ nhớ, trừ khi có
một chương trình phần mềm thực hiện lệnh chuyển nó tới vị trí địa chỉ khác.
- Thanh ghi phục vụ mục đích chung (General-Purpose Registers: A & B): lưu
trữ tạm thời dữ liệu phục vụ cho các mục đích tính tốn hay di chuyển giữa CPU
và bộ nhớ.
- Thanh ghi trạng thái (Condition Code Register – CCR): chứa các cờ trạng

thái để cung cấp thêm thông tin cho việc tính tốn số học và logic của CPU. Các cờ
được thiết kế bao gồm: âm (Negative – N), không (Zero – Z), tràn (Overflow – V),
nhớ (Carry – C).
2.2.2. Đơn vị logic số học (Arithmetic Logic Unit - ALU)
ALU thực hiện các phép tính số học ( cộng, trừ, nhân, chia,…) và logic (and, or,
not,…). Trong bài này, ALU sẽ được thiết kế với các chức năng là cộng, trừ, and,
or, tăng và giảm.
II. Thiết kế
1. Lệnh
Có 3 loại lệnh chính: nạp và lưu trữ (loads and stores), thao tác dữ liệu (data
manipulations), và rẽ nhánh (branhces).
1.1. Loads and Stores
Load là lệnh di chuyển dữ liệu từ bộ nhớ vào trong một thanh ghi của CPU. Có 2
kiểu Load chính sẽ được thiết kế là Load tức thời (nạp giá trị operand trong ô nhớ)
và Load trực tiếp (nạp giá trị trong ơ nhớ có địa chỉ là operand) cho 2 thanh ghi A
và B.
Store là lệnh di chuyển dữ liệu từ thanh ghi của CPU vào trong bộ nhớ. Kiểu Store
sẽ được thiết kế là Store trực tiếp cho 2 thanh ghi A và B (lưu dữ liệu trong thanh
ghi vào địa chỉ ô nhớ cho bởi operand).
1.2. Data Manipulations


Các lệnh loại này liên quan đến sự vận hành của ALU, thao tác với những dữ liệu
chứa trong các thanh ghi. Các lệnh sẽ được thiết kế bao gồm: cộng (A=A+B), trừ
(A=A-B), AND (A=AandB), OR (A=AorB), tăng 1 (A=A+1, B=B+1), giảm 1
(A=A-1, B=B-1).
1.3. Branches
Branch là lệnh giúp đưa thanh ghi PC tới địa chỉ mong muốn, thay vì tự động tăng
lên sau mỗi lệnh. Có 2 loại Branch sẽ được thiết kế là Branch Always (PC sẽ được
nạp với giá trị cho bởi operand) và Branch có điều kiện (PC chỉ được cập nhật khi

có một điều kiện cụ thể là đúng, và những điều kiện đến từ cờ trạng thái của thanh
ghi CCR).

Hình 4: Bảng tổng hợp các lệnh sẽ được thiết kế


2. Thiết kế bộ nhớ
File memory.vhd sẽ chứa 3 component là rom.vhd, ram.vhd và outports.vhd. Các
cổng input khơng có chức năng store nên chỉ cần khai báo là đầu vào trong chương
trình. Một bộ dồn kênh Multiplexer được sử dụng để chọn tuyến tín hiệu đi về
CPU dựa vào địa chỉ.

Hình 5: Sơ đồ khối cho bộ nhớ của MCU

2.1. Thiết kế ROM
ROM sẽ được khai báo như là một mảng gồm 128 phần tử (0-127) với những giá
trị cho trước (Hình 4) để định nghĩa chương trình. Việc truy xuất dữ liệu từ các ơ
nhớ của ROM chính là gán giá trị trong mảng cho đầu ra của ROM khi có sườn lên
của xung clock. Ngồi ra, một tín hiệu enable (EN) cũng được khởi tạo để cho
phép truy xuất dữ liệu từ đúng địa chỉ của ROM.
Code : rom.vhd



2.2. Thiết kế RAM
Ram được triển khai tương tự như ROM, là một mảng có 96 phần tử (0-95). Vì vậy
có thể truy xuất dữ liệu từ các ơ nhớ của RAM khi có sườn lên xung clock. Thêm
vào đó, RAM không chỉ cho phép read mà cả write nên có thể ghi giá trị đầu vào
của RAM vào ơ nhớ khi có sườn lên của xung clock và có tín hiệu write.
Code : ram.vhd



2.3. Thiết kế các cổng Output
Các cổng output có khả năng store nên CPU có thể cập nhật một cổng output bằng
cách ghi vào địa chỉ của nó. Vì vậy có thể khai báo các cổng output như là một
mảng có 16 phần tử (0-15) và có thể truy xuất và ghi với cơ chế giống của RAM.
Tuy nhiên, các cổng này sẽ có thêm chân reset để xóa hết dữ liệu.
Code : outport.vhd


2.4. Thiết kế toàn bộ bộ nhớ
Code : memory.vhd



3. Thiết kế CPU
CPU bao gồm 2 component là Control Unit (cu.vhd) và Data Path (data_path.vhd).
- Data Path bao gồm các thanh ghi và một Sub-component là ALU (alu.vhd). Data
Path còn bao gồm một hệ thống đường Bus để di chuyển dữ liệu giữa bộ nhớ và


các thanh ghi. Hệ thống Bus được triển khai với hai Multiplexer được điều khiển
bởi Control Unit.
- Control Unit chứa FSM tạo ra tất cả tín hiệu điều khiển cho Data Path khi CPU
thực hiện các bước fetch-decode-execute cho mỗi lệnh.

Hình 6: Sơ đồ khối cho CPU

3.1. Thiết kế Data Path
3.1.1. Thiết kế ALU



ALU là một bộ mạch tổ hợp logic để thực hiện phép toán số học và logic với dữ
liệu đầu vào từ các thanh ghi A và B. Đầu ra của ALU gọi là Result. ALU còn cho
đầu ra là 4 cờ trạng thái tương ứng với 4 bit NZVC.
Hành vi của ALU được xây dựng bằng cách sử dụng mệnh đề case-when để quyết
định xem nên thực hiện phép tính nào dựa trên tín hiệu điều khiển ALU_sel. Mỗi
phép tính sẽ đều cập nhật cho các cờ N, Z, V, C:
- Cờ N sẽ được gán bằng bit vị trí 7 của ALU_Result bởi vì đây là bit dấu.
- Cờ Z sẽ được gán bằng cách dùng mệnh đề when-else để kiểm tra xem kết quả
phép tính có bằng x“00” hay không.
- Cờ V sẽ được gán tùy vào phép tính. Với phép cộng, cờ V sẽ được gán là 1 nếu
như một số dương cộng một số dương bằng số âm, hoặc số âm cộng số âm bằng số
dương. Với phép trừ, cờ V sẽ được gán là 1 nếu như một số dương trừ một số âm
bằng số âm, hoặc số âm trừ số dương bằng số dương. Những điều kiện này sẽ được
kiểm tra với bit dấu của hai số và kết quả.
- Cờ C sẽ được gán bằng bit vị trí 8 của biến temp.
Code : alu.vhd


3.1.2. Thiết kế toàn bộ Data Path
Hệ thống bao gồm hai đường bus 8 bit (BUS1 và BUS2) và hai Multiplexer.


- BUS1 được dùng để vận chuyển dữ liệu đầu ra của thanh ghi PC, A và B; còn
BUS2 được dùng để vận chuyển dữ liệu đầu vào cho thanh ghi IR, MAR, PC, A và
B. BUS1 được nối trực tiếp với cổng to_memory của CPU để cho phép các thanh
ghi ghi dữ liệu vào bộ nhớ. BUS2 có thể được nạp từ cổng from_memory của CPU
để cho phép bộ nhớ gửi dữ liệu cho các thanh ghi của CPU.
- Hai Multiplexer đảm nhận nhiệm vụ định tuyến tín hiệu và chọn kênh thơng qua

hai tín hiệu Bus1_Sel và Bus2_Sel điều khiển bởi Control Unit.
Mỗi thanh ghi của Data Path được thiết kế bằng process với tín hiệu clock và reset.
Mỗi thanh ghi đều có một tín hiệu cho phép cập nhật dữ liệu chứa trong đó, kí hiệu
là (tên thanh ghi)_Load. Thanh ghi chỉ được cập nhật dữ liệu nếu tín hiệu cho phép
bằng 1 và có sườn lên của xung clock. Thanh ghi PC thì đặc biệt hơn là có tính
năng tự tăng lên 1 nên sẽ có thêm một tín hiệu điều khiển PC_Inc.
Code : data_path.vhd



3.2. Thiết kế Control Unit
Control Unit gửi tín hiệu đến Data Path để di chuyển dữ liệu vào hoặc ra khỏi các
thanh ghi và đưa vào khối ALU phục vụ cho việc tính tốn. FSM được xây dựng là
một kiểu dữ liệu tự định nghĩa dành cho tín hiệu trạng thái hiện tại (current_state)
và trạng thái tiếp theo (next_state) trong quá trình thực hiện lệnh. Kiểu dữ liệu này
bao gồm các trạng thái liên quan đến fetch (S_FETCH_0, S_FETCH_1,
S_FETCH_2), decode (S_DECODE_3) và execute. Sau trạng thái S_DECODE_3
thì sẽ có đường rẽ tới những trạng thái bổ trợ giúp execute những lệnh khác nhau.
Bài thiết kế này sẽ có những trạng thái bổ trợ được tạo ra cho 3 loại lệnh như sau:
- Loads and Stores: S_LOAD_AND_STORE_4
S_LOAD_AND_STORE_5
S_LOAD_AND_STORE_6


S_LOAD_AND_STORE_7
S_LOAD_AND_STORE_8
- Data Manipulations: S_DATA_MAN_4
- Branches: S_BRANCH_4
S_BRANCH_5
S_BRANCH_6

Bên trong Architecture của Control Unit, một process riêng sẽ được thiết kế để cập
nhật trạng thái hiện tại bằng trạng thái tiếp theo mỗi khi có sườn lên của xung
clock. Trạng thái reset sẽ là trạng thái fetch đầu tiên của FSM (S_FETCH_0).
Một process nữa được thiết kế để triển khai sự chuyển tiếp giữa các trạng thái khi
thực hiện lệnh. Process này sẽ phụ thuộc vào current_state, IR và CCR_Result.

Hình 7: Graph trạng thái trước trạng thái 4 để execute lệnh cụ thể

Hình 7 có 3 tín hiệu LOAD_STORE_OP, DATA_MAN_OP và BRANCH_OP
dùng để xác định trạng thái sau S_DECODE_3 là gì:
- LOAD_STORE_OP được gán là 1 khi thanh ghi IR chứa các opcode sau: x”86”,
x”87”, x”88”, x”89”, x”96”, x”97”.


- DATA_MAN_OP được gán là 1 khi thanh ghi IR chứa các opcode từ x”42” đến
x”49”.
- BRANCH_OP được gán là 1 khi thanh ghi IR chứa các opcode từ x”20” đến
x”28”.
Graph trạng thái cho lệnh Loads and Stores:

Hình 8: Graph trạng thái cho lệnh Loads and Stores

Graph trạng thái cho lệnh Data Manipulations:


Hình 9: Graph trạng thái cho lệnh Data Manipulations

Graph trạng thái cho lệnh Branches:



Hình 10: Graph trạng thái cho lệnh Branches

Code : cu.vhd





×