EDITORIAL言葉
シフト演算は、ビットの指定された数のオペランドを左オペレータを用いて、左または右、バイナリ演算子である自由な位置を補充する0。右側のオペランドはXまたはZである場合、結果は未知の変位Xです。事業者がそれにこの機能を注意を払う必要があることに加えて、それはアイドルビットはゼロで埋め、それは限りシフトしてきた、そして最終的にはすべてがゼロになるように、関係なく、元の値のどのくらいの、2進数を言うことです。
シフト演算子の例
Verilog HDLのは、2つのシフト演算子があります: <<(左論理シフト)>>と(論理右シフト)。次のように書かれた例スリーパー翼の兄弟は、次のとおりです。
/ ************************************************* *** *エンジニア: ドリーム・ブラザーウイング * QQ:761664056 *モジュール機能:シフト演算子モジュール ************************************************** *** / 01 モジュールの シフト( CLK 、 RST_N 、、 B )。 02 入力 CLK 。 03 入力 RST_N 。 04 05 出力 REG [ 3 : 0 ] 。 06 出力 REG [ 3 : 0 ] B 。 07 08 常に(@ posedgeの CLK または negedgeの RST_N ) 09 始めます 10 もし(! RST_N ) 11 始めます 12 <= 1 。 13件のB <= 4 。 14 終了 15 他 16 始めます 17 a<=(a<<1); 18 b<=(b>>1); 19 end 20 end 21 endmodule |
编写测试代码如下
/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * E_mail : [email protected] * The module function:移位运算符测试模块 *****************************************************/ 01 `timescale 1ns/1ps 02 module tb; 03 reg clk; 04 reg rst_n; 05 06 wire [3:0]a; 07 wire [3:0]b; 08 09 initial 10 begin 11 clk=0; 12 rst_n=0; 13 # 1000.1 rst_n=1; 14 end 15 16 always # 10 clk=~clk; 17 18 shift shift( 19 .clk(clk), 20 .rst_n(rst_n), 21 .a(a), 22 .b(b) 23 ); 24 25 endmodule |
查看仿真波形如下
从仿真图,可以看出,每次a都向左边移动移位,后面补充0,直到把逻辑1溢出,后面就一直为0了。每次b都向右边移动移位,前面补充0,直到把逻辑1溢出,就一直为0了。
总结:移位运算符的使用时,左移一位可以看成是乘以2,右移一位可以看成是除以2。所以移位运算符用在计算中,代替乘法和除法。尤其是除法,使用移位的方式,可以节省资源。但使用的前提是数据位宽要进行拓展哦,不然就全部是零了。