2015-03-30 4 views
0

Я хочу создать ALU для выполнения некоторых операций над двумя регистрами на 8 бит (A, B), а для обнаружения carry_out я определил регистр 9 бит в качестве темпа и поставил результаты работы на A, b в этом регистре.
MSb этого временного регистра используется как выполняемый.
Вот часть моего кода:
вычитание verilog не дает выполнения

module ALU(input signed [7:0] A, input [7:0] B, input carry_in, input [2:0] acode, output reg [7:0] R, output zero, output reg carry_out); 

    reg [8:0] temp; 
    reg [15:0] temp2; 

    always @(A, B, acode) begin 
    case(is_shift) 
     1'b0: begin 
     case(acode) 
      3'b000: temp = A + B; 
      3'b010: temp = A - B; 
     endcase 
     R = temp[7:0]; 
     carry_out = temp[8]; 

Учитывая A = 11100101 и B = 11000111, вот лог:

//addition 
A: 11100101 , B: 11000111 
acode: 000 
R: 10101100 
zero: 0, carry_out: 1 

//subtraction 
A: 11100101 , B: 11000111 
acode: 010 
R: 00011110 
zero: 0, carry_out: 0 

В обоих случаях девятый бит темп должен 1, и это правильно в случае сложения, но в случае вычитания вычитание является правильным, но 9-й бит временной шкалы не установлен на 1.
В чем проблема?

Кстати: Эффект декларации регистра как подписанный только сдвигается и расширяется, да? Значит, эта проблема не из-за того, что A подписана, а B - без знака, правильно?

+0

Что вы подразумеваете под "замедлением"? – mkrieger1

+0

@ mkrieger1 это была опечатка для объявления, отредактировал вопрос. – Morgan

+0

Я вижу;) @Pooya, так как результат может быть отрицательным числом, вы должны объявить 'temp' также подписанным. – mkrieger1

ответ

1

Эффект декларации регистра как знаковый только в перенесении и расширении

Нет, это влияет всю арифметику. Хотя обычно, если вы комбинируете любую неподписанную или частичную шину, тогда она будет по умолчанию возвращаться к беззнаковой арифметике.

Вы не можете иметь один вход, подписанный, а один нет, арифметика с двумя дополнениями просто не будет работать. Вы, по крайней мере, должны подписывать расширение знакового значения и вставлять 0 MSB в беззнаковое, удостоверяясь, что он будет оценен как положительный.

Ваш первый пример:

1110 0101 // -27 
    1100 0111 // -57 
1 1010 1100 // -84 (-27 -57) 

Второй пример (вычитание)

1110 0101 // -27 
    0011 1001 // +57 
1 0001 1110 // 30 (ignoring MSB) -226 Including MSB 

Но обратите внимание, что выход 1 немного шире, RTL не дает вам доступ к ручной клади, а дополнительная сумма, поэтому входы обозначаются знаком.

1 1110 0101 // -27 
1 1100 0111 // -57 
1 1010 1100 // -84 

1 1110 0101 // -27 
0 0011 1001 // +57 
0 0001 1110 // 30 

Примечание в правильно подписать расширенное вычитание MSB 0

Но для того со вторым значением знака вам нужно 0, чтобы показать, что это положительное число, и вы будете иметь рост битового 1 бит:

1 1 1110 0101 // -27 
0 0 1100 0111 // 199 
0 0 1010 1100 // 172 (-27+199) 

Здесь расширенный бит (а не перенос) равен 0. не 1, как вы и предполагали.

Смежные вопросы