繁体   English   中英

具有溢出,符号和零标志的Verilog 32位ALU

[英]Verilog 32-bit ALU with Overflow, Sign, and Zero Flags

我有一个作业,要求创建标题中所述的模块。 我需要对两个输入进行加,减,AND和XOR并设置必要的标志。 分配不是100%明确,但是我假设溢出标志将使其他所有内容无效,因此我不必担心超过32位结果的任何事情。 我的问题来自零和溢出标志,无论我尝试什么,这似乎都没有设置。 我整理了一些在网上找到的方法,但是不确定这些方法是否错误或我是否将其编码为错误。 一切都可以编译并运行,但是无论我使用什么输入,我的标志都不会置位。 我只参加了一个Verilog课程,并且不记得很多限制,因此不胜感激。

module alu(clk, rst, CTRL, A, B, Overflow, Z_flag, Negative, d_out);

input wire clk , rst;
input wire [1:0] CTRL;
input wire signed [31:0] A, B;

output wire Negative;
output reg Z_flag;
output reg [1:0] Overflow;
output wire [31:0] d_out;
reg signed [32+32:0] Result;

assign Negative = Result[31]; // Negative Flag
assign d_out [31:0] = Result [31:0];

always@(posedge clk) 
begin
    if(!rst) 
    begin
        if(rst)
        begin
        Result [31:0] <= 0;
        end

        case(CTRL)      
        2'b00: 
        begin
            Result [32:0] <= {A[31], A [31:0]} + {B[31], B [31:0]}; // Add A + B
                 if(Result [32:31] == (2'b11 | 2'b10)) Overflow <= 1'b1;
            else Overflow <= 1'b0;
        end

        2'b01: 
        begin
            Result [32:0] <= {A[31], A [31:0]} - {B[31], B [31:0]}; // Subtract A - B
                 if((Result[32+32]) && (~Result [32+31:31] != 0)) Overflow <= 1'b1;
            else if ((~Result[32+32]) && (Result [32+31:31] != 0)) Overflow <= 1'b1;
                 else Overflow <= 1'b0;
        end

        2'b10: 
        begin
            Result [31:0] <= A [31:0] & B [31:0]; // Bitwise AND
        end

        2'b11:
        begin
            Result [31:0] <= A [31:0] ^ B [31:0]; // Bitwise XOR
        end
        endcase

        if (Result == "32h'00000000") Z_flag <= 1'b1; // Zero detection
        else Z_flag <= 1'b0;
    end
end

这是我的测试台:

module ALU_stimulus;


   reg clk;
   reg rst;
   reg [1:0] CTRL;
   reg [31:0] A;
   reg [31:0] B;


   wire Overflow;
   wire Z_flag;
   wire Negative;
   wire [31:0] d_out;


   alu uut (
       .clk(clk),
       .rst(rst),
       .CTRL(CTRL),
       .A(A),
       .B(B),
       .Overflow(Overflow),
       .Z_flag(Z_flag),
       .Negative(Negative),
       .d_out(d_out)
   );

   initial begin

   clk = 0;
   rst = 0;
   CTRL = 0;
   A = 0;
   B = 0;


   #100;
   clk=1'b1;
   A=32'h00000000;
   B=32'h00000000;
   rst=1'b0;
   CTRL=2'b00;
   #100;
   clk=1'b0;
   #100 $stop;

   end

endmodule

为了简化示例,请考虑具有1位符号扩展名的4位值。

1 + 1 = 2; 无溢出

0 0001; //1
0 0001; //1
0 0010; //2

7 + 7 = 14; 4位值最大值的溢出为7

0 0111; //1
0 0111; //1
0 1110; //-2

-1 + -1 = -2; 无下溢

1 1111 //-1
1 1111 //-1
1 1110 //-2

-8 + -8 = -16下溢最小值为-8

1 1000 //-8
1 1000 //-8
1 0000 // 0

查看MSB(符号扩展名和MSB),我们可以看到:

00 => normal
01 => Overflow
10 => Underflow
11 => normal

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM