дополнение до двух значений со знаком при вычитании

В назначении VHDL я должен создать АЛУ, которое выводит результат вычитания и дополнения до двух, а также некоторые другие операции на 16-битных входах. В том смысле, что rtl-код сравнивается с функциональным.

В функциональном коде я использовал арифметические операции, такие как "+", "-" и..., но в rtl я использовал структурный VHDL. Вот почему я должен быть точным, чтобы результаты этих кодов показывали один и тот же результат. Я не знаю, какими частями кодов было бы полезно поделиться.

Я работаю над кодом vhdl, который вычитает два «подписанных» числа (подписанных в формате дополнения до двух) в структурной форме. Обычно для вычитания двух беззнаковых чисел мы меняем второе на дополнение до двух и складываем числа.

Но теперь, когда у нас есть числа со знаком, скажем, мы хотим вычесть два 16-битных числа со знаком, чтобы последний старший бит был битом знака. Как здесь работает дополнение до двух? (Глядя на здесь), если я хочу иметь a - b (a и b числа со знаком), я должен иметь:

a + (дополнение до двух b)

or

а + (не б)?

(a и b подписаны в формате дополнения до двух)


person syzd    schedule 29.09.2017    source источник
comment
Чтобы отрицать использование дополнения до двух, нужно инвертировать и добавить единицу, да? вы инвертируете второй операнд, и вы инвертируете перенос. Вот и все. Еще одна вещь, о которой нужно заботиться, - это выполнение, хотите ли вы, чтобы это было заимствование или не заимствование? вы можете или не можете инвертировать выполнение, если у вас есть бит переноса, который вы храните в регистре флагов. красота дополнения двоек заключается в том, что все числа просто работают. Возьмите все комбинации из трех битовых операндов, выполните сложение без знака, выполните сложение со знаком, обратите внимание, как работают битовые шаблоны, а логике не нужно знать разницу, затем...   -  person old_timer    schedule 30.09.2017
comment
оттуда a - b = a + (-b) просто работает. для сложения и вычитания знаковые и беззнаковые относятся только к программисту, логика которого знает, заботится о битовых шаблонах. по той же причине nbit = nbit * nbit умножение не знает и не заботится о том, что когда вы делаете nbits * 2 = nbit * nbit, вы должны подписать расширение, и тогда это имеет значение (для умножения).   -  person old_timer    schedule 30.09.2017
comment
Можете ли вы просто использовать вычитание? Унарный оператор отрицания также выполняет инверсию дополнения до двух + 1, как двоичное вычитание (см. пакет numeric_std noreferrer">numeric_std.vhdl и numeric_std-body .vhdlИдентификатор: A.2 и Идентификатор: A.10).   -  person    schedule 30.09.2017
comment
Пожалуйста, прочитайте лучше мой ответ на ваш предыдущий вопрос, потому что вы сделали ошибку, скопировав его. В дополнении до двух a - b = a + not(b) + 1.   -  person JHBonarius    schedule 30.09.2017
comment
Кстати, дополнение до двух — это название формата представления, а не операции.   -  person JHBonarius    schedule 30.09.2017