为什么Verilog输入输出要加锁存器?

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
复制代码


合成結果
add_3_02  
Simulation結果

add_3_01

結果雖然有很多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
复制代码


合成結果

add_3_03

Simulation結果

add_3_04

前面結果還正確,但紅色部分結果是錯的,顯然只在輸出加上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  <= + b;
30     end
31  end
32 
33  endmodule
复制代码


合成結果

add_3_05

Simulation結果

add_3_06

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

add9

為什麼輸入與輸出都要加上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後產出。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值