11,拼接运算符简介
注:学习、交流就在博主的个人weixin公众号 “FPGA动力联盟” 留言或直接+博主weixin “fpga_start” 私信~
所谓的拼接运算符,其实就是一个大括号“{}”,主要功能是把多个信号按照一定的顺序,合并成一个信号:
{signal_1,signal_2,……}
其中,信号signal既可以是常数也可以是变量,但是位宽必须已知且不可变。下面给出一个简单的例子:
wire[2:0] a;wire[3:0] b;assign b= {1’b1,a[2:0]};
| 假设a的值如下 | 获得的b的值如下 |
| a=3’b111 | B=4’b1111 |
| a=3’b011 | B=4’b1011 |
| a=3’b010 | B=4’b1010 |
在verilog语言中,拼接运算符是很好用、很常用的,但是其用法比较苛刻,因此常常遇到编译不过的问题。“位宽必须已知且不可变”这个要求非常重要,实践中无数次拼接运算符的报错就是不满足上面的要求。下面给出一些错误的情况:
| 错误写法 | {1,a[2:0]} | {8’b0000_0010,b} |
| 原因 | 1没有指定位长 | b没有指定位长 |
| 正确表达 | {32’b1,a[2:0]} | {8’b0000_0010,b[2:0]} |
与拼接操作经常一起使用的是重复操作,也用拼接的操作符大括号对“{}”,其一般格式是:
replication_time{signal}
其中信号signal既可以是常数也可以是变量,但位宽必须已知且不可变;重复次数replication_time必须是常数。下面给出例子:
wire[2:0] a;
wire[3:0] b;
assign b= {1’b1,a[2:0]};
| 假设a的值如下 | 表达式 | 获得b的值 |
| a=2’b10 | b=8{a[0]} | b=8’b0000_0000 |
| a=2’b10 | b=4{a[1:0]} | b=8’b1010_1010 |
注意:如果把重复操作嵌入拼接操作,需要用大括号把重复操作整体括起来,比如需要表示如下:
{8{a[0]}}
否则会出错!
另外重复次数为常数这个要求也非常重要,其中parameter类型也算常数,例子如下:
| 重复次数定义 | 重复操作 | 合法性 |
| wire [2:0] num_wire; assign num_wire=4; | { num_wire {1’b1}} | 非法 |
| reg [2:0] num_reg=4; | { num_reg {1’b1}} | 非法 |
| parameter num_par=4; | { num_par {1’b1}} | 合法 |
“Verilog语言玩的好不好,看的就是代码里的拼接操作搞的溜不溜”。平时开发逻辑代码的时候要多用拼接操作,有时候会事半功倍。但是,拼接操作在代码中的最大问题就是:代码的可读性会降低。所以使用拼接操作时,请一定要加上注释!
参考文献:
1,verilog传奇——从电路出发的HDL代码设计
2,verilog编程艺术
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
