Menu Close

Verilog 全加(减)器及累加器设计

在CPU的ALU的设计中,全加器是ALU的重要组件,因此这部分内容会单独拿出来讲解。

在一位全加器及超前进位加法器的设计技巧中已经将底层算法和逻辑设计步骤介绍清楚,这里主要介绍在FPGA的设计中,利用QuartusII 及Vivado工具进行可综合的设计。

  1. 全加器设计

例1:

module  fadd
#(parameter WIDTH = 32)
(
    input              ci,
    input  [WIDTH-1:0] a,
    input  [WIDTH-1:0] b,
 
    output [WIDTH-1:0] sum,
    output             co
);
 
assign  {co, sum} = a + b + ci;
 
endmodule

 

2.全减器设计
全减器采用补码的方式实现,2进制补码对变量取反加一。
取补码后,原来的减法就变成加法。如: a – b – ci,分别对b和ci取补码,就变成a + com_b + com_ci;

其中b的补码:com_b = ~b+1;

ci的补码:com_ci = ~{(WIDTH-1){1’b0}, ci} + 1;
如果ci==0;      com_ci =  {WIDTH-1{1’b1}, 1’b1} + 1 = {WIDTH{1’b1}} + 1 = {WIDTH{1’b0}} = {WIDTH{ci}};
如果ci==1’b1;  com_ci =  {WIDTH-1{1’b1}, 1’b0} + 1 = {WIDTH{1’b1}} = {WIDTH{ci}};
因此ci的补码统一运算公式就是直接将ci位扩展即可。
例2:

module sub 
#( parameter WIDTH = 32)
(
    input              ci, 
    input [WIDTH-1:0]  a, 
    input [WIDTH-1:0]  b, 
 
    output [WIDTH-1:0] sub,
    output             co 
); 
 
wire [WIDTH-1:0] com_b;
 
assign    com_b = ~b + 1;
 
assign {co, sub} = a + com_b + {WIDTH {ci}};
 
endmodule

 

3.累加器的设计

累加器应用非常广泛,特别是在数学运算,数据平滑,平均值,中值等领域有着广泛应用。

下面以参数的模块为例介绍累加器设计。

例2:

累加器设计,要求参数化,将输入数据在start信号为‘1’后累加,输入数据与data_rdy同步,其中data_rdy是输入数据的同步脉冲。输入数据宽度,以及每次累加的输入数据数量都由参数确定。参数可以接收例化模块传入。累加结束后由outdata输出,并且跟随指示数据计算完成的同步脉冲。

在程序设计中首先将输入数据,输入同步信号锁存,主要用于提高时序。整个程序分为三步,

(1)初始化并等待start信号

(2)累加并将数据累加计数器减1,直到num=0;

(3)累加完成,并回握手信号;返回步骤(1)

程序流程图如下:

%title插图%num

图1

 

module acc # 
(
    parameter width = 32,
    parameter len   = 16
)
(
    input                            rst,
    input                            clk,
    input                            start,
    input                            data_rdy,
    input      [width-1:0]           indata,
     output reg [width+$clog2(len)-1:0] outdata,
    output reg                       cal_done
);
 
 
reg [width-1:0] indata_r;
reg [$clog2(len)-1:0] num;
reg [1:0] st;
reg data_rdy_r;
 
always@(posedge clk or posedge rst)
if(rst) begin
    indata_r <= 0;
    data_rdy_r <= 0;
end
else begin
    data_rdy_r <= data_rdy;
    indata_r <= indata;
end
 
 
always@(posedge clk or posedge rst)
if(rst) begin
     outdata <= 0;
     num <= len;
     cal_done <= 1'b0;
     st <= 0;
end
else case(st)
0:begin
    outdata <= 0;
    num <= len;
    cal_done <= 1'b0;
 
    if(start)
        st <=1;
end
1:begin
    if(data_rdy_r)begin
        outdata <= outdata + indata_r;
        num <= num - 1;
    end
 
    if(num == 0) begin
        st <= 2;
     end
end
2:begin
    cal_done <= 1'b1;
    st <= 0;
end
default: st = 0;
endcase
 
endmodule

 

仿真程序:仿真程序提供自然数1,2,3… n, 每10个数为一批数据,观察计算结果,并提供仿真程序与实体程序之间的各个握手信号。

`timescale 1ns/1ps

module tb();


parameter width = 8;
parameter len   = 10;

reg        rst;
reg        clk;
reg        start;
reg        data_rdy;
reg   [width -1:0] indata;
reg   [$clog2(len)-1:0] num;
wire  [width+$clog2(len)-1:0] outdata;
wire  cal_done;



always #5 clk=!clk;


reg    [2:0] st;


initial  begin
    rst = 1'b1;
    clk = 1'b0;
    #20;
    rst = 0;
end

always@(posedge clk or posedge rst)
if(rst) begin
    start <= 0;
    data_rdy <= 0;
    indata <= 0;
    num <= 0;
    st <= 0;
end
else begin
    case (st)
    0:begin 
        data_rdy <= 0;
        indata <= 0;
        num <= 0;
        start <= 1'b1;
        st <= 1;
    end
    1:begin
      start <= 0;
      if(num == 10) begin
          data_rdy <= 0;
          num <= 0;
          st <= 2;
      end
      else begin
          data_rdy <= 1'b1;
          num <= num + 1;
          indata <= indata + 1;
      end
      
    end
    2:begin
      st <= 3;
    end
    3:begin
      st <= 4;
    end
    4:begin
      st <= 5;
    end
    5:begin
      st <= 1;
      start <= 1'b1;
    end
    default : st <= 0;
    endcase

end


acc  # 
(
    .width(width),
    .len(len)
)
acc_inst
(
    .rst(rst),
    .clk(clk),
    .start(start),
    .data_rdy(data_rdy),
    .indata(indata),

    .outdata(outdata),
    .cal_done(cal_done)
);


endmodule

 

仿真结果如图2所示:

%title插图%num

图2

从图2的波形可以看出仿真结果与设计意图相符。

Posted in FPGA, FPGA, Verilog, Verilog

2 Comments

发表评论

相关链接