关闭

如何使用integer类型

439人阅读 评论(0) 收藏 举报

bstract
在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 
 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:0reg4;
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 
 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:0reg4;
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 031
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 031
  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:0counter;
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)


上面的转载的,integer 类型可以在=赋值,在always块中可以同时使用《=赋值。》

0
0
查看评论

Integer执行++操作解析

Integer执行自加操作
  • ivuqiumei
  • ivuqiumei
  • 2016-08-23 14:02
  • 1740

Integer类型用 “==” 比较的问题

面试题目,Integer类型判断 == 的问题
  • shenhai430
  • shenhai430
  • 2016-01-14 10:06
  • 3296

Integer类型数据相等问题

今天很奇怪   遇到有时候  Integer类型的数据有时候可以相等,有时候不能相等。   测试才知道有猫腻。 public class TestInteger {     public static void main(String[]...
  • shaowei213
  • shaowei213
  • 2014-09-18 01:01
  • 2741

Java_Integer 类常用方法总结

借鉴视频:章节4  课时 63、64  尚学堂_高淇_包装类_Integer_Number_JDK源码分析.wmv(网易云课堂) Integer类:                 &...
  • qq_34287501
  • qq_34287501
  • 2016-11-29 21:17
  • 2110

Integer 类型数据比较相等的那些坑

public void testInter() { Integer a = new Integer(200); Integer b = new Integer(200); Integer c = 200; Integer e = 200; int d = 20...
  • u012031380
  • u012031380
  • 2017-06-23 16:11
  • 404

Integer类==与equals区别与使用

大家对java的基本类型与封装类都已经很熟悉了。但是在使用中是否了解其中一些基本原理呢。下面代码对不了解基本实现的人可能会颠覆对java的认知。代码如下。public static void test(){ Integer a=1; Integer b=1; Sy...
  • m_v_v_m
  • m_v_v_m
  • 2016-08-15 10:56
  • 3052

如何把String类型转化成Integer类型

如何把String类型转化成Integer类型  分享| 2015-03-28 16:03谽oO吺鱥 | 浏览 1436 次  编程语言 2015-03-28 16:44 提问者采纳 热心网友 ...
  • evilcry2012
  • evilcry2012
  • 2016-05-16 11:33
  • 717

integer类型数据的比较

今天犯了一个比较二的错误,用sort排序数组的时候,需要比较的业务数据是integer类型的, 一共用了两层业务排序。 第一层的排序是正确的,但是第二层怎么排序都不对, 在debug查看原因的时候,发现走的都是else。 才想起来业务数据是integer类型,我竟然傻傻的用==来判断值 ...
  • u011001723
  • u011001723
  • 2015-06-18 16:52
  • 360

JAVA中数据类型Integer与int的区别

Integer与int的区别   int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如...
  • s2940086379
  • s2940086379
  • 2015-05-22 13:31
  • 1716

MySQL 数据库设计之各种 INTEGER 类型最佳实践

MySQL 各种 INTEGER 类型占用存储空间、取值范围一览表最佳实践UNSIGNED 只能存储非负整数SIGNED 可以存储正整数、0、负整数对于总是正整数的存储(比如主键)的最佳实践是 UNSIGNED,因为这时它占用和 SIGNED 一样的存储空间,但取值范围多出一倍BOOL、BOOLEA...
  • defonds
  • defonds
  • 2015-08-28 17:10
  • 1611
    个人资料
    • 访问:57293次
    • 积分:1063
    • 等级:
    • 排名:千里之外
    • 原创:38篇
    • 转载:62篇
    • 译文:0篇
    • 评论:17条
    最新评论