Files
LA32R/Hardware/LA32R.srcs/sources_1/new/alu.v
2025-06-17 00:35:40 +08:00

80 lines
3.2 KiB
Verilog
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
`timescale 1ns / 1ps
/*******************************************************************************
** Company: Nantong University
** Engineer: あやせももこ
**
** Create Date: 2025-06-16
** Design Name: LA32R Single Cycle CPU
** Module Name: alu
** Project Name: Computer Architecture Course Design
** Target Devices: Any FPGA
** Tool Versions: Vivado 2018.1
** Description:
** This module implements the Arithmetic Logic Unit (ALU) for the LA32R CPU.
**
** [FIXED] The implementation of SLT now uses the $signed() system function
** to correctly handle comparisons that could cause overflow, such as
** comparing a positive and a negative number.
**
** Revision:
** Revision 0.02 - Corrected SLT implementation using $signed().
** Revision 0.01 - File Created
**
*******************************************************************************/
module alu (
input wire [31:0] a, // 操作数 A (Operand A)
input wire [31:0] b, // 操作数 B (Operand B)
input wire [3:0] alu_op, // ALU 操作控制码 (ALU Operation Control Code)
output reg [31:0] result, // 运算结果 (Result)
output wire zero, // 零标志位 (Zero Flag)
output wire lt // 小于标志位 (Less Than Flag for BLT)
);
// 定义ALU操作码的参数增强可读性
// Define parameters for ALU operations to enhance readability
localparam ALU_ADD = 4'b0000;
localparam ALU_SUB = 4'b0001;
localparam ALU_AND = 4'b0010;
localparam ALU_OR = 4'b0011;
localparam ALU_NOR = 4'b0100;
localparam ALU_SLT = 4'b0101;
localparam ALU_SLTU = 4'b0110;
// 减法结果的临时线网
// Temporary wire for subtraction result
wire [31:0] sub_result = a - b;
// [FIX] 使用$signed()进行稳健的有符号比较
// [FIX] Use $signed() for robust signed comparison
wire slt_res = ($signed(a) < $signed(b));
// 无符号比较
// Unsigned comparison
wire sltu_res = (a < b);
// 主组合逻辑: 根据alu_op计算结果
// Main combinational logic: calculate result based on alu_op
always @(*) begin
case (alu_op)
ALU_ADD: result = a + b; // 加法 (Addition)
ALU_SUB: result = sub_result; // 减法 (Subtraction)
ALU_AND: result = a & b; // 与 (AND)
ALU_OR: result = a | b; // 或 (OR)
ALU_NOR: result = ~(a | b); // 或非 (NOR)
ALU_SLT: result = {31'b0, slt_res}; // 有符号小于比较 (Set on Less Than, Signed)
ALU_SLTU: result = {31'b0, sltu_res}; // 无符号小于比较 (Set on Less Than, Unsigned)
default: result = 32'hxxxxxxxx; // 默认情况,输出不定态 (Default case, output undefined)
endcase
end
// 零标志位输出: 当减法结果为0时置1用于BEQ指令
// Zero flag output: set to 1 when the subtraction result is zero, for BEQ instruction
assign zero = (sub_result == 32'h00000000);
// 小于标志位输出: 用于BLT指令
// Less Than flag output: for BLT instruction
assign lt = slt_res;
endmodule