Làm thế nào là số nguyên không dấu được thực hiện trong phần cứng?


10

Tôi đang làm việc trên một thiết kế bao gồm rất nhiều hàm max (và các hàm max làm đối số cho các hàm max khác).

Trong một nỗ lực để đơn giản hóa thiết kế phần cứng, tôi đã tự hỏi làm thế nào tối đa được thực hiện trong phần cứng?

Về mặt toán học, Max (a, b) có thể được biểu diễn dưới dạng [(a + b) + abs (b - a)] / 2.

Đây có phải là cách nó được thực hiện trong phần cứng? (tức là trong các giai đoạn; bổ sung, phân chia bit, v.v.)

Nếu vậy, sự khác biệt tuyệt đối được tính như thế nào?

Câu trả lời:


10

Một cách tiếp cận rất đơn giản sẽ là thực hiện (a> b)? A: b. a> b có thể được thực hiện bằng cách bắt đầu ở bên trái và kiểm tra từng cặp bit của (a, b):

  • cả 0 hoặc cả 1: tiếp tục đến cặp thấp hơn tiếp theo
  • a là 1: a là cao nhất; b là 1: b là cao nhất

Khi bạn biết cái nào cao nhất, bạn có thể chọn cái đó bằng mux 2N-> N.

Với một số mẹo thông minh, việc kiểm tra các cặp bit có thể được kết hợp với muxer cho cùng một cặp bit.


2

Hãy xem xét thuật toán trong câu hỏi:

[(a + b) + abs(b - a)]/2

Điều này có một giai đoạn cộng và trừ sau đó được đưa vào bổ sung giai đoạn thứ hai. Việc chia cho 2 là không đáng kể trong phần cứng, nó có thể được thực hiện bằng cách loại bỏ LSB. Tuy nhiên, bộ cộng / trừ toàn bộ hai giai đoạn khá chậm và thâm dụng cổng, đặc biệt nếu bạn xếp tầng nhiều caparis như bạn.

Dựa trên câu trả lời của Wouter van Ooijen, cấu trúc tổng quát là một bộ so sánh kỹ thuật số cung cấp tín hiệu chọn lọc của mux:

sơ đồ

mô phỏng mạch này - Sơ đồ được tạo bằng CircuitLab

Các sơ đồ trên là dành cho:

(A > B) ? A : B

nhưng lưu ý rằng nó có thể được cấu hình lại dễ dàng cho bất kỳ so sánh giữa hai đầu vào bằng cách thực hiện các kết nối logic khác nhau giữa đầu ra so sánh và chọn mux.

Vì vậy, nếu chúng ta biết cách xây dựng ba đầu ra từ bộ so sánh, chúng ta có thể thực hiện bất kỳ so sánh nào trong phần cứng. Logic so sánh được mô tả tốt ở đây . Để tối ưu hóa phần cứng, chúng tôi sẽ chỉ loại bỏ logic điều khiển các đầu ra so sánh không sử dụng.

Nhưng cuối cùng, nếu nó đi vào phần cứng, nó phải trải qua quá trình tổng hợp. Vì vậy, bạn không nên ám ảnh về sơ đồ cấp cổng nào là tối ưu. Thay vào đó, hãy tối ưu hóa mã và thuật toán của bạn để ít nhất bạn không buộc bộ tổng hợp tạo ra kết quả không hiệu quả. "Với một số mẹo thông minh, việc kiểm tra các cặp bit có thể được kết hợp với muxer cho cùng một cặp bit", và cách dễ nhất để thực hiện tối ưu hóa này là tổng hợp.


1

Nếu bạn thực sự muốn xây dựng một mạch chuyên dụng để tính toán max, bạn có thể bắt đầu với một khối cơ bản với các phương trình sau:

ETôi,obạntETôi,Tôin¬(mộtTôibTôi)LTôi,obạnt(¬ETôi,TôinLTôi,Tôin)(ETôi,TôinmộtTôi¬bTôi)rTôi(¬ETôi,Tôin((LTôi,TôinmộtTôi)(¬LTôi,TôinbTôi)))(ETôi,Tôin(mộtTôibTôi))

và sau đó kết nối chúng với chữ số có ý nghĩa nhất cho ăn tiếp theo. Phần quan trọng đi từ MSB đến LSB trong khi mạch dựa trên cơ sở tốt nhất sẽ có một đường dẫn quan trọng đi từ LSB đến MSB sau đó quay lại LSB.

Nó là tương đương với một adder mang gợn. Nếu bạn quan tâm, bạn có thể xây dựng các trình bổ sung carry-save hoặc carry-select.

EL¬Emột

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.