Báo cáo bài tập lớn môn kiến trúc máy tính đỀ TÀI: thiết kế MÁy tính 8-bit



Download 0.96 Mb.
Page5/6
Date26.10.2023
Size0.96 Mb.
#62404
1   2   3   4   5   6
Bao cao ktmt Long K23A
Bao cao kien truc may tinh
Các tín hiệu đến khối điều khiển

  • Clock tín hiệu từ mạch tạo dao động.

  • Mã lệnh từ thanh ghi đưa đến CU để giải mã.

  • Các trạng thái cờ đưa đến cho biết trạng thái của CPU cũng như trạng thái thực hiện các phép tính toán trong ALU.

  • Các tín hiệu điều khiển từ BUS điều khiển.

  • Các tín hiệu điều khiển bên trong CPU: điều khiển thanh ghi, ALU.

  • Các tín hiệu điều khiển bên ngoài CPU: đó là bộ nhớ hay cổng vào ra.

  1. ROM (Read Only Memory)

  • Bộ nhớ chỉ đọc - là loại bộ nhớ trong đó dữ liệu đã được ghi vào từ trước và chứa các chương trình giúp máy tính "khởi động". Khác với RAM sẽ xóa sạch mọi dữ liệu lưu trữ tạm thời, ROM giữ lại nội dung ngay cả sau khi máy đã tắt; đó chính là lý do máy tính có thể được bật lên ở lần đầu tiên sử dụng. Nếu không có ROM, việc khởi động được hệ thống sẽ là một điều xa xỉ.




Khối ROM



  1. Output

Thanh ghi đầu ra () tương tự như bất kỳ thanh ghi nào khác như thanh ghi A và B, ngoại trừ việc nó đã được nối với LED 7 đoạn để hiển thị nội dung của nó ở dạng nhị phân trên 8 đèn LED. Nội dung của nó ở dạng thập phân trên màn hình 7 đoạn.


Sơ đồ tạo khối Out Register

Sơ đồ cấu tạo khối O Register


8. Các tập lệnh:
Máy tính là một đống phần cứng vô dụng cho đến khi ai đó lập trình nó. Trước bạn có thể lập trình một máy tính, tuy nhiên, bạn phải học tập lệnh, các hoạt động cơ bản mà nó có thể thực hiện. Các từ trong bộ nhớ có thể được ký hiệu là R0, R1, R2, ctc. Điều này có nghĩa là R0 được lưu trữ tại địa chỉ OH, R1 tại địa chỉ IH, R2 tại địa chỉ 2H,…


*LDA:
LDA là viết tắt của "load the accumulator". Hoàn thành lệnh LDA bao gồm địa chỉ thập lục phân của dữ liệu được tải.
VD: LDA 8H : "tải thanh ghi với nội dung của vị trí bộ nhớ 8H".
Nếu R8 = 1111 0000 -> A = 1111 0000


*ADD:
Nghĩa là thêm nội dung của bộ nhớ đến nội dung thanh ghi tổng thay thế nội dung ban đầu của thanh ghi.

VD: ADD 9H : “thêm nội dung của bộ nhớ vị trí 9H đến nội dung thanh ghi”


A = 0000 0010
R9= 0000 0011
Khi thực hiện lệnh ADD 9H , R9 sẽ được nạp vào thanh ghi B -> B = 0000 0011
->SUM = A + B = 0000 0101
Sau đó tổng này sẽ được ghi vào thanh ghi và có kết quả : A = 0000 0101


*SUB:
Nghĩa là trừ nội dung của vị trí bộ nhớ từ nội dung của bộ tích lũy
Sự khác biệt của bộ cộng-trừ sau đó thay thế nội dung ban đầu của bộ tích lũy

VD: SUB CH : "trừ nội dung của vị trí bộ nhớ CH từ nội dung của bộ tích lũy


A = 0000 0111
Rc = 0000 0011

Khi thực hiện lệnh SUB CH , Rc sẽ được nạp vào thanh ghi B -> B = 0000 0011



  • DIFF = 0000 0100

Kết quả này sẽ được nạp vào bộ tích lũy -> A= 0000 0100




*OUT:
Lệnh OUT nói với máy tính để chuyển nội dung bộ tích lũy đến cổng đầu ra. Sau khi OUT có được thực thi, bạn có thể thấy câu trả lời cho vấn đề đang đã giải quyết.
OUT là hoàn thành của chính nó; nghĩa là, bạn không cần phải bao gồm một địa chỉ khi sử dụng OUT

* STA


STA là một cách ghi nhớ để lưu trữ bộ tích lũy. Mỗi chỉ dẫn STA cần một địa chỉ. STA 7FFFH có nghĩa là lưu trữ nội dung bộ tích lũy tại vị trí bộ nhớ 7FFFH.
VD: A = 8AH
việc thực thi STA 7FFFH lưu trữ 8AH tại địa chỉ 7FFFH.

*LDI


LDI là cách ghi nhớ để di chuyển ngay lập tức. Nó nói với máy tính để tải một thanh ghi được chỉ định với byte ngay sau mã op.
Ví dụ: MVI A, 37H : yêu cầu máy tính tải bộ tích lũy với 37H
Bạn có thể sử dụng LDI với các thanh ghi A và B. Các định dạng cho những hướng dẫn này là
LDI A, ----byte
LDI B, ----byte

* JMP


Để bắt đầu, JMP là cách ghi nhớ của jump; nó nói với máy tính để nhận hướng dẫn tiếp theo từ vị trí bộ nhớ. Mỗi lệnh JMP bao gồm một địa chỉ được tải vào bộ đếm chương trình. Ví dụ,
JMP 3000H


  1. Nhảy không điều kiện

  1. Nhảy có điều kiện

Đây là những gì sẽ xảy ra. Giả sử JMP 3000H được lưu trữ tại 2005H hình a. Vào cuối tìm nạp chu kỳ, bộ đếm chương trình chứa


PC = 2006H
Trong chu kỳ thực thi, JMP 3000H tải bộ đếm với địa chỉ được chỉ định:
PC = 3000H
Khi chu kỳ tìm nạp tiếp theo bắt đầu, hướng dẫn tiếp theo đến từ 3000H chứ không phải 2006H (xem hình 3.7a).

* JZ


Flag khác bị ảnh hưởng bởi các hoạt động của bộ tích lũy là flag số 0. Trong quá trình thực hiện một số hướng dẫn, bộ tích lũy sẽ trở thành số 0. Để ghi lại sự kiện này, flag số 0 được thiết lập; nếu nội dung của bộ tích lũy không đi đến số 0, flag số 0 được đặt lại. Nói một cách trừu tượng:

#define SHIFT_DATA 2
#define SHIFT_CLK 3
#define SHIFT_LATCH 4
#define EEPROM_D0 5
#define EEPROM_D7 12
#define WRITE_EN 13

#define HLT 0b1000000000000000 // Halt clock


#define MI 0b0100000000000000 // Memory address register in
#define RI 0b0010000000000000 // RAM data in
#define RO 0b0001000000000000 // RAM data out
#define IO 0b0000100000000000 // Instruction register out
#define II 0b0000010000000000 // Instruction register in
#define AI 0b0000001000000000 // A register in
#define AO 0b0000000100000000 // A register out
#define EO 0b0000000010000000 // ALU out
#define SU 0b0000000001000000 // ALU subtract
#define BI 0b0000000000100000 // B register in
#define OI 0b0000000000010000 // Output register in
#define CE 0b0000000000001000 // Program counter enable
#define CO 0b0000000000000100 // Program counter out
#define J 0b0000000000000010 // Jump (program counter in)

uint16_t data[] = {


MI|CO, RO|II|CE, 0, 0, 0, 0, 0, 0, // 0000 - NOP
MI|CO, RO|II|CE, IO|MI, RO|AI, 0, 0, 0, 0, // 0001 - LDA
MI|CO, RO|II|CE, IO|MI, RO|BI, EO|AI, 0, 0, 0, // 0010 - ADD
MI|CO, RO|II|CE, IO|MI, RO|BI, EO|AI|SU, 0, 0, 0, // 0011 - SUB
MI|CO, RO|II|CE, IO|MI, AO|RI, 0, 0, 0, 0, // 0100 - STA
MI|CO, RO|II|CE, IO|AI, 0, 0, 0, 0, 0, // 0101 - LDI
MI|CO, RO|II|CE, IO|J, 0, 0, 0, 0, 0, // 0110 - JMP
MI|CO, RO|II|CE, 0, 0, 0, 0, 0, 0, // 0111
MI|CO, RO|II|CE, 0, 0, 0, 0, 0, 0, // 1000
MI|CO, RO|II|CE, 0, 0, 0, 0, 0, 0, // 1001
MI|CO, RO|II|CE, 0, 0, 0, 0, 0, 0, // 1010
MI|CO, RO|II|CE, 0, 0, 0, 0, 0, 0, // 1011
MI|CO, RO|II|CE, 0, 0, 0, 0, 0, 0, // 1100
MI|CO, RO|II|CE, 0, 0, 0, 0, 0, 0, // 1101
MI|CO, RO|II|CE, AO|OI, 0, 0, 0, 0, 0, // 1110 - OUT
MI|CO, RO|II|CE, HLT, 0, 0, 0, 0, 0, // 1111 - HLT
};
/*
* Output the address bits and outputEnable signal using shift registers.
*/
void setAddress(int address, bool outputEnable) {
shiftOut(SHIFT_DATA, SHIFT_CLK, MSBFIRST, (address >> 8) | (outputEnable ? 0x00 : 0x80));
shiftOut(SHIFT_DATA, SHIFT_CLK, MSBFIRST, address);

digitalWrite(SHIFT_LATCH, LOW);


digitalWrite(SHIFT_LATCH, HIGH);
digitalWrite(SHIFT_LATCH, LOW);
}
/*
* Read a byte from the EEPROM at the specified address.
*/
byte readEEPROM(int address) {
for (int pin = EEPROM_D0; pin <= EEPROM_D7; pin += 1) {
pinMode(pin, INPUT);
}
setAddress(address, /*outputEnable*/ true);

byte data = 0;


for (int pin = EEPROM_D7; pin >= EEPROM_D0; pin -= 1) {
data = (data << 1) + digitalRead(pin);
}
return data;
}
/*
* Write a byte to the EEPROM at the specified address.
*/
void writeEEPROM(int address, byte data) {
setAddress(address, /*outputEnable*/ false);
for (int pin = EEPROM_D0; pin <= EEPROM_D7; pin += 1) {
pinMode(pin, OUTPUT);
}

for (int pin = EEPROM_D0; pin <= EEPROM_D7; pin += 1) {


digitalWrite(pin, data & 1);
data = data >> 1;
}
digitalWrite(WRITE_EN, LOW);
delayMicroseconds(1);
digitalWrite(WRITE_EN, HIGH);
delay(10);
}
/*
* Read the contents of the EEPROM and print them to the serial monitor.
*/
void printContents() {
for (int base = 0; base <= 255; base += 16) {
byte data[16];
for (int offset = 0; offset <= 15; offset += 1) {
data[offset] = readEEPROM(base + offset);
}

char buf[80];


sprintf(buf, "%03x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
base, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7],
data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15]);

Serial.println(buf);


}
}
void setup() {
// put your setup code here, to run once:
pinMode(SHIFT_DATA, OUTPUT);
pinMode(SHIFT_CLK, OUTPUT);
pinMode(SHIFT_LATCH, OUTPUT);
digitalWrite(WRITE_EN, HIGH);
pinMode(WRITE_EN, OUTPUT);
Serial.begin(57600);

// Program data bytes


Serial.print("Programming EEPROM");

// Program the 8 high-order bits of microcode into the first 128 bytes of EEPROM


for (int address = 0; address < sizeof(data)/sizeof(data[0]); address += 1) {
writeEEPROM(address, data[address] >> 8);

if (address % 64 == 0) {


Serial.print(".");
}
}

// Program the 8 low-order bits of microcode into the second 128 bytes of EEPROM


for (int address = 0; address < sizeof(data)/sizeof(data[0]); address += 1) {
writeEEPROM(address + 128, data[address]);

if (address % 64 == 0) {


Serial.print(".");
}
}

Serial.println(" done");


// Read and print out the contents of the EERPROM
Serial.println("Reading EEPROM");
printContents();
}
void loop() {


Download 0.96 Mb.

Share with your friends:
1   2   3   4   5   6




The database is protected by copyright ©ininet.org 2024
send message

    Main page