您的位置:首页 > 其它

(原創) 如何設計2數相加的電路? (SOC) (Verilog)

2008-10-04 08:52 531 查看
Abstract

y = a + b;一個很簡單的運算,該如何使用數位電路實現呢?

Introduction

使用環境:Quartus II 8.0


y = a + b;這個在C是再簡單不過的運算,不過若要使用Verilog在數位電路實現,初學者可能會遇到一些困難。

y = a + b兩數相加

不使用clock

Add2_assign.v / Verilog


1 module Add2_assign (

2 input [7:0] iA,

3 input [7:0] iB,

4 output [8:0] oSUM

5 );

6

7 assign oSUM = iA + iB;

8

9 endmodule

合成結果



Simulation結果



結果雖然有很多glitch,畢竟組合電路一定會產生glitch,最少目前看到的結果仍正確,結果差強人意,所以想在最後輸出加上一個reg將glitch去除。

使用clock (輸出加上reg)

Add2_always_bad.v / Verilog


1 module Add2_always_bad (

2 input iCLK,

3 input iRST_N,

4 input [7:0] iA,

5 input [7:0] iB,

6 output reg [8:0] oSUM

7 );

8

9 always@(posedge iCLK, negedge iRST_N) begin

10 if (!iRST_N)

11 oSUM <= 0;

12 else

13 oSUM <= iA + iB;

14 end

15

16 endmodule

合成結果



Simulation結果



前面結果還正確,但紅色部分結果是錯的,顯然只在輸出加上reg是不夠的,所以打算將輸入也加上reg。

使用clock (輸入、輸出皆加上reg)

Add2_always_good.v / Verilog


1 /*

2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3

4 Filename : Add2_always_good.v

5 Compiler : Quartus II 8.0

6 Description : Demo how to write y = a + b;

7 Release : 10/04/2008 1.0

8 */

9

10 module Add2_always_good (

11 input iCLK,

12 input iRST_N,

13 input [7:0] iA,

14 input [7:0] iB,

15 output reg [8:0] oSUM

16 );

17

18 reg [7:0] a, b;

19

20 always@(posedge iCLK, negedge iRST_N) begin

21 if (!iRST_N) begin

22 a <= 0;

23 b <= 0;

24 oSUM <= 0;

25 end

26 else begin

27 a <= iA;

28 b <= iB;

29 oSUM <= a + b;

30 end

31 end

32

33 endmodule

合成結果



Simulation結果



結果相當漂亮,因為用了兩級reg,所以輸出有2 clock delay,不過很穩定的在2個clock後一定會有產出,Fmax可達420Mhz。



為什麼輸入與輸出都要加上reg?

由於加法器在兩級reg中間,所以可以確保輸入後,第一個clock將iA、iB打入第一級D-FF,第二個clock將相加結果打入第二級D-FF,因此可以很穩定的在每次輸入的2個clock之後都有產出,也就是說,加法器這個組合電路可以穩定地在一個clock做完

或許你會問,若y = a + b + c + d + ..... + z;還能保證1個clock做完嗎?

對,雖然y = a + b + c + d + ..... + z這個組合電路龐大,delay會很嚴重,但由於在兩級reg之間,所以仍然必須在1個clock做完,但由於delay變長,所以period也變長,雖然能是一個clock做完,但Fmax勢必下降,但最少結果是穩定的。

完整程式碼下載

Add2_assign.7z (不使用clock,BAD)

Add2_always_bad.7z (使用clock,僅在輸出加上reg,BAD)

Add2_always_good.7z (使用clock,在輸入與輸出皆加上reg,GOOD)

Conclusion

在本文中,我們可以看到同步設計的優點,可避免glitch所造成的影響,也學到若要在數位電路中做運算,應先將輸入寄存在reg中,並將結果再寄存到reg一次,透過兩級的D-FF,結果將可穩定地在2個clock後產出。

See Also

(原創) 如何設計乘加電路? (SOC) (Verilog) (MegaCore)

(原創) 如何處理signed integer的加法運算與overflow? (SOC) (Verilog)

(原創) 無號數及有號數的乘加運算電路設計 (IC Design) (Verilog) (OS) (Linux)

(原創) 如何用管線(Pipeline)實作無號數乘加運算? (IC Design) (Verilog)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐