Vector3(部分选择)
使用部分选择来选择向量的部分。串联运算符{a,b,c}用于通过将向量的较小部分串联在一起来创建更大的向量。
{3'b111,3'b000} => 6'b111000 {1'b1,1'b0,3'b101} => 5'b10101 {4'ha,4'd10} => 8'b10101010 // 4'ha和4'd10均为二进制的4'b1010
串联需要知道每个分量的宽度(或者您怎么知道结果的长度?)。因此,{1、2、3}是非法的,并导致出现错误消息:串联中不允许使用不定尺寸的常量。
可以在分配的左侧和右侧使用串联运算符。
input [15:0] in; output [23:0] out; assign {out[7:0], out[15:8]} = in; // Swap two bytes. Right side and left side are both 16-bit vectors. assign out[15:0] = {in[7:0], in[15:8]}; // This is the same thing. assign out = {in[7:0], in[15:8]}; // This is different. The 16-bit vector on the right is extended to // match the 24-bit vector on the left, so out[23:16] are zero. // In the first two examples, out[23:16] are not assigned
A Bit of Practice
给定几个输入向量,将它们连接在一起,然后将它们分成几个输出向量。有六个5位输入向量:a,b,c,d,e和f,总共有30位输入。有四个8位输出向量:w,x,y和z,用于32位输出。输出应该是输入向量的串联,后跟两个1位:
module top_module ( input [4:0] a, b, c, d, e, f, output [7:0] w, x, y, z );// assign {w,x,y,z} = { a, b, c, d, e, f,2'b11}; endmodule
矢量反转
给定8位输入向量[7:0],请反转其位顺序。
tips:
分配out [7:0] = in [0:7]; 由于Verilog不允许翻转向量位顺序,因此无法正常工作。
串联运算符可以节省一些编码,允许使用1个assign语句而不是8个。
module top_module( input [7:0] in, output [7:0] out ); assign out = {in[0],in[1],in[2],in[3],in[4],in[5],in[6],in[7]}; endmodule
复制运算符
所述并置(或者复制)运算符允许矢量串联起来以形成更大的载体。但是有时候您想将同一事物连接在一起很多次,而做类似分配a = {b,b,b,b,b,b,b}的事情仍然很乏味;。复制运算符允许重复一个向量并将它们串联在一起:
{num {vector}}
这种复制载体由NUM倍。num必须为常数。两组嵌套都是必需的。
Examples:
{5{1'b1}} // 5'b11111 (or 5'd31 or 5'h1f) {2{a,b,c}} // The same as {a,b,c,a,b,c} {3'd5, {2{3'd6}}} // 9'b101_110_110. It's a concatenation of 101 with // the second vector, which is two copies of 3'b110.
一个复制运算符的常见用法是将一个较小的数字符号扩展为一个较大的数字,同时保留其符号值。这是通过将较小数字的符号位(最高有效位)复制到左侧来完成的。例如,符号扩展4’B 0 101(5),以8位结果在8’b 0000 0101(5),而符号扩展4’B 1 101在(-3)至8位结果8’b 1111 1101(-3)。
建立一个将8位数字符号扩展为32位的电路。这需要串联24个符号位的副本(即,复制bit [7] 24次),然后是8位数字本身。
module top_module ( input [7:0] in, output [31:0] out );// assign out = { {24{in[7]}} ,in }; endmodule
复制操作
给定五个1位信号(a,b,c,d和e),在25位输出向量中计算所有25个成对的一位比较。如果要比较的两位相等,则输出应为1。
如图所示,使用复制和串联运算符可以更轻松地完成此操作。
顶部向量是每个输入的5个重复的串联谁
底部向量是5个重复的输入
module top_module ( input a, b, c, d, e, output [24:0] out );// // The output is XNOR of two vectors created by // concatenating and replicating the five inputs. assign out = ~{{5{a}} ,{5{b}} ,{5{c}} ,{5{d}} ,{5{e}}} ^ { {5{a,b,c,d,e}} }; endmodule