起因是老师要我们以逻辑表达式的形式交作业,强调是逻辑表达式,在网上找了许久,没有找到,便从一些文章中找到了灵感,特分享
说明: 此代码为四位加/减法器的Verilog代码实现(用的是逻辑表达式)文章来源:https://www.toymoban.com/news/detail-516090.html
- 第一种表达:
module plus (
input [3:0] P,
input [3:0] G,
input op,
output [3:0] C
);
/*
参数说明
op 是运算符号,op = 0时是加法, op = 1时是减法
P 和 G 是两个操作数,C 是结果
即 P op G = C
*/
// 定义一个变量辅助计算
wire [3:0] ci;
// 用ci记录进位,异或运算进行不进位加法
assign C[0] = (G[0] ^ op) ^ P[0] ^ op;
assign ci[1] = (G[0] ^ op) & P[0] | op & ((G[0] ^ op) | P[0]);
// 计算第二位的结果和进位
assign C[1] = (G[1] ^ op) ^ P[1] ^ ci[1];
assign ci[2] = (G[1] ^ op) & P[1] | ci[1] & ((G[1] ^ op) | P[1]);
// 计算第三位的结果和进位
assign C[2] = (G[2] ^ op) ^ P[2] ^ ci[2];
assign ci[3] = (G[2] ^ op) & P[2] | ci[2] & ((G[2] ^ op) | P[2]);
// 计算第四位的结果
assign C[3] = (G[3] ^ op) ^ P[3] ^ ci[3];
endmodule
//~ `New testbench
`timescale 1ns / 10ps
module tb_plus;
// plus Inputs
reg [3:0] P = 0;
reg [3:0] G = 0;
reg op = 0;
// plus Outputs
wire [3:0] C;
plus plus (
.P (P[3:0]),
.G (G[3:0]),
.op(op),
.C (C[3:0])
);
initial begin
// 测试样例1:
// 2 + 4 = 6
P = 4'b0010;
G = 4'b0100;
op = 0;
#5;
// 测试样例2:
// 9 + 3 = C
P = 4'b1001;
op = 0;
G = 4'b0011;
#5;
// 测试样例3:
// 8 + 2 = A
P = 4'b1000;
G = 4'b0010;
op = 0;
#5;
// 测试样例4:
// A - 4 = 6
P = 4'b1010;
G = 4'b0100;
op = 1;
#5;
// 测试样例5:
// 9 - 7 = 2
P = 4'b1001;
G = 4'b0111;
op = 1;
#5;
// 测试样例6:
// C - 1 = B
P = 4'b1100;
G = 4'b0001;
op = 1;
#5;
$stop;
end
endmodule
- 第二种表达:
module plus (
input [3:0] P,
input [3:0] G,
input op,
output [3:0] C
);
/*
参数说明
op 是运算符号,op = 0时是加法, op = 1时是减法
P 和 G 是两个操作数,C 是结果
即 P op G = C
*/
// 定义一个变量辅助计算
wire [3:0] ci;
// 用ci记录进位,异或运算进行不进位加法
assign C[0] = (G[0] ^ op) ^ P[0] ^ op;
assign ci[0] = ((G[0] ^ op) & P[0]) || ((G[0] ^ op) & op) || (P[0] & op);
// 计算第二位的结果和进位
assign C[1] = (G[1] ^ op) ^ P[1] ^ ci[0];
assign ci[1] = ((G[1] ^ op) & P[1]) || ((G[1] ^ op) & ci[0]) || (P[1] & ci[0]);
// 计算第三位的结果和进位
assign C[2] = (G[2] ^ op) ^ P[2] ^ ci[1];
assign ci[2] = ((G[2] ^ op) & P[2]) || ((G[2] ^ op) & ci[1]) || (P[2] & ci[1]);
// 计算第四位的结果
assign C[3] = (G[3] ^ op) ^ P[3] ^ ci[2];
endmodule
//~ `New testbench
`timescale 1ns / 10ps
module tb_plus;
// plus Inputs
reg [3:0] P = 0;
reg [3:0] G = 0;
reg op = 0;
// plus Outputs
wire [3:0] C;
plus plus (
.P (P[3:0]),
.G (G[3:0]),
.op(op),
.C (C[3:0])
);
initial begin
$dumpfile("a.vcd");
$dumpvars;
// 测试样例1:
// 2 + 4 = 6
P = 4'b0010;
G = 4'b0100;
op = 0;
#5;
// 测试样例2:
// 9 + 3 = C
P = 4'b1001;
op = 0;
G = 4'b0011;
#5;
// 测试样例3:
// 8 + 2 = A
P = 4'b1000;
G = 4'b0010;
op = 0;
#5;
// 测试样例4:
// A - 4 = 6
P = 4'b1010;
G = 4'b0100;
op = 1;
#5;
// 测试样例5:
// 9 - 7 = 2
P = 4'b1001;
G = 4'b0111;
op = 1;
#5;
// 测试样例6:
// C - 1 = B
P = 4'b1100;
G = 4'b0001;
op = 1;
#5;
$finish;
end
endmodule
这是上面的波形图
参考链接:
原码, 反码, 补码 详解
Verilog——串行四位加法器和超前四位加法器74HC283文章来源地址https://www.toymoban.com/news/detail-516090.html
到了这里,关于Verilog实现四位加/减法器(逻辑表达式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!