Мгновенный модуль не выполняет вычитание должным образом

Я пытаюсь выполнить вычитание, когда ALX равен 1, а ALY равен 0, используя сумматор с мгновенным переносом, но он не работает должным образом. Он отлично работает для дополнения.

  • если ALX равно 0 и ALY также равно 0, он будет загружать ввод для вывода
  • если ALX равен 0, а ALY равен 1, он добавит ввод к выводу
  • если ALX равен 1, а ALY равен 0, он будет подставлять вход для вывода
  • если ALX равно 1 и ALY также равно 1, это будет и вход для вывода

Вот часть моего алюминиевого модуля

module alu (CLK, RST, ALE, ALX , ALY, iDATA, oDATA , flags,aDATA);
input wire CLK, ALE, ALX, ALY,RST;
input wire [3:0] iDATA;
output reg [3:0] oDATA;
output reg [3:0] flags;
output reg [2:0] aDATA;

//declare variables

reg [3:0] nextflags;
wire [3:0] ALU;
wire [3:0] SUM;
wire CIN;
wire claCF,claZF,claNF,claVF;

cla4 test(iDATA,oDATA,CIN,SUM,claCF,claZF,claNF,claVF);
assign CIN = ALX;
assign ALU = ALX ? (ALY ? iDATA & oDATA : SUM) : (ALY ? SUM : iDATA ); //loop 
always @ (posedge CLK, posedge RST) begin
if (RST) begin
oDATA <= 0;
flags <= 0;
end

else if(ALE) begin
oDATA <= ALU;
flags <= nextflags;
end

else begin
oDATA <= oDATA;
flags <= flags;
end

always @ (*) begin
aDATA[2:0] = {ALE,ALX,~CIN};
nextflags[3] = ALX ? ( ALY ? flags[3]: claCF ) : (ALY ? claCF : 0 );
nextflags[2] = (ALU==0);
nextflags[1] = ALU[3];
nextflags[0] = ALX ? ( ALY ? flags[0] : claVF ) : (ALY ? claVF : 0 );
end
endmodule

Вот мои результаты

 time:                   0 OUTPUT:0000 ADATA:001 C:0 Z:0 N:0 V:0 
 time:                   1 OUTPUT:0000 ADATA:110 C:0 Z:0 N:0 V:0 
 time:                   2 OUTPUT:0001 ADATA:110 C:1 Z:0 N:0 V:0 
 time:                   4 OUTPUT:0000 ADATA:110 C:1 Z:1 N:0 V:0 
 time:                   6 OUTPUT:0001 ADATA:110 C:1 Z:0 N:0 V:0 
 time:                   8 OUTPUT:0000 ADATA:110 C:1 Z:1 N:0 V:0 
 time:                  10 OUTPUT:0001 ADATA:110 C:1 Z:0 N:0 V:0 
 time:                  12 OUTPUT:0000 ADATA:110 C:1 Z:1 N:0 V:0 
 time:                  14 OUTPUT:0001 ADATA:110 C:1 Z:0 N:0 V:0 
 time:                  16 OUTPUT:0000 ADATA:110 C:1 Z:1 N:0 V:0 
 time:                  18 OUTPUT:0001 ADATA:110 C:1 Z:0 N:0 V:0 
 time:                  20 OUTPUT:0000 ADATA:110 C:1 Z:1 N:0 V:0 

person Lau Chok Yip    schedule 21.04.2019    source источник


Ответы (2)


не могли бы вы предоставить полный код? трудно найти ошибку из-за именования IO.

у вас есть последовательная схема, поэтому вы должны сначала дождаться нарастающего фронта тактового сигнала, затем проверить изменения в управляющих сигналах (ALY, ALX), а затем, наконец, передать сигналы данных в комбинационную схему (cla4). Итак, вы должны реализовать четвертую строку в блоке always.

Кстати, лучше избегать использования нескольких условий в операторе assign, если вы не уверены на 100%, что это правильно.

в блоке всегда вы можете использовать оператор case:

   always @ (posedge CLK, posedge RST) begin
if (RST) begin
oDATA <= 0;
flags <= 0;
end

else 
    case({ALX ,ALY}) 
        2'b00 : begin /* */ end
        2'b10 : begin /* */ end
        2'b01 : begin /* */ end
        2'b11 : begin /* */ end



    endcase
   end
person M12421K    schedule 21.04.2019
comment
Привет, я отредактировал это. Однако я не использовал регистрацию для ALX и ALY. - person Lau Chok Yip; 22.04.2019
comment
почему бы и нет? разве они не обновляются каждые часы? (схема реагирует на них каждый такт.) Если вы думаете о них как о компоненте RTL в своем проекте, у вас может быть два DFF. - person M12421K; 22.04.2019

Я сделал глупую ошибку, и я исправил ее, изменив расположение oDATA и iDATA для вызова функции переноса с опережением.

cla4 test(oDATA,iDATA,CIN,SUM,claCF,claZF,claNF,claVF);

потому что в моем модуле сумматора с опережением переноса я объявляю первую переменную как переменную, к которой нужно добавить.

module cla4 (X,Y,M,S,CF,ZF,NF,VF);

assign G = X & (Y ^ {4{CIN}});
assign P = X ^ (Y ^ {4{CIN}});

таким образом, вывод будет работать в цикле, потому что он в основном будет выполнять операцию xor с переносом в себя. Значение просто меняется между значением xor и исходным значением.

person Lau Chok Yip    schedule 22.04.2019