注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

dp: 生活的脚步,进步的点滴...

Cam、DSP、FPGA、PM、Life、More ...

 
 
 

日志

 
 

Verilog如何实现加法运算?  

2013-03-28 09:29:26|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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 <= a + 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後產出。

  评论这张
 
阅读(524)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016