Я хочу создать 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 - без знака, правильно?
Что вы подразумеваете под "замедлением"? – mkrieger1
@ mkrieger1 это была опечатка для объявления, отредактировал вопрос. – Morgan
Я вижу;) @Pooya, так как результат может быть отрицательным числом, вы должны объявить 'temp' также подписанным. – mkrieger1