【方法】Verilog取变量位宽的时候含有变量怎么办
在Verilog里面,一般用reg来存储字符串。例如要存储4个字符的字符串,变量应该声明为reg [31:0] str。因为每个字符的宽度为8位,4个字符一共32位。最高位为第31位,最低位为第0位。
字符串在声明时可以给定初始值:reg [31:0] str = "this"
如果我们想要改变字符串中的某个字符,比如更改最后一个字符(称为第0个字符),可以写成str[7:0] = "d",字符串就变成了"thid"。
更改第3个字符:str[31:24] = "a",字符串变为"ahid"
更改第2个字符:str[23:16] = "b",字符串变为"abid"
更改第1个字符:str[15:8] = "c",字符串变为"abcd"
那如果我现在有变量i,想修改第i个字符该怎么办呢?写成str[8 * i + 7:8 * i],编译不通过,提示:ERROR: [VRFC 10-1775] range must be bounded by constant expressions
其实,正确的写法是:str[(8 * i)+:8],意思是从第8*i位开始,往上取8位出来。如果i=2,那么就是从第8*2=16位开始,往上取8位,一直取到第23位结束,也就是[23:16]这8位,刚好是第2个字符。
请看下面的代码:
reg [2:0] i;
reg [31:0] str;
initial beginfor (i = 0; i < 4; i = i + 1) beginstr[(8 * i)+:8] = "0" + i;end
end
运行结果:str为0x33323130,也就是"3210"这个字符串。
当然,也可以把加号改成减号,倒过来取:
reg [2:0] i;
reg [31:0] str;
initial beginfor (i = 0; i < 4; i = i + 1) beginstr[(8 * i + 7)-:8] = "0" + i;end
end
运行结果仍然是"3210"这个字符串。
这回,当i=2时,8*i+7=23,指定的是最高位,往下取8位,取的还是[23:16]这8位。
如果字符串中字符的个数小于寄存器的位宽,那么Verilog就会在字符串的前面填充"\0"。
例如,写str="has",那么就会在h的前面补一个0,最终寄存器的值就是0x00686173,也就是“\0has”。
所以,如果我们要在字符串末尾加一个字符,可以通过左移运算实现:str = (str << 8) | "e",字符串变成"hase"(0x68617365)。
也可以写成str = {str[23:0], "e"}。
去掉字符串的最后一个字符,直接右移8位就可以了:str = str >> 8,字符串从"\0has"变成"\0\0ha",也就是"ha"(0x00006861)。
【方法】Verilog取变量位宽的时候含有变量怎么办相关推荐
- 【FPGA】变量位宽问题
个人笔记. 如果想要实现处理多个有规律的位宽数据,比如处理a[7:0].a[14:7].a[21:14]...这样有规律的位宽,按正常的思路找其规律可以高位可写成7*i,低位可写成7*(i-1),i= ...
- 13,Verilog数据的位宽扩展规则
通常情况下,我们在实际工程中会遇到数据位宽扩展的问题(比如一个数是4bit,需要扩展为8bit),而且该数据既可能是有符号数,也可能是无符号数,此时我们该如何扩展呢?这就需要用到前面说到的拼接运算符了 ...
- 【Verilog】不同位宽操作数的按位操作
不同位宽操作数按位与,低位的未定义位会自动补0 ---IEEE Standard for Verilog® Hardware Description Language 例子: 测试代码 module ...
- Verilog定义计算位宽的函数clogb2
在很多情况下要计算输入输出的位宽,比如你写一个8*8的ram,那么地址需要三位去表示,那么这个函数的方便就体现出来了,你需要使用函数定义就好了. //位宽计算函数 function integer c ...
- Verilog基础:表达式位宽的确定(位宽拓展)
相关文章 Verilog基础:位宽拓展和有符号数运算的联系 Verilog基础:表达式符号的确定 Verilog基础:数据类型 表达式位宽 如果想要在计算表达式时获得和谐一致的结果,那么控制表达式中的 ...
- verilog 常见位宽问题集合
verilog 常见的位宽问题集合 1. 位宽不等 wire b[31:0]; assign b = 5'b0; 这种错误常见于赋值操作中. 2. 保留最低位 wire b; assign b = 3 ...
- asic设计:位宽不匹配
1. 对于长位宽赋值给短位宽的情况,无论左操作数.右操作数是有符号数还是无符号数,都是直接截断高位,而左操作数二进制所表示的实际十进制数据要看左操作数是无符号数还是有符号数,如果左操作数是无符号数,直 ...
- 解决FIFO读写位宽不等的问题
上周阿里面试官问ram两侧读写位宽不一样改如何解决?当时含糊了一下,事后再认真分析其中缘由. 思路 取读写位宽的最大公因数作为ram的位宽,控制读写指针的步进,并预测下一次的指针位置从而判断空满,和普 ...
- Verilog设计中如何匹配变量的位宽?($clog2系统函数)
1.位宽太小 在FPGA设计中,我们经常需要用寄存器来寄存某些"数量类"的变量,比如FIFO的深度啦.或者计数器的最大值啦:又或者输入输出信号也需要将位宽用parameter参数化 ...
最新文章
- 如何弄一个IPHONE 添加到桌面的图标
- rock-paper-scissors
- 通过js获取元素css3的transform rotate旋转角度方法
- Android 中查看内存的使用情况集经常使用adb命令
- Java学习笔记(四)--数据类型与运算符
- redis高级-内存淘汰策略
- python format用法
- 程序员讨论技术问题时说话都很直接,哪个国家都不例外
- C++ 高级数据类型(五)—— 数据结构
- opencv java ubuntu_Ubuntu 16.04配置OpenCV 3.1.0 for Java
- nodejs mysql 返回值_带有Mysql数据库返回值的Nodejs
- mybatis使用拦截器显示sql,使用druid配置连接信息
- js 经常用到的键盘码
- 运算符重载——左移运算符重载
- zynq操作系统: Linux驱动开发串口篇
- 欧洲批准最强粒子对撞机计划,造价210亿欧元,全长100公里,耗资巨大引争议...
- NYOJ71——独木舟上的旅行(贪心)
- 选项菜单OptionMenu
- 图像处理之_傅立叶变换
- 2977:生理周期(枚举)