ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(转载)如何使用integer型別? (IC Design) (Verilog)

2021-08-17 21:31:07  阅读:434  来源: 互联网

标签:型別 Shift reg4 Register Design Verilog input integer reg


Abstract
在C/C++或任何程式語言,integer是最常用的型別之一,但在Verilog大部分用的都是wire和reg,很少用到integer,該如何正確地使用integer呢?

Introduction
首先,integer和reg與wire最大的差別是,integer本身是個32位元的有號數,含正負。

實務上,若在RTL中,integer建議只出現於for loop中,用來複製電路,讓程式精簡一些,在其他地方使用這種類型的的變數,容易出現與設計者意料之外的情況[1]。

如一個4 bit serial in / serial out的shift register
Verilog / Shift_Register_SISO.v

 
 1 /* 
 2 (C) OOMusou 2008 http://oomusou.cnblogs.com
 3 
 4 Filename    : Shift_Register_SISO.v
 5 Compiler    : Quartus II 7.2 SP1
 6 Description : Shift register / serial in serial out
 7 Release     : 05/27/2008 1.0
 8 */
 9 
10 module Shift_Register_SISO (
11   iCLK,
12   iRESET_n,
13   iSI,
14   oSO
15 );
16 
17 input iCLK;
18 input iRESET_n;
19 input iSI;
20 output reg oSO;
21 
22 reg [3:0] reg4;
23 
24 always@(posedge iCLK) begin
25   if (!iRESET_n) 
26     reg4 <= 4'h0;
27   else begin
28     reg4[0] <= iSI;
29     reg4[1] <= reg4[0];
30     reg4[2] <= reg4[1];
31     reg4[3] <= reg4[2];
32     oSO     <= reg4[3];
33   end
34 end
35 
36 endmodule

 


若使用integer配合for loop後,可將程式精簡成
Verilog / Shift_Register_SISO.v

 
1 /* 
 2 (C) OOMusou 2008 http://oomusou.cnblogs.com
 3 
 4 Filename    : Shift_Register_SISO2.v
 5 Compiler    : Quartus II 7.2 SP1
 6 Description : Shift register / serial in serial out
 7 Release     : 05/27/2008 1.0
 8 */
 9 
10 module Shift_Register_SISO2 (
11   iCLK,
12   iRESET_n,
13   iSI,
14   oSO
15 );
16 
17 input iCLK;
18 input iRESET_n;
19 input iSI;
20 output reg oSO;
21 
22 reg [3:0] reg4;
23 
24 always@(posedge iCLK) begin
25   integer i;
26   
27   if (!iRESET_n) 
28     reg4 <= 4'h0;
29   else begin
30     
31     reg4[0] <= iSI;
32     
33     for(i = 0; i < 3; i = i + 1) 
34       reg4[i+1] <= reg4[i];
35       
36     oSO <= reg4[3];
37   end
38 end
39 
40 endmodule

 

原來的29 ~ 31行

reg4[1] <= reg4[0];
reg4[2] <= reg4[1];
reg4[3] <= reg4[2];

 

最後精簡成

 
for(i = 0; i < 3; i = i + 1) 
  reg4[i+1] <= reg4[i];   

 

這兩個程式將來合成出來的硬體電路完全一樣,只是程式比較精簡些,適合用來複製電路。

另外一個初學者常疏忽的地方,原本想設計一個8位元的計數器,因為使用了integer卻得到一個32位元計數器,除了引起設計錯誤,也耗用了更多的資源。[1]

1 integer counter;
2 
3 always@(posedge clk) begin
4   if (counter < 200)
5     counter <= counter + 1;
6   else
7     counter <= 0;
8 end

 

應該改成

1 reg[7:0] counter;
2 
3 always@(posedge clk) begin
4   if (counter < 200)
5     counter <= counter + 1;
6   else
7     counter <= 0;
8 end

 


Conclusion
在RTL中,建議integer只配合for loop使用來複製電路,其他都應該使用wire或reg。

See Also
(原創) wire與reg的差異? (初級) (IC Design) (Verilog)

Reference
[1] 王钿、卓興旺 2007 ,基於Verilog HDL的數字系統應用設計(第二版),國防工業出版社

转自:https://www.cnblogs.com/oomusou/archive/2008/05/27/verilog_integer.html

标签:型別,Shift,reg4,Register,Design,Verilog,input,integer,reg
来源: https://www.cnblogs.com/lcq-manji/p/15154290.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有