Thiết kế CPU rất đơn giản trong LogiSim


8

Tôi hiện đang là học sinh trung học, và tôi đã quan tâm đến kỹ thuật điện / máy tính, đặc biệt là thiết kế bộ vi xử lý. Tôi đã đọc Code của Charles Petzold , và đã bắt đầu đọc Wikibook Thiết kế bộ vi xử lý (dường như chưa hoàn chỉnh.) Thông qua việc đọc Code , tôi hiểu logic cơ bản đằng sau CPU và đã bắt đầu xây dựng một trong LogiSim. Chương 17 trong Code chi tiết CPU tôi muốn xây dựng, nhưng các mạch thiếu các thành phần chính - tín hiệu đồng hồ và giải mã lệnh. Một số tín hiệu đồng hồ có vẻ khá rõ ràng (PC dường như cần tín hiệu đồng hồ ổn định) nhưng một số tín hiệu khác (như cách chốt giá trị RAM) tôi đã phải suy nghĩ và cố gắng làm việc.

Tôi có thể xây dựng một bộ tích lũy hoạt động (tôi không thể gọi chính xác là ALU, vì nó thiếu phần L) chuyển đổi giữa phép cộng và phép trừ với một đầu vào duy nhất và tôi hiểu đây là tất cả những gì tôi cần cho phần số học - một khi tôi nhận được các opcodes nhảy hoạt động, tôi có thể thực hiện phép nhân và chia trong mã. Phần tôi đang vật lộn với phần giải mã hướng dẫn. Thông qua một số tìm kiếm của google, tôi thấy rằng mỗi opcode cần được hiểu là nhiều vi lệnh, nhưng tôi không biết làm thế nào tôi cần nó để hoạt động. Hiện tại, bộ giải mã lệnh của tôi chỉ là một mạch phân tích kết hợp với đầu ra nhị phân duy nhất cho mỗi opcode - tất cả là 13.

Cách thức hoạt động của mã là nó có một giá trị mã 8 bit (tôi chỉ sử dụng byte cấp thấp) và sau đó hai giá trị địa chỉ 8 bit riêng biệt mà sau đó tôi kết hợp thành đầu vào địa chỉ 16 bit cho RAM. Để chốt các giá trị, tôi có một bộ đếm riêng đếm đến 10b và sau đó đặt lại thành 00b. Đây là đầu vào đồng hồ cho mỗi chốt lần lượt (đối với ba chốt, có a, b và c. Đồng hồ thứ hai có 1 trong khi b & c là 0, sau đó b là 1 và 1 & c là 0, sau đó b c là một và 1 & b là 0, sau đó nó đặt lại). Nhưng theo các hướng dẫn như ADD 000Ah, PC nhảy lên 000AH ... được cho là đã được thêm vào bộ tích lũy, nhưng thực sự bị khóa vào chốt mã, và sau đó được hiểu là opcode tiếp theo, khiến cho toàn bộ hoạt động khùng.

Tôi cảm thấy như mình đang thiếu một số thông tin lớn liên quan đến giải mã hướng dẫn và cách tôi cần thực hiện các tín hiệu đồng hồ ...

Dưới đây là các tập tin .circ LogiSim: https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdder.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdderSubtractor.circ https: // dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitInverter.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitLatch.circ https://dl.dropboxusercontent.com/16/16 ID.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/PetzoldMk5.circ

PetzoldMk5 là CPU chính, dựa trên các tệp khác được nhập dưới dạng thư viện.

Đây là danh sách các mã (tất cả nhị phân):

Load                 0001
Add                  0010
Add w/ Carry         0011
Sub                  0100
Sub w/ Borrow        0101
Jump                 0110
Jump w/ Carry        0111
Jump W/ 0            1000
Jump w/o C           1001
Jump W/o 0           1010
Store                1011
Halt                 1100
Reset                1101

1
Bạn có sẵn sàng chia sẻ tệp .circ CPU Logisim hiện tại của mình không? Và chỉ để làm cho cuộc sống phức tạp hơn một chút, bạn nên đọc và hiểu kỹ sự trợ giúp của Logisim, dưới tiêu đề "Tuyên truyền giá trị". Nếu bạn chưa, đã. (Bạn có thể đã, đã đưa ra tất cả các công việc bạn đã áp dụng. Rất vui khi biết bạn tiếp tục công việc này!)
jonk

@jonk cảm ơn vì những lời tốt đẹp. Chỉnh sửa bài đăng với các tệp .circ liên quan.
Will Hodges

Đó có phải là 6 tập tin không? (Tôi cho rằng đây là cho LogiSim 2.7.1, 2011?)
jonk

@jonk vâng, đó là, trên cả hai câu hỏi
Will Hodges

Làm thế nào bạn xử lý trừ? Bạn có sử dụng / Q từ một chốt đầu vào cho một trong các đầu vào A / B của ALU của bạn và sửa đổi phần mang theo không? Hoặc một số phương pháp khác?
jonk

Câu trả lời:


3

Ghét phải đăng một câu trả lời giống như "liên kết", nhưng tôi nghĩ bạn nên biết về Warren Toomey làm việc với CPU trong Logisim, vì đó có thể chính xác là những gì bạn đang tìm kiếm.

Anh ta có một vài hướng dẫn xây dựng CPU đơn giản hợp lý ở đây ...

http://minnie.tuhs.org/CompArch/Tutes/

Và nếu điều đó không làm nổi thuyền của bạn, anh ta có một CPU tinh vi hơn ở đây ...

http://minnie.tuhs.org/Programs/UcodeCPU/

... Tất cả đều được giải thích rõ ràng và có các tệp tải xuống .circ.


Một CPU / máy tính DIY tuyệt vời và có nhiều chức năng hơn là Magic-1 được tìm thấy tại http://www.homebrewcpu.com/ . Mặc dù nó không được thực hiện trong Logisim, nhưng nó được ghi lại khá tốt, bao gồm hình ảnh, sơ đồ, mô tả. Nó cũng không chỉ là một CPU trong một trình giả lập. Nó có trình biên dịch ANSI C, HĐH và một số phần mềm. Nó cũng có lợi thế khác biệt khi thực sự được xây dựng trong phần cứng. Trên thực tế, nó hiện đang hoạt động và đang phục vụ các trang web!


Cuối cùng, Các yếu tố của hệ thống máy tính và trang web liên quan nand2tetris.org xuất hiện dưới dạng tài nguyên thông tin được đề xuất số 1 để xây dựng máy tính của riêng bạn từ đầu mỗi khi tôi nhìn vào nó. Tôi tin rằng nhiều nội dung (Tất cả?) Là miễn phí. YouTube sẽ đồng ý; nhiều người đã thực hiện các dự án bắt đầu từ một nguồn này.


1
Xem video Youtbue của Ben Eater về việc xây dựng một máy tính bảng bánh mì 8 bit cũng rất hữu ích!
Francis Cugler

1

Tôi nghĩ rằng bạn đang thiếu một khía cạnh quan trọng trong cách ALU hoạt động. Thông thường, mỗi bit của bộ tích lũy được kết nối với từng khối chức năng khác nhau thông qua bộ khử kênh. Sử dụng một byte lệnh, hàm được chọn và mỗi bit của bộ tích lũy được kết nối với đầu vào thích hợp của khối chức năng. Kích thước của demultiplexer xác định ALU có thể xử lý bao nhiêu chức năng. Trong ví dụ rất thô sơ của tôi được hiển thị bên dưới, ALU có đầu vào 4 bit có thể tham chiếu 16 chức năng khác nhau bằng cách sử dụng bộ khử kênh:

Kết nối bộ tích lũy với các khối chức năng khác nhau trong ALU

Lưu ý rằng trong hầu hết các CPU, thiết kế này được tối ưu hóa thành một mớ cổng để giảm số lượng bóng bán dẫn.

Nhiều chức năng có thể được sử dụng bằng cách có một thanh ghi lệnh lớn hơn, nhưng điều này cũng đòi hỏi nhiều chu kỳ xung nhịp hơn để tải lệnh.

Tôi đặc biệt khuyên bạn nên đọc cuốn sách sau nếu bạn muốn tìm hiểu thêm về thiết kế kỹ thuật số: Nguyên tắc cơ bản của thiết kế logic lần thứ 7.


Câu trả lời này loại nhầm lẫn hướng dẫn với các hoạt động ALU. Cụ thể, bộ khử kênh này sẽ chỉ được sử dụng để chọn thao tác số học nào được chọn cho một lệnh số học. Bạn sẽ cung cấp bộ khử kênh với 3 bit trong lệnh 8 bit để chọn thao tác số học. Bạn cần một cơ chế hoàn toàn riêng biệt để giải mã và hướng dẫn trình tự nói chung. Bên cạnh đó, hầu hết các CPU mà tôi đã xem xét không sử dụng bộ khử kênh như thế này trong ALU, mà sử dụng một mớ cổng được tối ưu hóa để thực hiện thao tác đúng.
Ken Shirriff

1
@KenShirriff Tôi đã thực hiện một số thay đổi cho rõ ràng. Hãy thoải mái thực hiện một số chỉnh sửa khi bạn thấy phù hợp.
Takide

1

Có vẻ như bạn đang đi đúng hướng.

Khi bạn đang lập kế hoạch cho các hướng dẫn vi mô của mình, bạn sẽ cần xác định rõ ràng trong tâm trí của chính bạn mẫu "lưu lượng truy cập" cho chuyển động dữ liệu của bạn thông qua các khối khác nhau của bạn. Thực hiện THÊM sẽ yêu cầu nhiều bước. Nếu bạn đã giữ các thanh ghi cho hai toán hạng ALU của mình thì chúng sẽ cần được tải từ RAM, hoặc một số thanh ghi hoặc bus. Nếu bạn có một xe buýt nội bộ được chia sẻ thì bạn có thể cần phải tải một toán hạng tại một thời điểm. Khi bạn biết byte nào (địa chỉ, nghĩa đen, dữ liệu RAM, con trỏ) cần di chuyển ở đâu, lập kế hoạch thứ tự chuyển động của byte thông qua (các) bus vào và ra khỏi các thanh ghi khác nhau. Bạn có thể bị kẹt và cần thêm một thanh ghi giữ nội bộ vì một số giá trị trung gian phải được bảo toàn cho đến bước hướng dẫn vi mô tiếp theo.

Tôi nghĩ điều bạn nghi ngờ là thiếu sự phức tạp cần thiết cho logic để lấy hướng dẫn hoặc opcode và dịch nó sang nhiều trạng thái bên trong CPU của bạn. Nó có thể phức tạp, nhưng có thể tạo ra một máy trạng thái hơi đơn giản sau đó mở rộng trên đó với các khái niệm logic cơ bản.

Ví dụ: giả sử bạn đang tạo các bước hướng dẫn vi mô cho thao tác MOVE. Điều đó có thể được mô tả một cách lỏng lẻo theo 3 bước: 1) Khẳng định nội dung thanh ghi nguồn trên xe buýt nội bộ, 2) nhấp vào đồng hồ ghi của thanh ghi đích, 3) Khẳng định nội dung thanh ghi nguồn từ bus nội bộ. Các bước 1) đến 3) mô tả thời gian cho phép kích hoạt đầu ra đăng ký (OE) và kích hoạt ghi ghi (WE) có thể được phân phối chọn lọc tới bất kỳ thanh ghi nguồn nào và bất kỳ thanh ghi đích nào được kết nối với bus nội bộ được chia sẻ với bộ khử kênh.

Nếu bạn không có nhiều thực hành tạo Máy trạng thái hữu hạn, có thể hữu ích khi xem xét các cách tiếp cận khác nhau để cung cấp cho bạn một khối xây dựng khác để tạo ra các tín hiệu điều khiển từ trình sắp xếp chuỗi vi mô của bạn.

Gắn bó với nó. Lượng kiến ​​thức bạn có được sẽ là phi thường. Và hy vọng bạn sẽ có nhiều niềm vui.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.