基于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); 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
//高四位调用4位加法器模块 //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软件综合
[3:0]clkina[7:0]D[3:0]RQ[3:0][3:0][7:0][7:4]D[3:0]Q[3:0][3:0]Rrst_nina_msb[3:0]fast_adder4bcarry_inclkrst_nsum_out[4:0][3:0][4:0][4:0]ina_msb1[3:0][4][3:0]D[8:0]RQ[8:0][8:0][8:0]sum_out[8:0]ina[3:0]inb[3:0]inb[7:0]R[7:0][7:4]D[3:0]Q[3:0][3:0][3:0]D[3:0]Q[3:0][3:0][3:0]Ru2sum_out[8:0]inb_msb[3:0]inb_msb1[3:0]0fast_adder4b[3:0]D[3:0]RQ[3:0][3:0][3:0][3:0]D[3:0]sum_out[4:0][4:0]Q[3:0]ina[3:0]inb[3:0][3:0]R[3:0]carry_inclkrst_nsum11[3:0]ina_lsb[3:0]u1[3:0]D[3:0]Q[3:0][3:0]Rinb_lsb[3:0]