当前位置:文档之家› 作业-基于verilog HDL的八位超前进位加法器

作业-基于verilog HDL的八位超前进位加法器

基于verilog HDL的八位超前进位加法器
Verilog 综合作业陈孙文
2011-10-25
指导老师:邓婉玲老师目录:
1. 超前进位加法器原理
2. 算法代码
3. modelsim SE软件实现功能仿真
4. synplify pro软件实现综合
正文:
一、原理
(1)、全加器
列出真值表如表所示,若Ai、Bi两个一位二进制数相加,以Ci表示来自低位的的进位,Si表示和,Ci表示向高位的进位,可以看出该电路考虑来低位的进位,是一个一位数的全加器电路,其逻辑符号如图所示。

串并行超前进位加法器的特点是:各级进位信号同时产生,减小或消除因进位信号逐级传递所用的时间。

每一位的进位信号不依赖于从低位逐级传递,而是—开始就能确定。

全加器真值可以得到逻辑表达式:
为表达简单,定义两个中间变量Gi和Pi
得出
得到各位进位信号的逻辑表达式为:
当实际位数较多时,往往将全部数位按4位一组分成若干组,组内采用超前进位,组间采用串行进价,组成所谓的串并行进位加法器。

二、算法代码:有4bits.v、8bits.v、testbench.v三个文件;
4bits.v实现输入为4位数的加法器;8bits.v中调用4bits.v中的函数来实现8位数相加;testbench.v 为测试代码;
实现四位加法4bits.v部分:
module fast_adder4b(ina,inb,carry_in,sum_out,clk,rst_n);
parameter ADDER_WIDTH=4;
parameter SUM_WIDTH=5;
input [ADDER_WIDTH-1:0]ina; //输入数ina,8位
input [ADDER_WIDTH-1:0]inb; //输入数inb,8位
input carry_in;
input rst_n;
input clk;
output [SUM_WIDTH-1:0] sum_out;
reg [SUM_WIDTH-1:0] sum_out;
wire [ADDER_WIDTH-1:0]sg;
wire [ADDER_WIDTH-1:0]sp;
wire [ADDER_WIDTH-1:0]sc;
assign sg[0]=ina[0]&inb[0]; //中间变量G0=ina0&inb0;
assign sg[1]=ina[1]&inb[1];
assign sg[2]=ina[2]&inb[2];
assign sg[3]=ina[3]&inb[3];
assign sp[0]=ina[0]^inb[0]; //中间变量P0=ina0^inb0;
assign sp[1]=ina[1]^inb[1];
assign sp[2]=ina[2]^inb[2];
assign sp[3]=ina[3]^inb[3];
assign sc[0]=sg[0]|(sp[0]&carry_in); //进位位C0
assign sc[1]=sg[1]|(sp[1]&(sg[0]|(sp[0]&carry_in)));
assign sc[2]=sg[2]|(sp[2]&(sg[1]|(sp[1]&(sg[0]|(sp[0]&carry_in)))));
assign sc[3]=sg[3]|(sp[3]&(sg[2]|(sp[2]&(sg[1]|(sp[1]&(sg[0]|(sp[0]&carry_in)))))));
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
sum_out<=5'b00000;
else
begin
sum_out[0]<=sp[0]^carry_in; //输出结果位
sum_out[1]<=sp[1]^sc[0];
sum_out[2]<=sp[2]^sc[1];
sum_out[3]<=sp[3]^sc[2];
sum_out[4]<=sc[3];
end
end
endmodule
实现八位加法8bits.v部分:
module pipe_adder8b(ina,inb,sum_out,clk,rst_n);
parameter ADDER_WIDTH=8;
parameter SUM_WIDTH=9;
parameter HALF_ADDER_WIDTH=4;
input [ADDER_WIDTH-1:0]ina;
input [ADDER_WIDTH-1:0]inb;
input rst_n;
input clk;
output[SUM_WIDTH-1:0] sum_out;
reg [SUM_WIDTH-1:0] sum_out;
reg [HALF_ADDER_WIDTH-1:0] ina_lsb;
reg [HALF_ADDER_WIDTH-1:0] ina_msb;
reg [HALF_ADDER_WIDTH-1:0] inb_lsb;
reg [HALF_ADDER_WIDTH-1:0] inb_msb;
reg [HALF_ADDER_WIDTH-1:0] ina_msb1;
reg [HALF_ADDER_WIDTH-1:0] inb_msb1;
reg [HALF_ADDER_WIDTH:0] sum11;
wire[HALF_ADDER_WIDTH:0] sum1;
wire[HALF_ADDER_WIDTH:0] sum2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
ina_lsb<=4'b0000;
ina_msb<=4'b0000;
inb_lsb<=4'b0000;
inb_msb<=4'b0000;
end
else
begin
ina_lsb<=ina[3:0];
ina_msb<=ina[7:4];
inb_lsb<=inb[3:0];
inb_msb<=inb[7:4];
end
end
fast_adder4b u1(ina_lsb,inb_lsb,1'b0,sum1,clk,rst_n); //低四位调用4位加法器模块
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
ina_msb1<=4'b0000;
inb_msb1<=4'b0000;
end
else
begin
ina_msb1<=ina_msb;
inb_msb1<=inb_msb;
end
end
fast_adder4b u2(ina_msb1,inb_msb1,sum1[4],sum2,clk,rst_n); //高四位调用4位加法器模块always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
sum11<=4'b0000;
else
sum11<=sum1;
end
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
sum_out<=9'b0000_00000;
else
sum_out<={sum2,sum11[3:0]};
end
endmodule
testbengch.v部分:
`timescale 1ns/1ns
module test_8a;
reg clk,rst_n;
reg [7:0]ina,inb;
wire [8:0]sum_out;
always #20 clk=~clk; //时钟信号40ns一个周期
initial
begin
rst_n=1;
clk=0;
#30
ina=43; //给a赋值43
inb=61;
#200 rst_n=0;
#40 rst_n=1;
#2000 $stop;
end
//fast_adder4b bbb(.ina(ina),.inb(inb),.carry_in(1'b0),.sum_out(sum_out),.clk(clk),.rst_n(rst_n));
pipe_adder8b te(.ina(ina),.inb(inb),.sum_out(sum_out),.clk(clk),.rst_n(rst_n));
endmodule
三、modelsim软件实现功能仿真
三个代码文件compile通过之后,执行simulation;添加待观察端口到波形图wave中,执行simulation->run all命令,在wave波形图中得到以下的仿真波形:
四、synplify pro软件综合。

相关主题