写在前面的话
位拼运算符是将多个小的表达式合并形成一个大的表达式,用符号{}来实现多个表达式的连接运算,各个表达式之间用“,”隔开。位拼运算符是梦翼师兄特别喜欢的一种运算符,它聪慧灵秀,不但可以进行简单的数据拼接,更是可以用来执行移位操作,而且数据永远是循环的,不会丢失,用途非常广泛。
代码实例
/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:位拼接运算符模块 *****************************************************/ 01 module shift(clk,rst_n,led_out); 02 input clk;//系统输入 03 input rst_n;//系统复位 04 05 output reg [3:0]led_out;//led驱动端口 06 07 always@(posedge clk or negedge rst_n) 08 begin 09 if(!rst_n) 10 begin 11 led_out<=4'b0111;//让其中一盏灯点亮 12 end 13 else 14 begin 15 led_out<={led_out[0],led_out[3:1]};//实现流水灯 16 end 17 end 18 endmodule |
编写测试代码如下
/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:位拼接运算符测试模块 *****************************************************/ 01 `timescale 1ns/1ps 02 module tb; 03 reg clk; 04 reg rst_n; 05 06 wire [3:0]led_out; 07 08 initial 09 begin 10 clk=0; 11 rst_n=0; 12 # 1000.1 rst_n=1; 13 end 14 15 always #10 clk=~clk; 16 17 shift shift( 18 .clk(clk), 19 .rst_n(rst_n), 20 .led_out(led_out) 21 ); 22 endmodule |
查看仿真波形如下:
从仿真图可以看出,每个时钟周期,0都会向右移动一位。到最右边时就会放返回最左边继续循环,使用拼位的运算符,在很多场合-如串并转换等,会使代码编写变得简单。
代码的意思是,每次把最低位放到最高位,让前三位放到后面,这样逻辑就实现了移位,形成了循环。