Verilog 加法器和減法器(1)


    兩個一位的二進制數x,y相加,假設和為s,進位為cout,其真值表為:

    image

   從真值表中,我們可以得到:s = x^y, cout = x&y,實現兩個一位數相加的邏輯電路稱為半加器。


  實現該電路的verilog代碼如下:

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

  input x;
  input y;

  output s;
  output cout;

  assign s = x^y;
  assign cout = x&y;


endmodule
View Code

  相對應的testbench文件如下代碼。在代碼中,我們采用系統函數$random來產生隨機激勵。半加器電路中並沒有使用時鍾,但在testbench中,產生了時鍾信號,主要是為了功能驗證時候,有一個時間單位信號,便於檢查結果。

 

`timescale 1ns/1ns
`define clock_period 20

module halfadd_tb;
  reg  x,y;

  wire cout;
  wire s;
  reg clk;

  halfadd halfadd_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
View Code

在quartus II中,分析與綜合后,用rtl view 可以得到 halfadd的電路如下,和我們預想的一樣。

image

功能仿真結果如下,從波形中可以看到結果正確。

image

全編譯后,在Cyclone IV E-EP4CE10F17C8中的門級仿真結果如下,輸入和輸出之間,會有幾ns的時延。

image


通常,我們更感興趣的是多位二進制數的相加,在多位二進制數相加時,對每一位而言,除了考慮相加的兩位數(第i位),還要考慮來自低位(i-1位)的進位。實現帶低位進位的兩個一位數相加的邏輯電路,稱為全加器。

它的真值表如下:


image

從真值表中,我們可以得知:s = ~x & y & ~cin + x&~y&~cin+~x&~y&cin+x&y&cin = (~x&y+x&~y)&~cin+(~x&~y+x&y)&cin=(x^y)&~cin+~(x^y)&cin=x^y^cin,

這兒我們用~表示非,+表示或。cout = x&y+x&cin+y&cin

全加器verilog代碼如下:

module fulladd(cin,x,y,s,cout);

  input cin;
  input x;
  input y;

  output s;
  output cout;

  assign s = x^y^cin;
  assign cout = (x&y)|(x&cin)|(y&cin);


endmodule
View Code

對應的testbench代碼如下:

`timescale 1ns/1ns
`define clock_period 20

module fulladd_tb;
  reg  cin,x,y;

  wire cout;
  wire s;
  reg clk;

  fulladd fulladd_0(
                  .cin(cin),
						.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
     cin = 0;
     repeat(2)
	    #(`clock_period*10) cin = {$random};

  end

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


endmodule
View Code


從rtl view中,可以看到全加器邏輯電路圖如下:包括3個與門,一個三輸入的異或門,一個三輸入的或門。

image


功能仿真和門級仿真的波形如下,信號符合預期。

image


image


免責聲明!

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



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