用Verilog写一个16位补码加减法运算器写出它的board模块和display模块
时间: 2024-03-17 14:46:30 浏览: 149
以下是一个基于上面的16位补码加减法运算器的完整Verilog代码,包括一个包含输入、输出和add_sub模块的board模块,以及一个用于在数码管上显示结果的display模块。
```verilog
module add_sub (
input [15:0] a,
input [15:0] b,
input sub,
output [15:0] result
);
assign result = sub ? a - b : a + b;
endmodule
module board (
input clk,
input rst,
input [15:0] a,
input [15:0] b,
input sub,
output [15:0] result,
output [6:0] seg,
output [3:0] an
);
add_sub dut (
.a(a),
.b(b),
.sub(sub),
.result(result)
);
reg [3:0] count = 0;
reg [15:0] prev_result = 0;
wire [6:0] seg_a = 7'b0110000;
wire [6:0] seg_b = 7'b1101101;
wire [6:0] seg_c = 7'b1111001;
wire [6:0] seg_d = 7'b0110011;
wire [6:0] seg_e = 7'b1011011;
wire [6:0] seg_f = 7'b1011111;
wire [6:0] seg_g = 7'b1110000;
wire [6:0] seg_blank = 7'b1111111;
assign seg = {seg_a, seg_b, seg_c, seg_d, seg_e, seg_f, seg_g, seg_blank};
always @ (posedge clk) begin
if (rst) begin
count <= 0;
prev_result <= 0;
end else begin
count <= count + 1;
if (count == 4) begin
prev_result <= result;
end
end
end
assign an = 4'b1110 ^ count;
display display0(
.value(prev_result),
.seg(seg),
.an(an)
);
display display1(
.value(result),
.seg(seg),
.an(4'b1111)
);
endmodule
module display (
input [15:0] value,
output reg [6:0] seg,
output reg [3:0] an
);
reg [3:0] count = 0;
wire [3:0] digit;
assign digit[0] = value[3:0];
assign digit[1] = value[7:4];
assign digit[2] = value[11:8];
assign digit[3] = value[15:12];
always @ (posedge clk) begin
count <= count + 1;
if (count == 4) begin
count <= 0;
end
case (count)
0: seg <= {seg[6:0], digit[0]};
1: seg <= {seg[6:0], digit[1]};
2: seg <= {seg[6:0], digit[2]};
3: seg <= {seg[6:0], digit[3]};
endcase
an <= 4'b1110 ^ count;
end
endmodule
```
board模块接受时钟、复位、两个输入数a和b,一个sub输入表示是否进行减法运算,以及一个输出result,表示运算结果。它通过实例化add_sub模块来进行加减法运算,并在always块中使用计数器和prev_result变量来实现四个数码管显示上一个结果,一个数码管显示当前结果。它还实例化了两个display模块来对数码管进行驱动。
display模块接受一个16位输入value,以及数码管的seg和an输出。它通过将value分成四个数字位,使用计数器和case语句来依次驱动数码管的四个数字位,实现数码管显示输入的值。
阅读全文