加法器
使用环境:Quartus II 8.0 + DE2(Cyclone II EP2C35F627C6)
1、半加器:
代码:
half_adder
1 module half_adder(ina,inb,sum_out,carry_out,clk,rst);
2
3 input ina;
4 input inb;
5 input clk;
6 input rst;
7
8 output sum_out;
9 output carry_out;
10
11 reg sum_out;
12 reg carry_out;
13
14 always @(posedge clk or negedge rst)
15 begin
16 if(!rst)
17 begin
18 sum_out <= 1'b0;
19 carry_out <= 1'b0;
20 end
21 else
22 begin
23 sum_out <= ina^inb;
24 carry_out <= ina&inb;
25 end
26 end
27 endmodule
综合后的RTL视图:
仿真波形图:
小结:半加器最后输出经过了一级D触发器。注意:组合电路要考虑门电路的传输延迟时间,以及由此引起的竞争。
我们把门电路两个输入信号同时向相反的逻辑电平跳变(一个从1变为0,另一个从0变为1)的现象叫做竞争。消除竞争—冒险现象的方法有
a、接入滤波电容。b、引入选通脉冲。 c、修改逻辑设计
2、全加器
全加器和半加器的区别在于全家器多了一个进位输入端。
组合逻辑代码:
full_adder
1 module full_adder(ina,inb,carry_in,sum_out,carry_out);
2
3 input ina;
4 input inb;
5 input carry_in;
6
7 output sum_out;
8 output carry_out;
9
10 //combinational logic
11
12 assign sum_out = (ina^inb)^carry_in;
13 assign carry_out = (ina&inb)|((ina^inb)&carry_in);
14
15 endmodule
综合后的RTL视图:
时序逻辑实现代码:
full_adder_seq
module half_adder(ina,inb,carry_in,sum_out,carry_out,clk,rst);
input ina;
input inb;
input carry_in;
input clk;
input rst;
output sum_out;
output carry_out;
reg sum_out;
reg carry_out;
//second method: sequential logic
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
sum_out <= 1'b0;
carry_out <= 1'b0;
end
else
begin
sum_out <= (ina^inb)^carry_in;
carry_out <= (ina&inb)|((ina^inb)&carry_in);
end
end
endmodule
综合后的RTL视图: