Thiết kế ALU đơn giản


8

Tôi cần thiết kế ALU với hai đầu vào 8 bit A và B và điều khiển đầu vào x, y và z hỗ trợ các hoạt động sau:

x  y  z  |  operation

0  0  0  |  S = A-B
0  0  1  |  S = A+B
0  1  0  |  S = A*8
0  1  1  |  S = A/8
1  0  0  | S = A NAND B (bitwise)
1  0  1  | S = A XOR B (bitwise)
1  1  0  | s = reverse the bits of A
1  1  1  | S = NOT A (bitwise)

Điều này được cho là được thực hiện với bộ cộng 8 bit và bộ mở rộng logic số học. Đọc qua sách giáo khoa của tôi, tôi thấy rằng mục đích của bộ mở rộng AL là thay đổi các bit đầu vào để một bộ cộng, chứ không phải là nhiều thành phần phụ, có thể được sử dụng để làm mọi thứ (hoặc ít nhất đó là những gì tôi hiểu từ nó ). Ví dụ, bộ mở rộng AL có thể đặt các bit trong phần bù của hai để bộ cộng thực hiện phép trừ. Tương tự như vậy, đối với các phép toán logic theo bit, các bit có thể được thay đổi một cách thích hợp và một trong các đầu vào của bộ cộng có thể bằng 0 để kết quả đạt được đúng.

Nhưng chính xác thì tôi làm gì về phép nhân? Cuốn sách của tôi rất mơ hồ, vì vậy tôi không chắc liệu một bộ mở rộng AL sẽ yêu cầu tôi làm điều gì đó thông minh để khiến trình bổ sung thực hiện công việc (chỉ cần thêm 8 lần trong trường hợp của tôi? ... ha ha), hoặc nếu tôi chỉ có thể ném một số nhân trong đó. Tôi sẽ phải đọc lên phân chia, nhưng tôi cá là nó tương tự như phép nhân.

Chà, dù sao, điểm mấu chốt vẫn là, phần mở rộng AL "được phép" là gì / có thể có trong đó là gì? Là mục đích duy nhất của nó để thay đổi đầu vào để nó có thể được cung cấp cho một bộ cộng?

* EDIT: Chà, nhân / chia cho 8, vì vậy điều này có thể dễ dàng thực hiện khi dịch chuyển sang trái hoặc phải bằng 3. Tôi vẫn có thể mở rộng AL thực sự / đúng nếu tôi thêm một số bộ chuyển đổi trong đó? (Có lẽ tôi đang xem xét điều này như một người mới bắt đầu hoàn chỉnh ...)


1
00011111 * 8 là gì? 00000000-00000111 là gì? Nếu bộ mở rộng AL của bạn dịch chuyển sang trái 3 lần cho mã op "010", thì nó có thể gán B thành 0 và sau đó gọi mã op "001" hoặc "000" trong ALU.
Tony Enni

Câu trả lời:


5

Cách tiếp cận đơn giản nhất là giải mã các đầu vào xyz thành tám dòng. Sau đó, từ đó, bạn triển khai logic điều khiển các dòng chọn chip để cho phép đơn vị thích hợp xử lý các đầu vào, cũng như mọi biến đổi cần thiết để đơn vị thực hiện thao tác chính xác.

Tôi không nghĩ rằng bạn có thể sử dụng một bộ cộng cho các hoạt động logic của mình bởi vì bộ cộng mang (trừ khi nó có một số đầu vào sẽ vô hiệu hóa hành vi truyền lan truyền). Nhưng bạn có thể có một đơn vị duy nhất để làm tất cả logic.

Có lẽ có một lý do tại sao họ gọi những ALU này, với A và L. riêng biệt :)

Nhân với 8 chỉ có nghĩa là lái các số không trên ba dòng đầu vào thấp nhất, bỏ qua ba dòng trên và ánh xạ dòng 0 đến dòng 3, 1 đến 4, v.v. Nó giống như một công tắc đường sắt.


6


××××

OK, có thể bạn không muốn điều đó; cổng logic khó khăn hơn nhiều. Giống Kaz nói bắt đầu với bộ giải mã 3 đến 8 để có tín hiệu duy nhất cho mỗi opcode. Bạn có thể thực hiện điều này với các cổng cơ bản, nhưng tôi khuyên bạn nên sử dụng 74HC238 để bắt đầu. Khi ALU hoạt động, bạn vẫn có thể thay thế HC238 bằng bộ sưu tập cổng.

Những gì bạn không muốn cho hệ số nhân là một thanh ghi thay đổi mà dịch chuyển sang trái 3 lần. Đó là chức năng đã đăng ký cần đồng hồ, thay vì chức năng kết hợp tạo ra kết quả ngay lập tức. (Lưu ý rằng Flash cũng tạo ra bất kỳ kết quả bằng nano giây, mặc dù chậm hơn so với logic kết hợp.) Có đường dẫn từ A0 đến Y3, A1 đến Y4, v.v., mà bạn kích hoạt với mã opcode được giải mã "010". Tương tự, Y3 sẽ được kết nối với A6 nếu tín hiệu "011" đang hoạt động (chia) và với A4 khi opcoe là "110" (đảo ngược bit). Điều đó có nghĩa là rất nhiều ghép kênh.

(*)



(*)

x  y  z  |  operation

0  0  0  |  S = A - B
0  0  1  |  S = A + B
0  1  0  |  S = shift left A by 1 bit
0  1  1  |  S = shift right A by 1 bit
1  0  0  |  S = A NAND B (bitwise)
1  0  1  |  S = A XOR B (bitwise)
1  1  0  |  S = rotate left A
1  1  1  |  S = NOT A (bitwise)

1

Tôi đã bị mắc kẹt trong cùng một vấn đề từ cùng một cuốn sách. May mắn thay, tôi tình cờ thấy chủ đề này đã cho tôi một ý tưởng phải làm gì. Kaz có một điểm rất tốt về việc lái các số không và các đường ánh xạ. Bộ mở rộng ALU trong cuốn sách này được thiết kế n (n đại diện cho số bit để vận hành) các thành phần tổ hợp giống hệt nhau nhưng tách biệt và một thành phần khác nhau để mang vào. Các thành phần này có năm đầu vào và hai đầu ra. Năm đầu vào là: 'X', 'Y', 'Z' (để chọn thao tác) và 'a', 'b' (các bit riêng lẻ của A và B có cùng tầm quan trọng). Tôi đoán ý tưởng ở đây là chia vấn đề thành các phần nhỏ hơn để có một bảng chân lý kích thước hợp lý. Đó là 5 đầu vào so với 8 + 8 + 3 = 19 đầu vào nếu bộ mở rộng chấp nhận tất cả các bit từ đầu vào điều khiển A và B cộng. Hiện nay, nếu phần mở rộng được sáng tác theo cách như vậy (19 đầu vào) tôi nghĩ logic cho phép nhân có thể được thực hiện trong thành phần đơn lẻ đó, nhưng viết một bảng chân lý cho điều này sẽ không còn nữa. Vì vậy, giải pháp của tôi là sử dụng các mux sau mỗi thành phần xử lý các bit riêng lẻ a và b giả sử rằng thành phần đó đã được thiết kế sao cho đầu vào XYZ = 010 chuyển 'a' bit không thay đổi và lọc ra 'b', đó là 'b' = 0. Mux nên có hai đầu vào, một từ thành phần trên và một từ thành phần ba vị trí bên phải. Ba mux ngoài cùng bên phải nên có số không làm đầu vào thứ hai. Một logic tổ hợp đơn giản với một cổng AND và hai bộ biến tần có thể đặt các mux khi XYZ = 010.

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.