寫在前面的話
縮減運算符是單目運算符,也有與或非運算。其與或非運算規則類似於位運算符的與或非運算規則,但其運算過程不同。位運算是對操作數的相應位進行與或非運算,操作數是幾位數則運算結果也是幾位數。而縮減運算則不同,縮減運算是對單個操作數進行與或非遞推運算,最后的運算結果是一位的二進制數。縮減運算的具體運算過程是這樣的:第一步先將操作數的第一位與第二位進行與或非運算,第二步將運算結果與第三位進行與或非運算,依次類推,直到最后一位。例如:
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中存在零,那么輸出結果由於“邏輯與”會得到低電平。
