前言
在Verilog中如何给一个多位的变量(如123bit)赋值呢?不能连续写123个1吧,此时需要位拼接运算。
一:位拼接运算符的定义
1:{}位拼接运算符用于将两个或多个信号拼接起来,表示一个整体的信号,如下:
a = {b[5],b[4:0]}
意思为 b的最高位b[5]和b的低五位拼接起来,组成的a为6位,相当于:
a = {b[5],b[4],b[3],b[2],b[1],b[0]}
2:即把某些倍号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号,例如:
{a, b[3:0], c, 3'b100}
也可以写成为:
{a, b[3],b[2], b[1],b[0],c, 1'b1,1'b0,1'b0}
3:将d_in的最高位和d_in的低7位取反加一拼接起来,拼接之后d_out为8位;
d_out={d_in[7],~d_in[6:0]+1'b1};
4:表示一个整体的信号例如一个一位全加器可以将进位输出和结果拼接在一起:
例如加法器:
module fulladder(a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
assign {cout, sum} = a + b + cin; // 进位输出与和拼接在一起
endmodule
6:使用重复数字法简化拼接表达式的书写
- 例如要表示4bit的w
{4{w}} <=> {w, w, w, w}
- 使用嵌套方式简化书写
{a, {3{b, c}}} <=> {a, b, c, b, c, b, c}
注意:
- 位拼接表达式中最好指明每个元素的具体位数,否则默认为32位二进制数
二:{{}}表示复制
1:{4{a}}等同于{a,a,a,a}
2:
16{a[15]} //等价于下面
{
a[15], a[15], a[15], a[15], a[15], a[15], a[15], a[15],
a[15], a[15], a[15], a[15], a[15], a[15], a[15], a[15]
}
3:
assign result = {{16{a[15]}}, {a[15:0]}};//等价于下面
assign result[ 0] = a[ 0];
assign result[ 1] = a[ 1];
assign result[ 2] = a[ 2];
assign result[ 3] = a[ 3];
assign result[ 4] = a[ 4];
assign result[ 5] = a[ 5];
assign result[ 6] = a[ 6];
assign result[ 7] = a[ 7];
assign result[ 8] = a[ 8];
assign result[ 9] = a[ 9];
assign result[10] = a[10];
assign result[11] = a[11];
assign result[12] = a[12];
assign result[13] = a[13];
assign result[14] = a[14];
assign result[15] = a[15];
assign result[16] = a[15];
assign result[17] = a[15];
assign result[18] = a[15];
assign result[19] = a[15];
assign result[20] = a[15];
assign result[21] = a[15];
assign result[22] = a[15];
assign result[23] = a[15];
assign result[24] = a[15];
assign result[25] = a[15];
assign result[26] = a[15];
assign result[27] = a[15];
assign result[28] = a[15];
assign result[29] = a[15];
assign result[30] = a[15];
assign result[31] = a[15];
花括号表示连接,从左侧的最高有效位(MSB)到右侧的最低有效位(LSB)。您正在创建一个32位总线(结果),其16个最高有效位由总线的第15位(MSB)的16个副本组成,其16个最低有效位仅由总线组成(此特定结构已知)作为符号扩展,例如,需要将负数以2的补码形式右移并保持为负而不是将零引入MSBits中