Verilog 加法器和減法器(3)


       手工加法運算時候,我們都是從最低位的數字開始,逐位相加,直到最高位。如果第i位產生進位,就把該位作為第i+1位輸入。同樣的,在邏輯電路中,我們可以把一位全加器串聯起來,實現多位加法,比如下面的四位加法電路。這種加法電路叫行波進位加法器

image


     每一級的進位cout傳到下一級時都有一個延時,假設為t, 則總的延時為 n*t, n為操作數的位數,比如四位行波進位加法器,為4t。因為t是固定的時間,所以32位或者64位加法時候,這個時延可能不可接受,影響電路的時序,所以我們需要找到更加高效的加法器。

    下面是8位行波進位加法器的代碼。通過改變參數n的值,我們能夠實現的不同位操作數的行波進位加法。

module addern(x, y, s, cout);
  parameter n=8;
  input [n-1:0] x;
  input [n-1:0] y;
  output reg[n-1:0] s;
  output reg cout;

  reg [n:0] c;
  integer k;

  always @(x,y) begin
    c[0] = 1'b0;
	 for(k = 0; k < n; k = k + 1) begin
	   s[k] = x[k]^y[k]^c[k];
		c[k+1] = (x[k]&y[k])|(x[k]&c[k])|(y[k]&c[k]);
	 end
	 cout = c[n];

  end

endmodule

或者我們能夠使用generate  … endgenerate,在其中用for循環實例化fulladd模塊來實現同樣功能。代碼如下:

module addern(x, y, s, cout);
  parameter n=32;
  input [n-1:0] x;
  input [n-1:0] y;
  output [n-1:0] s;
  output  cout;

  wire [n:0] c;
  genvar k;
  assign c[0]=0;
  assign cout=c[n];

  generate
	 for(k = 0; k <= n-1; k = k + 1) begin:addbit
       fulladd stage(c[k],x[k],y[k],s[k],c[k+1]);
	 end
  endgenerate

endmodule

使用下面的testbench代碼:

`timescale 1ns/1ns
`define clock_period 20

module addern_tb;
  reg [7:0] x,y;

  wire cout;
  wire [7:0] s;
  reg clk;

  addern #(.n(8)) addern_0(
						.x(x),
						.y(y),
						.s(s),
						.cout(cout)
                  );

  initial clk = 0;
  always #(`clock_period/2) clk = ~clk;

  initial begin
     x = 0;
     repeat(20)
	    #(`clock_period) x = $random;

  end

  initial begin
     y = 0;
     repeat(20)
	    #(`clock_period) y = $random;

  end


  initial begin
     #(`clock_period*20)
	  $stop;
  end


endmodule

進行功能驗證,我們得到如下的波形,注意設置radix位unsigned,以便查看結果是否正確。


image

我們也可以使用下面的代碼實現相同的功能。這段代碼在quartus II選用Cyclone IV E-EP4CE10F17C8綜合后,得到下面的邏輯電路,應該是調用了內置的加法器ip。

module addern( x, y,s,cout);

  parameter n=8;
  input [n-1:0] x;
  input [n-1:0] y;
  output [n-1:0] s;
  output  cout;


  assign {cout, s} = x + y ;

endmodule

image







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM