Hình 5- 9: Bộ nhớ Stack

Một phần của tài liệu thiết kế trên kít FPGA DE2 của Altera (Trang 68 - 74)

- clk: ựầu vào xung nhịp ựược ựồng bộ hóa với clock của hệ thống. - push: Nếu giải mã lệnh là lệnh call, thì ựến bước ba trong quá

trình thực hiện lệnh CALL, bước thực thi lệnh, ựầu vào này ựược ựặt lên 1 ựể ghi ựịa chỉ lệnh ngay sau lệnh CALL trong chương trình chắnh vào stack (push).

- Din[10..0] dữ liệu ựưa vào khi thực hiện push.

- Pop: Nếu giải mã lệnh là lệnh RETLW, thì sau khi giải mã lệnh ựặt ựầu vào này lên 1 ựể lấy ựịa chỉ lệnh tương ứng trong stack ra. - Dout[10..0]: địa chỉ lệnh ựọc ựược khi thực hiện pop.

5.3 Thit k b> mô ph?ng h thEng t= ự>ng.

Việc mô phỏng toàn bộ hệ thống rất phức tạp, ựòi hỏi rất nhiều trường hợp mô phỏng khác nhau (cần rất nhiều testcase) ựể có thể bao trùm toàn bộ các trường hợp có thể xảy ra trên hệ thống. Như vậy ựể ựảm bảo rằng một hệ thống sau khi

thiết kế không có lỗi ựòi hỏi quy trình kiểm tra, chạy thử hệ thống rất phức tạp và thường tốn rất nhiều thời gian. Việc thiết kế một hệ thống kiểm tra chương trình tự ựộng là rất cần thiết trong thiết kế một hế thống lớn. Trong luận văn này tác giả xây dựng hệ thống mô phỏng hệ thống như sau:

- Viết chương trình nguồn bằng ngôn ngữ Assembler dựa trên tập lệnh của vi xử lý.

- Dùng trình dịch ựể dịch chương trình sang dạng Hexa, ở bước này thường ta phải phát triển một trình dịch ựể dịch từ mã Assembler sang mã máy (dạng Hexa) nhưng như ựã ựược trình bày ở các phần trên, nếu làm như vậy sẽ rất mất thời gian vào việc thiết kế một chương trình dịch (compiler) trong khi mục ựắch chắnh của tác giả là tập trung vào thiết kế một nhân vi xử lý. Do vậy tác giả ựã sử dụng trình dịch của Microchip ựể dịch chương trình từ mã assembler sang mã máy.

- Khi sử dụng trình dịch của Miccrochip ựể dịch chương trình sang mã máy, mã chương trình sẽ ựược lưu trữ trong một file (thuật ngữ thường dung là Hex file) theo như ựịnh dạng của Intel. Do ựịnh dạng của file chứa mã chương trình của Mento Graphic khác với ựịnh dạng của Intel do ựó tác giả ựã viết một chương trình ựể tự ựộng chuyển ựổi ựịnh dạng file hex của Intel sang ựịnh dạng của Mento Graphic.

- Tạo một thể hiện của hệ vi xử lý trên môi trưởng mô phỏng.

- Khởi tạo một vùng nhớ RAM ựể lưu trữ chương trình cần chạy trên chip FPGA, ựoạn mã tạo vùng nhớ ựể lưu trữ chương trình như sau:

`timescale 1ns / 10ps

module prog_mem ( clk, address, we, din, dout );

input clk;

input [10:0] address; //11 bits address for

instruction

input we;

input [11:0] din; //input

output [11:0] dout;

parameter depth = 2048; reg [10:0] addr_r;

reg [11:0] mem[0:depth-1]; //Declare program memory

always @(posedge clk) addr_r <= address;

assign dout = mem[addr_r]; always @(posedge clk)

if (we) mem[address] <= din; endmodule

để có thể mô phỏng ựược hệ vi xử lý, ta cần viết một testbench thực hiện những nhiệm vụ sau:

- Tạo xung nhịp clock ựể ựưa vào bộ vi xử lý:

always #10 clk = ~clk; always #20 tcki = ~tcki;

- Tạo một thể hiện của CPU ựể thực hiện test, công việc này trong thuật ngữ của thiết kế một hệ thống LSI gọi là tạo DUT (Device Under Test).

// Instantiate one CPU to be tested. mrisc u0( .clk (clk), .rst_in (reset), .inst_addr (inst_addr), .inst_data (inst_data), .portain (portain), .portbin (portbin), .portcin (portcin), .portaout (portaout), .portbout (portbout), .portcout (portcout), .trisa (trisa), .trisb (trisb), .trisc (trisc), .tcki (tcki), .wdt_en (1'b1) );

- Tạo một thể hiện bộ nhớ chương trình: (adsbygoogle = window.adsbygoogle || []).push({});

// Instantiate the Program RAM. prog_mem u1 (

.clk (clk), .address (inst_addr),

.we (1'b0), // This testbench

doesn't allow writing to PRAM

.din (12'b000000000000), // This

testbench doesn't allow writing to PRAM

.dout (inst_data)

);

để có thể thực hiện mô phỏng ựược hệ vi xử lý, ta cần phải load chương trình xuống vùng nhớ mô phỏng này giống như cách download chương trình xuống vùng nhớ EEPROM cho vi ựiều khiển. Ngôn ngữ verilog cho phép ta ựọc một file nhị phân và gán các giá trị trong file ựó tới bộ nhớ cần ghi dữ liệu lên. Vắ dụ

Lệnh:

$readmemh ("./scode/testport.rom", u0.mem)

Cho phép ta ựọc lệnh trong hexa file testport.rom và ghi vào vùng nhớ mem của bộ nhớ chương trình (prog_mem).

đến ựây ta có thể thực hiện mô phỏng ựể kiểm tra chức năng của rất nhiều khối của vi xử lý.

- Chương trình mô phỏng Model Sim cho phép ta chạy chương trình mô phỏng trong một khoảng thời gian nhất ựịnh, như vậy cho phép ta chạy từng bước chương trình và kiểm tra trạng thái các khối chức năng của Datapath cũng như những tắn hiệu của khối ựiều khiển. đến ựây ta có quy trình ựể mô phỏng kiểm tra chức năng của từng module trong bộ vi xử lý như sau:

o Xác ựịnh module trong vi xử lý cần kiểm tra

o Viết một chương trình Assembler nhỏ mà chắc chắn rằng khi chạy chương trình ựó sẽ ảnh hưởng (thay ựổi) trạng thái của module ựó.

o Dịch ựoạn mã Assembler ựó sang mã máy và chuyển ựịnh dạng của Hex file sang ựịnh dạng của Model Sim.

o Tải chương trình Testbench vừa viết vào Model Sim

o Thực hiện chạy từng bước chương trình và kiểm tra trạng thái của module mong muốn.

- Chương trình mô phỏng Model Sim cùng với Teschbench vừa thiết kế cũng cho phép ta chạy một chương trình lớn hơn và in kết quả ra một log file ựể kiểm tra kết quả, phương pháp mô phỏng này sẽ cho phép ta mô phỏng ựược nhiều chức năng của vi xử lý hơn và quá trình mô phỏng, kiểm tra kết quả sẽ nhanh hơn. Quy trình này như sau:

o Viết một chương trình nhỏ thực hiện một chức năng xác ựịnh bằng ngôn ngữ Assembler, dịch chương trình và chuyển ựịnh dạng của Hex file sang ựịnh dạng của Model Sim.

o Tải chương trình vừa viết vào Model Sim

o Thực hiện chạy chương trình và kiểm tra kết quả ựầu ra, kết quả ựầu ra có thể là kết quả hiển thị trên các ựến LED hoặc hiển thị trên LED 7 ựoạn, màn hình LCD. Trong phần cuối của luận văn này, tác giả trình bày một vắ dụ sử dụng vi xử lý ựể ựiểu khiển, hiển thị lên màn hình LCD.

5.4 Mô ph?ng vi ựiu khi8n th=c hi n m>t ựo+n chF$ng trình ự$n gin, ki8m tra ch*c năng các module trong vi ựiu khi8n.

Phần này sẽ mô phỏng vi ựiều khiển thực hiện chương trình thực hiện một ựoạn chương trình ngắn và kiểm tra chức năng của các mô ựun trong vi ựiều khiển bằng phần mềm ModemSim. Chương trình trong phần này sẽ thực hiện ựoạn chương trình ựơn giản: out ra cổng B của vi ựiều khiển các giá trị 0x00 và 0xff. Chương trình này tuy ựơn giản nhưng giúp ta kiểm tra ựược hoạt ựộng của bộ nhớ chương trình, bộ ựếm chương trình, register file, ALU, lệnh gotoẦ Các lệnh tương ứng và mã nhị phân tương ứng (mã máy) của chương trình như sau:

;This program is simple test and will out put 0xff and 0x00 to portB list p=16c57 #include p16c5x.inc main: clrw ;@000 040 tris PORTB ;@006 006 MOVLW 0xff ; CFF

movwf PORTB ;@003 026 movlw 0x00 ; movwf PORTB ;026 goto main nop END

Mã assembler địa chỉ lệnh Mã nhị phân Mô tả lệnh

clrw 000 040 Xóa thanh ghi W

tris PORTB 001 006 Xóa thanh ghi trisB (adsbygoogle = window.adsbygoogle || []).push({});

MOVLW 0xff 002 CFF Nạp FF vào W

Movwf PORTB 003 026 PORTB = W

movlw 0x00 004 C00 Nạp 0x00 vào W

movwf PORTB 005 026 PORTB = W

goto main 006 A00 Nhảy tới ựịa chỉ 0x000 (main)

nop 007 000 NOP

Bảng 5 - 2: Mã nguồn chương trình ựược mô phỏng.

Sau khi nạp chương trình, vào bộ mô phỏng ModeSim, thực hiện chạy chương trình ta có kết quả như sau:

5. 4.1 Kết quả mô phỏng kiểm tra chức năng của PC và bộ nhớ chương trình (hình 5-10).

Clk: đầu vào xung nhịp ựồng hồ ựưa vào vi ựiều khiển. Portb: giá trị của thanh ghi PORTB

Trisb: Giá trị của thanh ghi TRISTB

Inst_addr: địa chỉ lệnh tiếp theo, giá trị của thanh ghi PC

Inst_data: Từ lệnh,Giá trị của lệnh ựọc ựược từ bộ nhớ chương trình.

Như trên hình 5-10 ta thấy inst_addr chắnh là giá trị của thanh ghi PC tự ựộng tăng lên một ựơn vị sau mỗi sườn dương của xung nhịp clock.

7 4 H

Một phần của tài liệu thiết kế trên kít FPGA DE2 của Altera (Trang 68 - 74)