加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Verilog中的寄存器数组 【转】

(2013-01-16 20:24:09)
标签:

杂谈

分类: FPGA
最近,在看同步FIFO时,需要定义一个寄存器数组,类似地reg  [7:0] mem [15:0],对一些基本概念不清楚,不知是如何实现的。

一直不清楚Verilog中寄存器数组是如何实现的。标准中只提到,例如定义一个寄存器数组(最多二维):reg [3:0] memery [9:0]。并说不能直接给这样的寄存器数组赋0。在实际使用中发现,第一个范围表示寄存器内数据的位宽[3:0]表示4bit一个数据,第二个范围表示地址(个数)范围。

这里有一些隐含的意思,这些在标准里没有提到(可能制定标准的人认为大家都明白),位宽很好理解,但要注意位宽的范围一定是从0到一个正整数的,而地址范围则可以从任意正整数到任意正整数!例如:

reg [3:0] memery [9:0]和reg [3:0] memery [0:9]与reg [3:0] memery [10:1]都表示同样大小的寄存器数组,而前两个完全等价,第三个在使用的时候首地址是从1开始而已。虽然这样的定义有很大的随意性,但为了审查直观,可以在定义位宽范围的时候把高位放在前面,因为这样可以一目了然的看出位宽。在定义地址范围的时候可以把低位放前面,这样符合一般思维习惯。即第二种定义方式。

寄存器数组在使用的时候,有个很重要的简写例如上述定义中,memory[0]表示第一个位置上的一个4位的数,它可以赋值给一个4位的寄存器,例如:

定义:

reg [3:0] memory [0:9];

reg [3:0] a;

赋值:

a = memory[0];

最后要注意到是,所有的范围参数必须是常量(parameter,localparam等),不能是变量。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有