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
相关产品推荐
相关产品推荐

