加法器

使用环境: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视图:






  


  

原文地址:https://www.cnblogs.com/dpc525/p/2049217.html