1.半加器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.半加器相关的知识,希望对你有一定的参考价值。
参考技术A 1.定义两个一位数的相加,称为半加器。
2.真值表
x为第一个加数,y为第二个加数,c为进位,s为x+y右边一位和。
x y c s
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
3.逻辑表达式
与门
异或
4.verilog 程序
4.1 数据流描述方式
module add_half(
input x,
input y,
output c,
output s
):
assign c=x&y;
assign s=x^y;
endmodule
4.2 门级描述方式
module add_half(
input x,
input y,
output c,
output s
);
and(c,x,y);
xor(s,x,y);
endmodule
4.3 行为描述方式
module add_half(
input x,
input y,
output c,
output s
);
always@(a or b)
begin
case(a,b)
2'b00:begin s=0;c=0; end
2'b01:begin s=1;c=0; end
2'b10:begin s=1;c=0; end
2'b11:begin s=0;c=1; end
endcase
end
5.RTL 逻辑图
6.仿真
6.1 testbench
`timescale 1ns / 1ps
module sim_add_half(
);
reg x,y;
reg clk;
wire s,c;
initial#初始化数据
begin
#1
x=0;
y=0;
clk=0;
end
always #5 clk=~clk;
always@(posedge clk)
begin
x=$random%2;
y=$random%2;
end
add_half u1(x,y,c,s); #调用原文件
endmodule
6.2 仿真图
FPGA学习-7:较为复杂的组合电路 上
上一节我们学习了基本的3-8译码器组合电路verilog写法
这一次我们来点有难度的,写一个整型全加器
在此基础上再写一个单周期无符号整型乘法器
首先从简单的开始:半加器
半加器真值表
A | B | C |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
真值表可以写为:
C = A xor B
可以看到半加器就是2个1位二进制数相加
verilog行为级代码如下:
module Half_adder(
input A,
input B,
output Y
);
assign Y = A + B;
endmodule
门级代码如下:
module Half_adder(
input A,
input B,
output Y
);
xor(Y,A,B);
endmodule
但是要想实现8位,16位,甚至32位的整数加法单单是半加器无法完成的
实际运算过程种也有加法的进位,半加器无法传递进位信息
所以我们需要 “全加器”
全加器真值表
A | B | C(上一位进位信号) | D(当前进位信号) | Y |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
... | ... | ... | ... | ... |
0 | 1 | 1 | 1 | 0 |
... | ... | ... | ... | ... |
1 | 1 | 1 | 1 | 1 |
真值表可以写为:
D = (A and B) or (A and C) or (B and C)
Y = (A xor B) xor C
行为级代码如下:
module Adder(
input A,
input B,
input C,
output D,
output Y
);
assign {D,Y} = A+B+C;
endmodule
门级代码如下
module Adder(
input A,
input B,
input C,
output D,
output Y
);
wire t1,t2,t3,t4;
xor(t1,A,B);
xor(Y,t1,C);
and(t2,A,B);
and(t3,A,C);
and(t4,B,C);
or(D,t2,t3,t4);
endmodule
由于篇幅原因,下一篇再介绍加法器和乘法器的写法
以上是关于1.半加器的主要内容,如果未能解决你的问题,请参考以下文章