///
1,FPGA_Verilog基础篇:Verilog发展进程-CSDN博客
2,FPGA_Verilog基础篇:理解Verilog的四值逻辑-CSDN博客
3,FPGA_Verilog基础篇:Verilog中数值的表示-CSDN博客
4,FPGA_Verilog基础篇:信号声明类型-CSDN博客
5,FPGA_Verilog基础篇:模块的端口声明-CSDN博客
6,FPGA_Verilog基础篇:verilog语言的操作符-CSDN博客
7,FPGA_Verilog基础篇:verilog基本逻辑运算-CSDN博客
8,FPGA_Verilog基础篇:verilog关系操作的逻辑运算实现-CSDN博客
9,FPGA_Verilog基础篇:veriolg算术运算-CSDN博客
10,FPGA_Verilog基础篇:verilog移位操作-CSDN博客
11,FPGA_Verilog基础篇:关系操作符简介-CSDN博客
12,FPGA_Verilog基础篇:拼接运算符简介-CSDN博客
13,FPGA_Verilog基础篇:verilog数值的位宽扩展规则-CSDN博客
14,FPGA_Verilog基础篇:verilog移位与拼接实现-CSDN博客
15,FPGA_Verilog基础篇:verilog双向inout接口表示_fpga inout端口-CSDN博客
16,FPGA_Verilog基础篇:verilog之锁存器和触发器-CSDN博客
17,FPGA_Verilog基础篇:verilog之for循环-CSDN博客
18,FPGA_Verilog基础篇:verilog之函数用法-CSDN博客
19,FPGA_Verilog基础篇:verilog之任务用法-CSDN博客
20,FPGA_Verilog基础篇:verilog之任务与函数用法比较-CSDN博客
21,FPGA_Verilog基础篇:verilog之宏define介绍-CSDN博客
22,FPGA_Verilog基础篇:verilog之条件编译指令介绍-CSDN博客
23,FPGA_Verilog基础篇:verilog之参数parameter介绍-CSDN博客
24,FPGA_Verilog基础篇:verilog之本地参数localparam-CSDN博客
25,FPGA_Verilog基础篇:verilog之generate生成块-CSDN博客
26,FPGA_Verilog基础篇:verilog之常数规则-CSDN博客
27,FPGA_Verilog基础篇:verilog中整数运算的位宽和符号规则-CSDN博客
28,FPGA_Verilog基础篇:verilog中的字符串表示-CSDN博客
29,FPGA_Verilog基础篇:verilog中带整数的算术表达式分析-CSDN博客
30(结束篇),FPGA_Verilog基础篇:verilog中的数值运算规则总结-CSDN博客
///
所谓的拼接运算符,其实就是一个大括号“{}”,主要功能是把多个信号按照一定的顺序,合并成一个信号:
{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 [1:0] a;
wire [7:0] b;
假设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语言玩的好不好,看的就是代码里的拼接操作搞的溜不溜”。平时开发逻辑代码的时候要多用拼接操作,有时候会事半功倍。但是,拼接操作在代码中的最大问题就是:代码的可读性会降低。所以使用拼接操作时,请一定要加上注释!
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起学习、一起进步吧~