系列目錄
Verilog 半加器和全加器
Verilog 半減器和全減器
串行加法器
11位全加器verilog設(shè)計(jì)
目錄
系列目錄
文章目錄
前言
一、什么是半減器和全減器
半減器
全減器
二、半減器的verilog代碼和testbench代碼如下:
三、全減器的verilog代碼和testbench代碼如下:
?四、全減器仿真結(jié)果:
RTL:
?波形圖:
前言
大二的數(shù)字邏輯課程和考試已經(jīng)結(jié)束了,栽在了沒(méi)細(xì)致研究的狀態(tài)機(jī)上,但是對(duì)于一名計(jì)科學(xué)生來(lái)說(shuō),F(xiàn)PGA的領(lǐng)域仍然是廣闊的,所以我將會(huì)把我之前學(xué)習(xí)所寫(xiě)的資料進(jìn)行一個(gè)整理。
一、什么是半減器和全減器
半減器
半減器原理:兩個(gè)二進(jìn)制數(shù)相減叫做半減,實(shí)現(xiàn)半減器操作的電路稱(chēng)為半減器,半減器用于計(jì)算兩bit x和y 的減法,輸出結(jié)果diff和減法借位標(biāo)志輸出cin
半減器只考慮當(dāng)前兩位二進(jìn)制數(shù)相減,輸出為差以及是否向高位借位,而全減器還要考慮當(dāng)前位的低位是否曾有借位。它們的真值表如下:
被減數(shù) | 減數(shù) | 表示本位最終運(yùn)算結(jié)果 | 表示本位是否向高位借位 |
x | y | diff | cin |
0 | 0 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 0 |
diff = x ^ y; cin = (~x) & y;
全減器
要理解真值表,可以用舉列子的方法得到:
被減數(shù) | 減數(shù) | 表示低位是否向本位借位 | 表示本位最終運(yùn)算結(jié)果 | 表示本位是否向高位借位 |
x | y | cout | diff | cin |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 |
比如4'b1000 - 4b'0001,
則第一位對(duì)應(yīng)0 1 0 1 1第二位對(duì)應(yīng)的是0 0 1 1 1
?從真值表中,可以得到
diff = x ^ y ^ cout, cin = (~x & (y ^ cout))|(y & cout)
注意: +和|都表示或。?
推導(dǎo)過(guò)程:
二、半減器的verilog代碼和testbench代碼如下:
代碼如下(示例):
module halfsub(x,y,d,cin);
input x;
input y;
output d;
output cin;
assign d = x ^ y;
assign cin = (~x) & y;
endmodule
testbench:
`timescale 1ns/1ns
`define clock_period 20
module halfsub_tb;
reg x,y;
wire cin; //carryover
wire d;
reg clk;
halfsub halfsub_0(
.x(x),
.y(y),
.d(d),
.cin(cin)
);
initial clk = 0;
always #(`clock_period/2) clk = ~clk;
initial begin
x = 0;
repeat(20)
#(`clock_period) x = $random;
end
initial begin
y = 0;
repeat(20)
#(`clock_period) y = $random;
end
initial begin
#(`clock_period*20)
$stop;
end
endmodule
三、全減器的verilog代碼和testbench代碼如下:
module fullsub(cout,x,y,d,cin);
input cout; // carry out bit, borrowed by its next low bit
input x;
input y;
output d;
output cin;
assign d = x ^ y ^ cout;
assign cin = (~x & (y ^ cout)) | (y & cout);
endmodule
`timescale 1ns/1ns
`define clock_period 20
module fullsub_tb;
reg x,y,cout;
wire cin; //carryover
wire d;
reg clk;
fullsub fullsub_0(
.cout(cout),
.x(x),
.y(y),
.d(d),
.cin(cin)
);
initial clk = 0;
always #(`clock_period/2) clk = ~clk;
initial begin
x = 0;
repeat(20)
#(`clock_period) x = $random;
end
initial begin
y = 0;
repeat(20)
#(`clock_period) y = $random;
end
initial begin
cout = 0;
repeat(20)
#(`clock_period) cout = $random;
end
initial begin
#(`clock_period*20)
$stop;
end
endmodule
?四、全減器仿真結(jié)果:
RTL:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-481017.html
?波形圖:
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-481017.html
到了這里,關(guān)于Verilog 半減器和全減器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!