2016-03-18 122 views

回答

1

如果你的意思是一個組合換檔,那麼一個固定的換檔完全不需要邏輯:它只是佈線的一些變化。如果你想要一個變量移位,那麼你可以使用這些Verilog運算符:<<(邏輯左移),>>(邏輯右移)或>>>(算術右移)。你的合成器應該爲這些操作員合成一個組合電路。這個大小和延遲因此將取決於所需的最大移位和要移動的單詞的長度。延遲是否超過一個時鐘週期取決於您的時鐘頻率。除非你有一個非常快的時鐘或很長的最大移位,否則延遲可能會輕易小於一個時鐘週期。

這裏是一個組合左移位器以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

換檔器通過由所述輸入SHIFT表示的位數的移位輸入A,得到As輸出。

如果你的意思是一個移位寄存器(是一個時序電路),那麼你將在每個時鐘週期產生一次移位。

這裏是用Verilog移位寄存器:

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

如果LOAD輸入爲高時,輸入A加載到移位寄存器。如果SHIFT輸入爲高電平,則寄存器向左移動(每CLOCK週期一位)。 As輸出是移位寄存器的並行輸出。 RESET輸入爲高電平有效。

+0

假設我要在一個寄存器上做左移5(<< 5)。這需要5個週期還是1個週期?合成器會把它當作一個移位寄存器嗎?還是它會做一些讓它只需要一個週期的技巧? –

+0

@Brian Crafton合成器不會做出這樣的決定;你必須。當您使用HDL進行設計時,您正在進行更高層次的抽象設計,但並不是那麼高。我現在可以在Verilog中給出組合移位和移位寄存器的例子。 –

+0

@Brian Crafton我已經添加了一些例子。如果這沒有幫助,也許你可以提供一些關於你的問題的更多細節。你在轉移什麼?爲什麼? –

相關問題