??起因是老師要我們以邏輯表達(dá)式的形式交作業(yè),強(qiáng)調(diào)是邏輯表達(dá)式,在網(wǎng)上找了許久,沒(méi)有找到,便從一些文章中找到了靈感,特分享
說(shuō)明: 此代碼為四位加/減法器的Verilog代碼實(shí)現(xiàn)(用的是邏輯表達(dá)式)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-516090.html
- 第一種表達(dá):
module plus (
input [3:0] P,
input [3:0] G,
input op,
output [3:0] C
);
/*
參數(shù)說(shuō)明
op 是運(yùn)算符號(hào),op = 0時(shí)是加法, op = 1時(shí)是減法
P 和 G 是兩個(gè)操作數(shù),C 是結(jié)果
即 P op G = C
*/
// 定義一個(gè)變量輔助計(jì)算
wire [3:0] ci;
// 用ci記錄進(jìn)位,異或運(yùn)算進(jìn)行不進(jìn)位加法
assign C[0] = (G[0] ^ op) ^ P[0] ^ op;
assign ci[1] = (G[0] ^ op) & P[0] | op & ((G[0] ^ op) | P[0]);
// 計(jì)算第二位的結(jié)果和進(jìn)位
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]);
// 計(jì)算第三位的結(jié)果和進(jìn)位
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]);
// 計(jì)算第四位的結(jié)果
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
// 測(cè)試樣例1:
// 2 + 4 = 6
P = 4'b0010;
G = 4'b0100;
op = 0;
#5;
// 測(cè)試樣例2:
// 9 + 3 = C
P = 4'b1001;
op = 0;
G = 4'b0011;
#5;
// 測(cè)試樣例3:
// 8 + 2 = A
P = 4'b1000;
G = 4'b0010;
op = 0;
#5;
// 測(cè)試樣例4:
// A - 4 = 6
P = 4'b1010;
G = 4'b0100;
op = 1;
#5;
// 測(cè)試樣例5:
// 9 - 7 = 2
P = 4'b1001;
G = 4'b0111;
op = 1;
#5;
// 測(cè)試樣例6:
// C - 1 = B
P = 4'b1100;
G = 4'b0001;
op = 1;
#5;
$stop;
end
endmodule
- 第二種表達(dá):
module plus (
input [3:0] P,
input [3:0] G,
input op,
output [3:0] C
);
/*
參數(shù)說(shuō)明
op 是運(yùn)算符號(hào),op = 0時(shí)是加法, op = 1時(shí)是減法
P 和 G 是兩個(gè)操作數(shù),C 是結(jié)果
即 P op G = C
*/
// 定義一個(gè)變量輔助計(jì)算
wire [3:0] ci;
// 用ci記錄進(jìn)位,異或運(yùn)算進(jìn)行不進(jìn)位加法
assign C[0] = (G[0] ^ op) ^ P[0] ^ op;
assign ci[0] = ((G[0] ^ op) & P[0]) || ((G[0] ^ op) & op) || (P[0] & op);
// 計(jì)算第二位的結(jié)果和進(jìn)位
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]);
// 計(jì)算第三位的結(jié)果和進(jìn)位
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]);
// 計(jì)算第四位的結(jié)果
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;
// 測(cè)試樣例1:
// 2 + 4 = 6
P = 4'b0010;
G = 4'b0100;
op = 0;
#5;
// 測(cè)試樣例2:
// 9 + 3 = C
P = 4'b1001;
op = 0;
G = 4'b0011;
#5;
// 測(cè)試樣例3:
// 8 + 2 = A
P = 4'b1000;
G = 4'b0010;
op = 0;
#5;
// 測(cè)試樣例4:
// A - 4 = 6
P = 4'b1010;
G = 4'b0100;
op = 1;
#5;
// 測(cè)試樣例5:
// 9 - 7 = 2
P = 4'b1001;
G = 4'b0111;
op = 1;
#5;
// 測(cè)試樣例6:
// C - 1 = B
P = 4'b1100;
G = 4'b0001;
op = 1;
#5;
$finish;
end
endmodule
這是上面的波形圖
參考鏈接:
原碼, 反碼, 補(bǔ)碼 詳解
Verilog——串行四位加法器和超前四位加法器74HC283文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-516090.html
到了這里,關(guān)于Verilog實(shí)現(xiàn)四位加/減法器(邏輯表達(dá)式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!