写在前面的话
缩减运算符是单目运算符,也有与或非运算。其与或非运算规则类似于位运算符的与或非运算规则,但其运算过程不同。位运算是对操作数的相应位进行与或非运算,操作数是几位数则运算结果也是几位数。而缩减运算则不同,缩减运算是对单个操作数进行与或非递推运算,最后的运算结果是一位的二进制数。缩减运算的具体运算过程是这样的:第一步先将操作数的第一位与第二位进行与或非运算,第二步将运算结果与第三位进行与或非运算,依次类推,直到最后一位。例如:
reg[3:0]B;
reg C;
C=&B;
相当于
C=((B[0]&B[1])&B[2])&B[3];
工程实例
下面,梦翼师兄给大家编写一个实例,通过仿真波形来验证运算结果是否如我们所说。可综合模块代码如下
/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:缩减语句运算模块 *****************************************************/ 01 module reduce(clk,rst_n,c); 02 input clk;//系统时钟输入 03 input rst_n;//系统复位 04 05 output reg c;//输出寄存器定义 06 07 reg [3:0]B;//内部寄存器定义 08 09 always@(posedge clk or negedge rst_n) 10 begin 11 if(!rst_n) 12 begin 13 c<=0; 14 B<=4'b1111; 15 end 16 else 17 begin 18 c<=&B; 19 end 20 end 21 22 endmodule |
编写测试代码如下
/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:缩减语句测试模块 *****************************************************/ 01 `timescale 1ns/1ps 02 module tb; 03 reg clk; 04 reg rst_n; 05 06 wire c; 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 reduce reduce( 18 .clk(clk), 19 .rst_n(rst_n), 20 .c(c) 21 ); 22 endmodule |
查看仿真波形如下:
通过该波形可以看出,当变量B的四个位全部为高时,由于是“逻辑与”的运算,所以最终输出的变量C为高电平。
那么如果我们在变量B中加入一个零,结果会如何呢?我们仿真如下:
可以看到,如果变量B中存在零,那么输出结果由于“逻辑与”会得到低电平。