Tải bản đầy đủ - 0 (trang)
4 Tập lệnh của RISC SPM

4 Tập lệnh của RISC SPM

Tải bản đầy đủ - 0trang

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 hồ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



WR*



0110_src_??



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

của thanh ghi nguồn là don’t

care

Ghi nội dung của thanh ghi



none



dest<=src+dest

dest<=dest-src

dest<=src&&dest



dest<=~src



dest<=memory[Add_R]



memory[Add_R]<=src

18



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



19



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



20



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



21



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

22



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)



23



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;

24



end // BR

BRZ: if (zero == 1)

begin

next_state = S_br1;

Sel_PC = 1; Sel_Bus_1 = 1; Load_Add_R = 1;

end // BRZ

else

begin

next_state = S_fet1;

Inc_PC = 1;

end

default :

next_state = S_halt;

endcase // (opcode)

S_ex1:

begin

next_state = S_fet1;

Load_Reg_Z = 1;

Sel_ALU = 1;

case (dest)

R0: begin Sel_R0 = 1; Load_R0 = 1; end

R1: begin Sel_R1 = 1; Load_R1 = 1; end

R2: begin Sel_R2 = 1; Load_R2 = 1; end

R3: begin Sel_R3 = 1; Load_R3 = 1; end

default : err_flag = 1;

endcase

end

S_rd1:

next_state = S_rd2;

Sel_Mem = 1;

Load_Add_R = 1;

Inc_PC = 1;

end



begin



S_wr1:

next_state = S_wr2;

Sel_Mem = 1;

Load_Add_R = 1;

Inc_PC = 1;

end



begin



25



S_rd2:

next_state = S_fet1;

Sel_Mem = 1;

case (dest)

R0:

R1:

R2:

R3:

default :

endcase

end

S_wr2:

next_state = S_fet1;

write = 1;

case (src)

R0:

R1:

R2:

R3:

default :

endcase

end

S_br1:

Load_Add_R = 1; end

S_br2:

Load_PC = 1; end

S_halt:

default:

endcase

end



begin



Load_R0 = 1;

Load_R1 = 1;

Load_R2 = 1;

Load_R3 = 1;

err_flag = 1;



begin



Sel_R0 = 1;

Sel_R1 = 1;

Sel_R2 = 1;

Sel_R3 = 1;

err_flag = 1;



begin next_state = S_br2; Sel_Mem = 1;

begin next_state = S_fet1; Sel_Mem = 1;

next_state = S_halt;

next_state = S_idle;



26



2.6 Mô phỏng RISC SPM

2.6.1 Tổng quan phần mô phỏng

Để mô phỏng RISC SPM cần xung đồng hồ và một tín hiệu reset, ta sẽ tạo

xung đồng hồ trong module Clock_Unit. Ngoài ra ta cũng khởi tạo memory trong file

testbench với các dữ liệu nhập theo địa chỉ trong memory.



2.6.2 Thiết kế file testbench

2.6.2.1 Thiết kế module Clock_Unit

Module này tạo ra xung clock với chu kì 20ns, sử dụng lệnh forever.

`timescale 1ns / 1ns

module Clock_Unit (clock);

output clock;

reg clock;

parameter delay = 0;

parameter half_cycle = 10;

initial begin

#delay clock = 0;

forever #half_cycle clock = ~clock;

end

endmodule

2.6.2.2 Thiết kế file testbench

Trong file testbench chắc chắn cần có 2 tín hiệu reset và clock, và một biến k 9

bit để lát nữa sử dụng. Sau khi thực hiện 2 module Clock_Unit M1 và RISC_SPM M2,

ta thực hiện file testbench như sau:

-



Reset mạch 1 lần lúc đầu, khởi tạo tất cả các ô nhớ trong memory bằng 0 (sử

dụng vòng lặp for với biến chạy k từ 0 đến 255)



27



-



Các memory có địa chỉ từ 0 đến 14, từ 128 đến 140 được gán giá trị như trong

testbench với mục đích được ghi bên cạnh

Bên dưới là code Verilog phần khởi tạo memory:



initial begin

#2 rst = 0; for (k=0;k<=255;k=k+1)M2.M2_SRAM.memory[k] = 0; #10 rst = 1;end

initial begin

// Load program

#5

// opcode_src_dest

M2.M2_SRAM.memory[0] = 8'b0000_00_00;

// NOP

M2.M2_SRAM.memory[1] = 8'b0101_00_10;

// Read 130 to R2

M2.M2_SRAM.memory[2] = 130;

M2.M2_SRAM.memory[3] = 8'b0101_00_11;

// Read 131 to R3

M2.M2_SRAM.memory[4] = 131;

M2.M2_SRAM.memory[5] = 8'b0101_00_01;

// Read 128 to R1

M2.M2_SRAM.memory[6] = 128;

M2.M2_SRAM.memory[7] = 8'b0101_00_00;

// Read 129 to R0

M2.M2_SRAM.memory[8] = 129;

M2.M2_SRAM.memory[9] = 8'b0010_00_01;



// Sub R1-R0 to R1



M2.M2_SRAM.memory[10] = 8'b1000_00_00;

M2.M2_SRAM.memory[11] = 134;



// BRZ

// Holds address for BRZ



M2.M2_SRAM.memory[12] = 8'b0001_10_11;

M2.M2_SRAM.memory[13] = 8'b0111_00_11;

M2.M2_SRAM.memory[14] = 140;



// Add R2+R3 to R3

// BR



//M2.M2_SRAM.memory[13] = 8'b0110_11_00;

//M2.M2_SRAM.memory[14] = 131;

//M2.M2_SRAM.memory[15] = 8'b0110_01_00;

//M2.M2_SRAM.memory[16] = 128;



// WR R3 to memory

// WR R1 to memory



// Load data

M2.M2_SRAM.memory[128] = 6;

M2.M2_SRAM.memory[129] = 1;

M2.M2_SRAM.memory[130] = 2;

M2.M2_SRAM.memory[131] = 0;

M2.M2_SRAM.memory[134] = 139;

28



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

4 Tập lệnh của RISC SPM

Tải bản đầy đủ ngay(0 tr)

×