You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

4位行波ALU中SLT指令实现问题求助

问题与解决方案

问题描述

我搞不懂怎么用单比特ALU搭建的4比特行波进位ALU实现SLT指令,不知道单比特ALU的2'b11操作码该怎么设置,也不清楚4比特ALU里各模块的连接方式;另外还纠结在拿到最高位ALU的结果前,怎么设置最低有效位(LSB)。我把操作码改成0111让结果等于less后,输出一直是高阻态。以下是我的代码:

原代码

全加器

module FullAdder(a, b, cin, sum, cout);
  input a, b, cin;
  output sum, cout;
  
  assign sum = a ^ b ^ cin;
  assign cout = (a & b) | ((a ^ b) & cin);
endmodule

1位ALU

module OneBitALU(a, b, cin, ainv, binv, less, op, result,
cout, set);
  input a, b, cin;
  input ainv, binv;
  input less;
  input [1:0] op;
  
  output result;
  output cout;
  output set;
  wire aneg, bneg;
  
  reg result;  
  reg tmp;
  reg set;
  assign aneg = ainv ? ~a : a;
  assign bneg = binv ? ~b : b;
  
  FullAdder fulladder(aneg, bneg, cin, tmp, cout);
  
  always @ (*) begin
    case(op)
      2'b00: result = aneg & bneg;
      2'b01: result = aneg | bneg;
      2'b10: result = tmp;
      2'b11: result = less;
      default: result = 1'b0;   
    endcase
  end
endmodule

4位ALU

module FourBitALU(a, b, op, result, cout);
  input [3:0] a, b; 
  input [3:0] op;
  
  output [3:0] result;
  output cout;
  reg [3:0] result;
  reg [3:0] sum;
  wire [2:0] co;
  
  OneBitALU oba0(a[0], b[0], op[2], op[3], op[2], sum[3], op[1:0], result[0], co[0], sum[0]);
  OneBitALU oba1(a[1], b[1], co[0], op[3], op[2], 0, op[1:0], result[1], co[1], sum[1]);
  OneBitALU oba2(a[2], b[2], co[1], op[3], op[2], 0, op[1:0], result[2], co[2], sum[2]);
  OneBitALU oba3(a[3], b[3], co[2], op[3], op[2], 0, op[1:0], result[3], cout, sum[3]);
  
endmodule

问题分析与修正

1. 1位ALU的set信号错误

原代码中set定义为reg但未在always块中赋值,导致输出高阻态。SLT需要的是有符号数a - b的符号位(含溢出判断),因此set应赋值为全加器输出的tmp(sum)与进位cout的异或,修正为wire类型并直接赋值:

// 修正后的1位ALU
module OneBitALU(a, b, cin, ainv, binv, less, op, result, cout, set);
  input a, b, cin;
  input ainv, binv;
  input less;
  input [1:0] op;
  
  output result;
  output cout;
  output set;
  wire aneg, bneg;
  wire tmp; // 改为wire,对应全加器的sum输出
  
  reg result;  
  assign aneg = ainv ? ~a : a;
  assign bneg = binv ? ~b : b;
  
  FullAdder fulladder(aneg, bneg, cin, tmp, cout);
  assign set = tmp ^ cout; // 有符号数减法的符号位(含溢出判断)
  
  always @ (*) begin
    case(op)
      2'b00: result = aneg & bneg;
      2'b01: result = aneg | bneg;
      2'b10: result = tmp;
      2'b11: result = less;
      default: result = 1'b0;   
    endcase
  end
endmodule

2. 4位ALU的连接与类型错误

  • result和sum定义为reg但实际是组合逻辑输出,改为wire避免冲突;
  • 最低位ALU的less输入原连接到sum[3]形成无效循环,改为连接最高位ALU的set信号(这是a < b的判断结果);
  • SLT操作码为4'b0111:op[3]=0(不反相a)、op[2]=1(反相b,执行减法)、op[1:0]=2'b11(让ALU输出less)。此时最低位输出set,其他位因less输入为0输出0,最终结果为{3'b0, set},符合SLT要求。

修正后的4位ALU:

module FourBitALU(a, b, op, result, cout);
  input [3:0] a, b; 
  input [3:0] op;
  
  output [3:0] result;
  output cout;
  wire [3:0] result; // 改为wire
  wire [3:0] sum; // 改为wire
  wire [2:0] co;
  wire set; // 最高位的set信号,传递给最低位的less
  
  OneBitALU oba0(a[0], b[0], op[2], op[3], op[2], set, op[1:0], result[0], co[0], sum[0]);
  OneBitALU oba1(a[1], b[1], co[0], op[3], op[2], 1'b0, op[1:0], result[1], co[1], sum[1]);
  OneBitALU oba2(a[2], b[2], co[1], op[3], op[2], 1'b0, op[1:0], result[2], co[2], sum[2]);
  OneBitALU oba3(a[3], b[3], co[2], op[3], op[2], 1'b0, op[1:0], result[3], cout, set);
  
endmodule

内容的提问来源于stack exchange,提问作者Will Potts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:59:59