2016-03-18 18 views
0

1サイクル以上が必要かどうか、1サイクル以上かかるシフトを考慮する必要があるかどうかはわかりません。そして、一度に1ビット以上シフトすることが可能であれば、1ビットシフトすると、複数のビットをシフトするのと同じ量の遅延/ゲート時間がかかるでしょうか?Verilogでサイクルごとに1ビット以上シフトできますか?

答えて

1

組合せシフトを意味する場合、固定シフトには論理が全くありません。これは配線の単なる変更です。変数シフトを使用する場合は、<<(論理シフト左)、>>(論理シフト右)または>>>(算術右シフト)のVerilog演算子を使用できます。シンセサイザは、これらの演算子の組み合わせ回路を合成する必要があります。これは、必要とされる最大シフトと、シフトされるワードの長さに依存するが、サイズと遅延は関係する。その遅延が1クロックサイクル以上であるかどうかは、クロックの周波数によって異なります。あなたが非常に速いクロックまたは非常に長い最大シフトを持っていない限り、遅れはたぶんクロックサイクルよりも簡単です。ここ

は、Verilogで組み合わせ左シフタである:

module ones_shift #(log2_width=2) (input [(2**log2_width)-1:0] A, input [log2_width:0] SHIFT, output [(2**log2_width)-1:0] As); 

    assign As = A << SHIFT; 

endmodule 

http://www.edaplayground.com/x/24P8

シフタAs出力を与えるために、SHIFT入力によって表される場所の数でA入力をシフトします。

シフトレジスタ(順序回路)を意味する場合は、クロックサイクルごとに1シフトが得られます。 LOAD入力がハイである場合

module SHIFT_REG #(SIZE = 16) (input LOAD, SHIFT, CLOCK, RESET, [SIZE-1:0] A, output reg [SIZE-1:0] As); 

    always @(posedge CLOCK or posedge RESET) 
    if (RESET) 
     As <= {SIZE{1'b0}}; 
    else 
     if (LOAD) 
     As <= A; 
     else 
     if (SHIFT) 
      As <= {As[SIZE-2:0],1'b0}; 

endmodule 

http://www.edaplayground.com/x/2bAW

A入力シフトレジスタにロードされる:ここ

は、Verilogのシフトレジスタです。 SHIFT入力がハイの場合、レジスタは左にシフトします(CLOCKサイクルあたり1ビット)。 Asの出力は、シフトレジスタからのパラレル出力です。 RESET入力はアクティブハイです。

+0

私はレジスタに5(<< 5)の左シフトをしなければならないとします。これは5サイクルか1サイクルかかりますか?シンセサイザーはそれをシフトレジスタとして扱いますか、それとも1サイクルしかかからないトリックを行いますか? –

+0

@Brian Craftonシンセサイザーはこのような決定をしません。必ず。 HDLを使用してデザインするときは、抽象度の高いレベルで設計しますが、それほど高くはありません。私はVerilogで組み合わせシフトとシフトレジスタの両方の例を挙げることができましたが、今ではそうです。 –

+0

@Brian Crafton私はいくつかの例を追加しました。それが助けにならないのであれば、おそらくあなたの質問についてもう少し詳細を提供することができます。あなたは何を変えていますか?どうして? –