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

Bài tập lớn Thiết kế, tổng hợp IC số và hệ thống số: RISC SPM (có code)

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.57 MB, 41 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ-VIỄN THÔNG
====o0o====

THIẾT KẾ, TỔNG HỢP IC SỐ VÀ HỆ THỐNG SỐ
BÁO CÁO CUỐI KÌ
ĐỀ TÀI: MÁY CHƯƠNG TRÌNH ĐƯỢC LƯU TRỮ MÁY
TÍNH VỚI TẬP LỆNH ĐƠN GIẢN (RISC SPM)

GVHD: TS Võ Lê Cường
Nhóm thực hiện: Nhóm 13
Nguyễn Minh Hiếu (20151336) – Điện tử 03 K60
Nguyễn Nguyên Bách (20150239) – Điện tử 08 K60

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

1


LỜI NÓI ĐẦU
Trong học phần Thiết kế, tổng hợp IC số và hệ thống số, để phục vụ cho bài
tập lớn cuối kì, nhóm 13 chúng em chọn đề tài “Máy chương trình được lưu trữ máy
tính với tập lệnh đơn giản (RISC SPM)” để thực hiện. Đề tài này tuy hơi khó nhưng
khá hay, vận dụng được nhiều kiến thức đã học để làm. Ngoài việc thiết kế, viết code
Verilog, nhóm em còn triển khai mạch trên kit FPGA DE2 của Altera. Nhóm em xin
chân thành cảm ơn thầy Võ Lê Cường cùng các bạn trong lab AICS đã hướng dẫn chỉ
dạy trên lớp giúp chúng em hoàn thành bài tập lớn này.

2



MỤC LỤC

3


DANH MỤC HÌNH VẼ

4


DANH MỤC BẢNG BIỂU

NỘI DUNG
Chương 1. Phân chia công việc
Bảng 1.1 thể hiện phân chia công việc của nhóm.
Bảng 1.1 Phân chia công việc
5


Người làm
Nguyễn
Minh Hiếu

Nguyễn
Nguyên
Bách

Công việc
Toàn bộ code trên Quartus, mô phỏng trên
Modelsim và triển khai mạch trên FPGA

Phần báo cáo:
2.6 Mô phỏng RISC SPM
Chương 3. Triển khai mạch trên FPGA
Phần báo cáo:
2.1 Tổng quan về RISC SPM
2.2 Thiết kế sơ bộ RIST SPM
2.3 Bộ xử lí
2.4 Tập lệnh của RISC SPM
2.5 Bộ điều khiển

Chiếm %
50%

Tổng chiếm %
75%

5%
20%
25%
5%
5%
5%
5%
5%

6


Chương 2. Thiết kế và mô phỏng máy chương trình được lưu trữ
máy tính với tập lệnh đơn giản (RISC SPM)

2.1 Mục tiêu, yêu cầu thiết kế
2.1.1 Mục tiêu thiết kế
Ở bài tập lớn này nhóm em sẽ thiết kế Máy chương trình được lưu trữ máy tính
với tập lệnh đơn giản (Reduced instruction-set computer stored-program machine –
RISC SPM). RISC được thiết kế để có một tập nhỏ các lệnh có thể thực hiện trong các
chu ký đồng hồ ngắn, với một số lượng nhỏ chu kì mỗi lệnh. Các máy RISC được tối
ưu hoá để đạt được hiệu quả pipelining của các luồng lệnh.
RISC SPM là một máy có kiến trúc RISC có thể lưu trữ chương trình, các
lệnh của nó được lưu trong memory. Máy bao gồm ba khối chức năng: bộ xử lý
(processor), bộ điều kiển (controller) và memory. Các tập lệnh chương trình và dữ liệu
được lưu trữ trong memory. Kiến trúc tổng thể của RISC SPM được hiển thị trong hình
2.1.

7


8


Hình 2.1 Kiến trúc tổng thể của RISC SPM
2.1.2 Yêu cầu thiết
RISC

SPM

kế
giống

như


một máy tính thu nhỏ

được thiết kế

để có thể hoạt động

theo chương

trình nhờ các lệnh có sẵn Trong hoạt động theo chương trình, các lệnh được nạp đồng
bộ từ memory, được giải mã và được thực hiện để hoàn thành các yêu cầu sau:
-

Hoạt động trên dữ liệu trong khối tính toán số học và logic (ALU)
Thay đổi nội dung của các thanh ghi lưu trữ
Thay đổi các đổi số của bộ đếm chương trình (PC), thanh ghi lệnh (IR) và thanh

-

ghi địa chỉ (ADD_R)
Thay đổi nội dung memory
Lấy lại dữ liệu và lệnh từ memory
Điều khiển sự di chuyển của dữ liệu trên các bushệ thống
Thanh ghi lệnh (IR) chứa lệnh đang được thực hiện; bộ đếm chương
trình (PC) chứa địa chỉ của lệnh tiếp theo được thực hiện; và thanh ghi địa chỉ
(ADD_R) giữ địa chỉ của vị trí trong memory sẽ được đánh địa chỉ tiếp bằng
hoạt động đọc hoặc ghi.
Trong bài tập lớn này, nhóm em sử dụng các dữ liệu và địa chỉ (trong
memory) có độ dài word_size=8 bit

9



2.2 Thiết kế sơ bộ RIST SPM
RIST SPM có thể thiết kế theo sơ đồ FSMD với phần FSM là bộ điều khiển
và phần datapath là bộ xử lí và memory, hai phần giao tiếp với nhau qua các tín hiệu
điều khiển từ bộ điều khiển sang bộ xử lí và các lệnh và cờ zero từ bộ xử lí sang bộ
điều khiển (hình 2.2).

Hình 2.2 Thiết kế sơ bộ FSM SPM

Các

tín

hiệu từ bộ điều

khiển sang bộ xử

lí có nhiệm vụ

điều khiển các

đường

dữ

liệu

trong bộ xử lí. Bộ điều khiển nhận lệnh (và tín hiệu zero) từ bộ xử lí sang để từ đó đưa
ra các tín hiệu điều khiển phù hợp.

10


2.3 Bộ xử lí
2.3.1 Tổng quan bộ xử lí
Bộ xử lí bao gồm các thanh ghi (R0, R1, R2, R3, Reg_Y, Reg_Z, Add_R, PC,
IR), các đường dữ liệu, đường điều khiển (từ bộ điều khiển) và một ALU có khả năng
thực hiện các phép toán số học và logic, tuỳ theo mã opcode được giữ trong thanh ghi
lệnh. Bộ ghép kênh Mux_1 xác định nguồn dữ liệu sau đó sẽ đến cho Bus_2. Các
đường dữ liệu đầu vào cho Mux_1 là từ 4 thanh ghi đa chức năng R0, R1, R2, R3 và từ
PC. Dữ liệu của Bus_1 có thể được điền khiển đến ALU, đến memory hoặc đến Bus_2
(thông qua Mux_2) Các đường dũ liệu vào cho Mux_2 là từ ALU, Mux_1 và memory.
Do đó, một lệnh có thể được tìm nạp từ bộ nhớ, đặt trên Bus_2 và được tải vào thanh
ghi lệnh. Một word dữ liệu có thể lấy được từ memory và được dẫn đến một thanh ghi
đa chức năng hoặc đến thanh ghi toán hạng trước khi đến hoạt động của ALU. Kết quả
tính toán của ALU có thể được đặt trên Bus_2, được tải vào một thanh ghi và sau đó
được chuyển vào memory. Một thanh ghi chuyên dụng (Reg_Z) giữ một cờ cho biết kết
quả tính toán ALU có bằng 0 không. Tổng quan bộ xử lí được thể hiện trên hình 2.3.
Ngoài các đầu vào và đầu ra giao tiếp với bộ điều khiển, bộ xử lí còn nhận dữ liệu vào
mem_word từ memory và xuất địa chỉ address cũng như dữ liệu ở Bus1 sang memory.

Hình 2.3 Tổng quan bộ xử lí
11


2.3.2 Thiết kế các thanh ghi đa chức năng, thanh ghi lệnh, thanh ghi địa chỉ
Các thanh ghi đa chức năng R0, R1, R2, R3, thanh ghi lệnh, thanh ghi địa chỉ
(hình 2.4) đơn thuần là đưa dữ liệu ra từ dữ liệu vào mỗi khi có sườn lên xung clk và
có tính hiệu load.


Hình 2.4 Thanh ghi đa chức năng, thanh ghi lệnh, thanh ghi địa chỉ

Trong verilog ta dùng khối always và cấu trúc if else, reset là không đồng bộ.
always @ (posedge clk or negedge rst)
if (rst == 0) data_out <= 0; else if (load) data_out <= data_in;

12


2.3.3 Thiết kế bộ đếm chương trình
Bộ đếm chương trình (hình 2.5) cũng có dạng thanh ghi với đầu ra được điều
khiển là lấy đầu vào nếu có tín hiệu Load_PC hoặc tăng lên 1 nếu có tín hiệu Inc_PC.

Hình 2.5 Bộ đếm chương trình

Trong

Verilog ta dùng

khối always và

cấu trúc if else,

reset

đồng bộ.



không


always @ (posedge clk or negedge rst)
if (rst == 0) count <= 0; else if (Load_PC) count <= data_in;
else if (Inc_PC) count <= count +1;

13


2.3.4 Thiết kế Mux_1(5-1) và Mux_2 (3-1)
Các bộ Mux này (hình 2.6 và 2.7)đơn giản là gán dữ liệu ra theo một trong số
các tín hiệu vào dựa vào tín hiệu sel. Trong Verilog ta dùng toán tử ? : để rẽ nhánh các
điều kiện của sel và xác định đầu ra, code của mỗi Mux ở dưới hình Mux tương ứng.

Hình 2.6 Mux_1 (5-1)
assign mux_out = (sel == 0) ? data_a:
(sel == 1) ? data_b :
(sel == 2) ? data_c:
(sel == 3) ? data_d :
(sel == 4) ? data_e : 'bx;

14


Hình 2.7 Mux_2 (3-1)
assign mux_out = (sel == 0) ? data_a:
(sel == 1) ? data_b :
(sel == 2) ? data_c: 'bx;
2.3.5 Thiết kế khối ALU
Khối ALU (hình 2.8)


thực

hiện tính toán giữa 2 toán hạng data_1 và data_2, tập lệnh của nó được thể hiện trong
bảng 2.1.
Bảng 2.1 Tập lệnh của ALU
Lệnh
ADD
SUB
AND
NOT

Hoạt động tính toán
Cộng các đường dữ liệu, kết quả là data_1 + data_2
Trừ các đường dữ liệu, kết quả là data_1 - data_2
Thực hiện phép bitwise-AND, kết quả là data_1 & data_2
Thực hiện phép bitwise-NOT của data_1, kết quả là ~data_1

15


Hình 2.8 ALU

Khối ALU nhận 2 dữ liệu vào 8 bit, dựa vào mã sel 4 bit để quyết định hoạt
động tính toán, đưa kết quả ra đầu ra 8 bit và có một cờ zero báo hiệu nếu kết quả bằng
0. Khối ALU đơn thuần là một mạch tổ hợp tính toán đầu ra thông qua 2 đầu vào dựa
vào lệnh nhận được (opcode). Trong verilog ta dùng lệnh case đặt trong khối always
như sau:
always @ (sel or data_1 or data_2)
case (sel)
NOP:

alu_out = 0;
ADD:
alu_out = data_1 + data_2; // Reg_Y + Bus_1
SUB:
alu_out = data_2 - data_1;
AND:
alu_out = data_1 & data_2;
NOT:
alu_out = ~ data_2; // Gets data from Bus_1
default:
alu_out = 0;
endcase

16


2.3.6 Thiết kế bộ xử lí
Ghép các khối đã được thiết kế với nhau thành bộ xử lí (D_flop là thanh ghi
Z).
Register_Unit R0 (R0_out, Bus_2, Load_R0, clk, rst);
Register_Unit R1 (R1_out, Bus_2, Load_R1, clk, rst);
Register_Unit R2 (R2_out, Bus_2, Load_R2, clk, rst);
Register_Unit R3 (R3_out, Bus_2, Load_R3, clk, rst);
Register_Unit Reg_Y (Y_value, Bus_2, Load_Reg_Y, clk, rst);
D_flop Reg_Z (Zflag, alu_zero_flag, Load_Reg_Z, clk, rst);
Address_Register Add_R (address, Bus_2, Load_Add_R, clk, rst);
Instruction_Register IR (instruction, Bus_2, Load_IR, clk, rst);
Program_Counter PC (PC_count, Bus_2, Load_PC, Inc_PC, clk, rst);
Multiplexer_5ch Mux_1 (Bus_1, R0_out, R1_out, R2_out, R3_out, PC_count,
Sel_Bus_1_Mux);

Multiplexer_3ch Mux_2 (Bus_2, alu_out, Bus_1, mem_word, Sel_Bus_2_Mux);
Alu_RISC ALU (alu_zero_flag, alu_out, Y_value, Bus_1, opcode);

17


2.4 Tập lệnh của RISC SPM
Máy được điều khiển bởi một chương trình ngôn ngữ máy bao gồm một tập
lệnh được lưu trong memory. Vì vậy, ngoài việc phụ thuộc vào kiến trúc của máy, thiết
kế bộ điều khiển còn phụ thuộc vào tập lệnh của bộ xử lý (nghĩa là các lệnh có thể
được thực hiện bởi 1 chương trình). Một chương trình ngôn ngữ máy bao gồm một
chuỗi các word 8 bit (1 bye) được lưu trữ. Định dạng một lệnh của RISC_SPM có thể
dài ngắn tùy thuộc vào hoạt động.
Một lệnh ngắn cần 1 byte trong memory để lưu trữ.Word này có opcode 4 bit,
địa chỉ thanh ghi nguồn 2 bit và địa chỉ thanh ghi đích 2 bit. Một lệnh dài cần 2 byte
của memory. Word (8 bit) đầu tiên của một lệnh dài chứa opcode 4 bit, 4 bit còn lại có
thể được sử dụng để chỉ định địa chỉ của một cặp thanh ghi nguồn và đích, tùy thuộc
vào tập lệnh. Word thứ hai chứa địa chỉ của word memory chứa toán hạng theo yêu cầu
của lệnh.
Hình 2.9 thể hiện ví dụ các lệnh ngắn (bên trái và lệnh dài (bên phải).

Hình 2.9 Ví dụ các lệnh ngắn và lệnh dài

Bộ

đếm

chương trình giữ

địa chỉ của lệnh


tiếp theo sẽ được

thực thi. Khi thiết

lập lại bên ngoài

được xác nhận, bộ đếm chương trình được tải bằng 0, chỉ ra rằng phần dưới của bộ nhớ
18


giữ lệnh tiếp theo sẽ được tìm nạp. Theo tác động của đồng hồ, đối với các lệnh đơn
chu kỳ, lệnh tại địa chỉ trong bộ đếm chương trình được tải vào thanh ghi lệnh và bộ
đếm chương trình được tăng lên. Bộ giải mã lệnh xác định hành động kết quả trên các
bảng dữ liệu và ALU. Một lệnh dài được giữ trong 2 byte và cần có một chu kỳ xung
nhịp bổ sung để thực hiện lệnh. Trong chu kỳ thực hiện thứ hai, byte thứ hai được lấy
từ quảng cáo bộ nhớ, địa chỉ được giữ trong bộ đếm chương trình, sau đó lệnh được
hoàn thành. Nội dung trung gian của ALU có thể là vô nghĩa khi hoạt động hai chu kỳ
đang được thực hiện.
Các hoạt động của mỗi lệnh sau được thể hiện trong bảng 2.2.
Bảng 2.2 Tập lệnh của RISC SPM
Lệnh
NOP

Mã lệnh
(opcode_src_dest
)
0000_??_??

ADD


0001_src_dest

SUB

0010_src_dest

AND

0011_src_dest

NOT

0100_src_dest

RD*

0101_??_dest

Hành động

Biểu thức minh họa

Không thực hiện gì, tất cả các
thanh ghi giữ nguyên giá trị.
Các địa chỉ của các thanh ghi
nguồn và đích là don’t care,
không có tác dụng gì
Cộng nội dung của các thanh
ghi nguồn và đích, lưu kết quả

vào thanh ghi đích
Trừ nội dung thanh ghi nguồn
từ thanh ghi đích và lưu kết
quả vào thanh ghi đích
Thực hiện phép bitwise-AND
của nội dung các thânh ghi
nguồn và đích, lưu kết quả vào
thanh ghi đích
Thực hiện phép bitwise-NOT
của nội dung thanh ghi nguồn
và lưu kết quả vào thanh ghi
đích
Lấy một word trong memory
từ địa chỉ được xác định bởi
byte thứ hai của lệnh và tải kết
quả và thanh ghi đích. Các bit

none

dest<=src+dest
dest<=dest-src
dest<=src&&dest

dest<=~src

dest<=memory[Add_R]

19



của thanh ghi nguồn là don’t
care
WR* 0110_src_??
Ghi nội dung của thanh ghi memory[Add_R]<=src
nguồn vào một từ trong
memory xác định bởi địa chỉ
trong byte thứ hai của lệnh.
Các bit của thanh ghi đích là
don’t care
BR*
0111_??_??
Phân nhánh luồng hoạt động PC<=memory[Add_R]
bằng cách tải bộ đếm chương
trình với word ở vị trí xác định
bới byte thứ hai của lệnh
BRZ* 1000_??_??
Hoạt động như lệnh BR nhưng PC<=memory[Add_R]
với điều kiện cờ zero bằng 1
HALT 1111_??_??
Tạm dừng quá trình thực hiện
lệnh đến khi reset
Chú thích: * Yêu cầu word thứ hai của lệnh; ? don’t care

20


2.5 Bộ điều khiển
2.5.1 Tổng quan bộ điều khiển
Timing của tất cả các hoạt động được xác định bởi bộ điều khiển (hình 2.10).
Bộ điều khiển phải điều khiển dữ liệu đến đích phù hợp theo lệnh được thực thi. Do đó,

thiết kế của bộ điều khiển phụ thuộc rất nhiều vào đặc điểm kỹ thuật của ALU của máy,
các nguồn đường dữ liệu của máy và sơ đồ xung nhịp có sẵn. Trong bài tập lớn nầy,
một single clock sẽ được sử dụng, việc thực hiện của một lệnh được bắt đầu trên một
sườn của clock. Bộ điều khiển sẽ theo dõi trạng thái của bộ xử lí, lệnh được thực hiện
và xác định giá trị của các tín hiệu điều khiển.

Hình 2.10 Bộ điều khiển

21


Các tín hiệu đầu vào của bộ điều khiển là từ word lệnh và cờ zero từ ALU. Các
tín hiệu đầu ra của bộ điều khiển và chức năng của chúng được thể hiện trong bảng 2.3.
Bảng 2.3 Các tín hiệu đầu ra của khối điều khiển
Tín hiệu điều khiển
Load_Add_Reg
Load_PC
Load_IR
Inc_PC
Sel_Bus_1_Mux
Sel_Bus_2_Mux
Load_R0
Load_R1
Load_R1
Load_R2
Load_Reg_Y
Load Reg_Z
Write

Hành động

Tải thanh ghi địa chỉ
Tải Bus_2 đến bộ đếm chương trình (PC)
Tải Bus_2 đến thanh ghi lệnh (IS)
Tăng bộ đếm chương trình lên 1
Điều khiển đầu ra của Bus_1 chọn từ PC, R0, R1, R2 hoặc
R3
Điều khiển đầu ra của Bus_1 chọn từ Alu_out hoặc Bus_1
Tải thanh ghi đa chức năng R0
Tải thanh ghi đa chức năng R1
Tải thanh ghi đa chức năng R2
Tải thanh ghi đa chức năng R3
Tải Bus_2 đến thanh ghi Reg_Y
Lưu đầu ra của ALU vào thanh ghi Reg_Z
Tải Bus_1 vào SRAM memory ở vị trí được xác định bởi
thanh ghi địa chỉ

Các nhiệm vụ của bộ điều khiển như sau:
-

Xác định khi nào tải các thanh ghi
Chọn đường dữ liệu đi qua các bộ ghép kênh
Xác định khi nào dữ liệu được ghi vào memory
Điều khiển các bus 3 trạng thái trong kiến trúc

22


2.5.2 Thiết kế bộ điều khiển
Bộ điều khiển sẽ được thiết kế là FSM. Máy có 3 pha hoạt động: lấy lệnh, giải
mã, thực hiện. Pha lấy lệnh lấy một lệnh từ memory; pha giải mã giải mã lệnh, điều

khiển các đường dữ liệu và tải các thanh ghi; pha thực hiện tạo ra kết quả của lệnh. Pha
lấy lệnh cần 2 chu kì đồng hồ - một để tải thanh ghi địa chỉ và một để lấy word được
đánh địa chỉ từ memory. Pha giải mã cần 1 chu kì đồng hồ. Pha thực hiện có thể cần 0,
1 hoặc nhiều hơn 2 chu kì đồng hồ tùy lệnh. Lệnh NOT có thể thực hiện trong cùng
chu kì lệnh được giải mã; các lệnh 1 byte, như ADD, mất 1 chu kì để thực thi, trong khi
đó các kết quả của hoạt động được tải vào thanh ghi đích. Thanh ghi nguồn có thể được
tải trong pha giải mã. Pha thực hiện của lệnh 2 byte cần 2 chu kì, một để tải thanh ghi
địa chỉ trong bte thứ hai và một để lấy word từ vị trí bộ nhớ được đánh địa chỉ bởi byte
thứ hai và tải nó vào thanh ghi đích. Bộ điều khiển có 11 trạng thái được thể hiện trong
bảng 2.4.
Bảng 2.4 Các trạng thái của khối điều khiển
Trạng thái
S_idle
S_fet1
S_fet2
S_dec
S_ex1
S_rd1
S_rd2
S_wr1
S_wr2
S_br1
S_br2

Hành động
Là trạng thái sau khi reset, không thực hiện gì
Tải thanh ghi địa chỉ với nội dung của PC (PC đã được khởi tạo đến địa
chỉ bắt đầu bởi hành động reset)
Tải thanh ghi lệnh với word được đánh địa chỉ bởi thanh ghi địa chỉ,
tăng PC lên tới vị trí tiếp theo trong memory và chờ lệnh tiếp theo hoặc

lấy dữ liệu
Giải mã thanh ghi lệnh và kích hoạt tín hiệu để điều khiển đường dũ
liệu và sự chuyển đổi thanh ghi
Thực hiện hoạt động ALU cho lệnh 1 byte, tùy theo điều kiện mà kích
hoạt cờ zero, và tải thanh ghi đích
Tải thanh ghi địa chỉ với byte thứ hai của lệnh RD và tăng PC lên
Tải thanh ghi đích với word trong memory được đánh địa chỉ bởi byte
được tải trong S_rd1
Tải thanh ghi địa chỉ với byte thứ hai của lệnh WR và tăng PC lên
Tải thanh ghi đích với word trong memory được đánh địa chỉ bởi byte
được tải trong S_wr1
Tải các thanh ghi địa chỉ với byte thứ hai của lệnh BR và tăng PC lên
Tải PC với word trong memory được đánh địa chỉ bởi byte được tải
trong S_br1
23


S_halt

Là trạng thái mặc định để bẫy lỗi để giải mã một lệnh có hiệu lực
Bên dưới là code Verilog chuyển đổi giữa trạng thái và hoạt động trong mỗi

trạng thái của khối điều khiển:
always @ (state or opcode or zero) begin: Output_and_next_state
Sel_R0 = 0; Sel_R1 = 0; Sel_R2 = 0; Sel_R3 = 0; Sel_PC = 0;Load_R0 = 0;
Load_R1 = 0; Load_R2 = 0; Load_R3 = 0;Load_PC = 0; Load_IR = 0;
Load_Add_R = 0;Load_Reg_Y = 0;Load_Reg_Z = 0;
Inc_PC = 0;
Sel_Bus_1 = 0;
Sel_ALU = 0;

Sel_Mem = 0;
write = 0;
err_flag = 0;
// Used for de-bug in simulation
next_state = state;
case (state)
S_idle:
next_state = S_fet1;
S_fet1:
next_state = S_fet2;
Sel_PC = 1;
Sel_Bus_1 = 1;
Load_Add_R = 1;
end

begin

S_fet2:
next_state = S_dec;
Sel_Mem = 1;
Load_IR = 1;
Inc_PC = 1;
end

begin

S_dec:
NOP: next_state = S_fet1;
ADD, SUB, AND: begin
next_state = S_ex1;

Sel_Bus_1 = 1;
Load_Reg_Y = 1;

case (opcode)

24


case (src)
R0:
R1:
R2:
R3:
default :
endcase
end // ADD, SUB, AND
NOT: begin
next_state = S_fet1;
Load_Reg_Z = 1;
Sel_Bus_1 = 1;
Sel_ALU = 1;
case (src)
R0:
R1:
R2:
R3:
default :
endcase
case (dest)
R0:

R1:
R2:
R3:
default:
endcase
end // NOT

Sel_R0 = 1;
Sel_R1 = 1;
Sel_R2 = 1;
Sel_R3 = 1;
err_flag = 1;

Sel_R0 = 1;
Sel_R1 = 1;
Sel_R2 = 1;
Sel_R3 = 1;
err_flag = 1;
Load_R0 = 1;
Load_R1 = 1;
Load_R2 = 1;
Load_R3 = 1;
err_flag = 1;

RD: begin
next_state = S_rd1;
Sel_PC = 1; Sel_Bus_1 = 1; Load_Add_R = 1;
end // RD
WR: begin
next_state = S_wr1;

Sel_PC = 1; Sel_Bus_1 = 1; Load_Add_R = 1;
end // WR
BR: begin
next_state = S_br1;
Sel_PC = 1; Sel_Bus_1 = 1; Load_Add_R = 1;
25


×