瞬时模块没有正确执行减法
Instantaneous module does not perform subtraction properly
我试图在 ALX 为 1 且 ALY 为 0 时使用瞬时进位先行加法器执行减法,但它无法正常工作。它适用于添加。
- 如果 ALX 为 0 且 ALY 也为 0 它将加载输入到输出
- 如果 ALX 为 0 且 ALY 为 1 它将添加输入到输出
- 如果 ALX 为 1 且 ALY 为 0 它将子输入输出
- 如果 ALX 为 1 且 ALY 也为 1 它将输入输出
这是我的一些alu模块
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
你能提供完整的代码吗?由于IO命名,很难找到错误。
你有一个时序电路,所以你必须首先等待时钟的上升沿,然后检查控制信号(ALY、ALX)的变化,最后将数据信号传播到组合电路(cla4)。因此,您必须在 always 块中实现第四行。
顺便说一句,除非您 100% 确定它是正确的,否则最好避免在赋值语句中使用多个条件。
在 always 块中,您可以使用 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
我犯了一个愚蠢的错误,我通过更改进位先行加法器函数调用的 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 值和它的原始值之间来回变化。
我试图在 ALX 为 1 且 ALY 为 0 时使用瞬时进位先行加法器执行减法,但它无法正常工作。它适用于添加。
- 如果 ALX 为 0 且 ALY 也为 0 它将加载输入到输出
- 如果 ALX 为 0 且 ALY 为 1 它将添加输入到输出
- 如果 ALX 为 1 且 ALY 为 0 它将子输入输出
- 如果 ALX 为 1 且 ALY 也为 1 它将输入输出
这是我的一些alu模块
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
你能提供完整的代码吗?由于IO命名,很难找到错误。
你有一个时序电路,所以你必须首先等待时钟的上升沿,然后检查控制信号(ALY、ALX)的变化,最后将数据信号传播到组合电路(cla4)。因此,您必须在 always 块中实现第四行。
顺便说一句,除非您 100% 确定它是正确的,否则最好避免在赋值语句中使用多个条件。
在 always 块中,您可以使用 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
我犯了一个愚蠢的错误,我通过更改进位先行加法器函数调用的 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 值和它的原始值之间来回变化。