Bagaimana integer unsigned max diimplementasikan dalam perangkat keras?

10

Saya sedang mengerjakan desain yang melibatkan banyak fungsi maks (dan fungsi maks sebagai argumen untuk fungsi maks lainnya).

Dalam upaya untuk menyederhanakan desain perangkat keras saya bertanya-tanya bagaimana maks diimplementasikan dalam perangkat keras?

Secara matematis, Max (a, b) dapat direpresentasikan sebagai [(a + b) + abs (b - a)] / 2.

Apakah ini cara penerapannya pada perangkat keras? (Yaitu secara bertahap; penambahan, pembagian bit shift, dll.)

Jika demikian, bagaimana perbedaan absolut dari perbedaan itu dihitung?

James
sumber

Jawaban:

10

Pendekatan yang sangat sederhana adalah dengan mengimplementasikan (a> b)? A: b. a> b dapat diimplementasikan dengan mulai dari kiri dan periksa setiap pasangan bit (a, b):

  • keduanya 0 atau keduanya 1: melanjutkan ke pasangan bawah berikutnya
  • a is 1: a is tertinggi; b adalah 1: b adalah yang tertinggi

Ketika Anda tahu mana yang tertinggi, Anda dapat memilih yang dengan 2N-> N mux.

Dengan beberapa trik cerdas, pemeriksaan pasangan bit dapat dikombinasikan dengan muxer untuk pasangan bit yang sama.

Wouter van Ooijen
sumber
2

Mari kita lihat algoritma dalam pertanyaan:

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

Ini memiliki tahap penambahan dan pengurangan yang kemudian diumpankan ke penambahan tahap kedua. Membagi dengan 2 adalah sepele dalam perangkat keras, dapat dilakukan dengan menghapus LSB. Namun full-adder / subtractor dua-tahap cukup lambat dan intensif di gerbang, terutama jika Anda menggunakan beberapa caparison seperti Anda.

Membangun dari jawaban Wouter van Ooijen, struktur umum adalah komparator digital yang memberi makan sinyal pilih dari mux:

skema

mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab

Skema di atas adalah untuk:

(A > B) ? A : B

tetapi perhatikan bahwa itu dapat dengan mudah dikonfigurasi ulang untuk perbandingan antara dua input dengan membuat koneksi logis yang berbeda antara output komparator dan mux select.

Jadi jika kita tahu bagaimana merumuskan tiga output dari komparator, kita dapat mengimplementasikan perbandingan apa pun pada perangkat keras. Logika pembanding dijelaskan dengan baik di sini . Untuk mengoptimalkan perangkat keras, kami hanya akan menghapus logika mengemudi keluaran komparator yang tidak digunakan.

Tetapi pada akhirnya, jika itu ke perangkat keras, itu harus melalui sintesis. Jadi Anda tidak boleh terobsesi dengan skema level gerbang mana yang optimal. Sebaliknya, optimalkan kode dan algoritme Anda sehingga Anda setidaknya tidak memaksa synthesizer untuk menghasilkan hasil yang tidak efisien. "Dengan beberapa trik cerdas, pengecekan pasangan bit dapat dikombinasikan dengan muxer untuk pasangan bit yang sama," dan cara termudah untuk melakukan optimasi ini adalah dengan sintesis.

travisbartley
sumber
1

Jika Anda benar-benar ingin membangun sirkuit khusus untuk menghitung maks, Anda bisa mulai dengan blok dasar dengan persamaan berikut:

Esaya,HaikamutEsaya,sayan¬(Sebuahsayabsaya)L.saya,Haikamut(¬Esaya,sayanL.saya,sayan)(Esaya,sayanSebuahsaya¬bsaya)rsaya(¬Esaya,sayan((L.saya,sayanSebuahsaya)(¬L.saya,sayanbsaya)))(Esaya,sayan(Sebuahsayabsaya))

dan kemudian hubungkan dengan digit paling signifikan yang memberi makan angka berikutnya. Bagian kritis beralih dari MSB ke LSB sementara rangkaian berdasarkan substraksi paling baik akan memiliki jalur kritis dari LSB ke MSB kemudian kembali ke LSB.

Ini setara dengan adder carry-riak. Jika Anda tertarik, Anda dapat membangun yang setara dengan carry-save atau carry-select adders.

EL.¬ESebuah

Pemrogram
sumber