作业-基于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
begin
sum_out[0]
实现八位加法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
ina_lsb
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
ina_msb1
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
sum11
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
sum_out
sum_out
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软件综合