OUC数字逻辑Verilog实验一 用Verilog实现一个简单ALU

这篇博客介绍了一个用Verilog语言编写的简单算术逻辑单元(ALU)模块,包括加减运算、左移、逻辑运算等功能,并通过测试 bench 进行了验证。ALU能够检测进位和借位情况,对于加法和减法操作,通过条件判断来模拟溢出和借位。测试案例覆盖了ALU的各种操作,确保其正确性。
摘要由CSDN通过智能技术生成

简单ALU

`timescale 1ns / 1ps

module ALU (
    input [3:0] A,
    input [3:0] B,
    input [2:0] operation,
    output reg [3:0] result,
    output reg cout
);
  always @(*) begin
    cout = 0;
    case (operation)
      3'b000: begin
        result <= A + B;
        // 由于不能直接检测溢出,所以换一种方式检测
        // 如果A + B > 1111 产生进位
        if (A + B < A || A + B < B) cout = 1;
      end
      3'b001: begin
        result <= A - B;
        // 如果A - B < 0 产生借位
        if (A < B) cout = 1;
      end
      3'b010: begin
        result <= B + 1;
        // 1111 + 1 产生进位
        if (B == 4'b1111) cout = 1;
      end
      3'b011: begin
        // 0 - 1 产生借位
        result <= B - 1;
        if (B == 4'b0000) cout = 1;
      end
      3'b100: begin
        result <= ~A;
      end
      3'b101: begin
        result <= A ^ B;
      end
      3'b110: begin
        result <= A & B;
      end
      3'b111: begin
        result <= A | B;
      end
    endcase
  end
endmodule

testbench

`timescale 1ns / 1ps

module ALU_tb;
  reg [3:0] A;
  reg [3:0] B;
  reg [2:0] operation;
  wire [3:0] result;
  wire cout;

  ALU ALU (
      A,
      B,
      operation,
      result,
      cout
  );
  initial begin
    A <= 4'b0001;
    B <= 4'b0010;
    operation <= 000;  // A + B 0011 没有进位

    #10 A <= 4'b1100;
    B <= 4'b1000;
    operation <= 000;  // A + B 0100 产生进位

    #10 A <= 4'b0001;
    B <= 4'b0001;
    operation <= 001;  // A - B 0000

    #10 A <= 4'b0000;
    B <= 4'b0001;
    operation <= 001;  // A - B < 0 1111 产生借位

    #10 A <= 4'b0000;
    B <= 4'b0001;
    operation <= 010;  // B + 1 0010

    #10 A <= 4'b0000;
    B <= 4'b1111;
    operation <= 010;  // B + 1 0000 产生进位

    #10 A <= 4'b0000;
    B <= 4'b0001;
    operation <= 011;  // B - 1 0000

    #10 A <= 4'b0000;
    B <= 4'b0000;
    operation <= 011;  // B - 1 1111 产生借位

    #10 A <= 4'b1001;
    B <= 4'b0001;
    operation <= 100;  //NOT A 0110

    #10 A <= 4'b0001;
    B <= 4'b0010;
    operation <= 101;  //A XOR B 

    #10 A <= 4'b0001;
    B <= 4'b0001;
    operation <= 110;  //A AND B 

    #10 A <= 4'b0001;
    B <= 4'b0000;
    operation <= 110;  //A AND B

    #10 A <= 4'b0001;
    B <= 4'b0000;
    operation <= 111;  //A OR B

    #10 A <= 4'b0000;
    B <= 4'b0000;
    operation <= 111;  //A OR B

    #10 $stop;
  end
endmodule

仿真图像

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值