一、移位器(shifter)
作用:移位器和循環移位器用於移動位並完成2的冪的乘法或除法。
分類:
邏輯移位器——左移(LSL)或右移(LSR),以0填充空位。11001 LSR 2 =00110; 11001 LSL 2 = 00100;(veilog 操作符號>> or <<)
算數移位器——算數左移(ASL)與邏輯左移相同,但算數右移(ASR)時會把原來數據的最高有效位填充在數據的最高有效位上,對於有符號數的乘法或除法有用。11001 ASR 2 = 11110; 11001 ASL 2 =00100;(verilog操作符號>>> or <<<)
循環移位器——循環移動數字,從一端移走的位重新填充到另一端的空位。11001 ROR 2 = 01110;11001 ROL 2 = 00111。
二、移位寄存器(shift register)
輸入:包括時鍾clk,串行輸入Sin,串行輸出Sout和N位並行輸出QN-1:0。
工作原理:在時鍾的邊沿,從Sin移入一個新的位,所有后續內容都向前移動,最后一位在Sout中。
作用:可以作為串行到並行(serial-to-parrallel)的轉換器,輸入由Sin提供,經N個周期后,前面的N位輸入可以在Q中進行並行訪問。
組成:如圖5-34所示,N位的移位寄存器由N個觸發器串聯而成,有些移位寄存器還有觸發器的復位信號。
相關電路:包含並行到串行轉換器(parrallel-to-serial)的移位寄存器,並行加載N位,然后依次移出一位。
工作原理:相比於移位寄存器增加了並行輸入DN-1:0和控制信號Load。當Load信號有效時,觸發器從D中並行加載數據;否則正常移位。
通用移位寄存器
作用:后續補全
//通用移位寄存器
module Universal_Shift_Reg#(parameter word_size = 8)( output reg[word_size-1:0] Data_out, output MSB_out, LSB_out, input [word_size-1:0] Data_in, input MSB_in, LSB_in, input s0, s1, clk, rst ); assign MSB_out = Data_out[word_size-1]; assign LSB_out = Data_out[0]; always @(posedge clk) begin if(rst==1'b1) Data_out <= 0; else case({s1, s0}) 0: Data_out <= Data_out; //maintain 1: Data_out <= {MSB_in, Data_out[word_size-1:1]}; //MSB shift 2: Data_out <= {Data_out[word_size-2:0], LSB_in}; //LSB shift 3: Data_out <= Data_in; //parallel input endcase end endmodule
移位寄存器
作用
module shift_reg#(parameter word_size = 4)( output reg_out, input clk, rst,reg_in ); reg [word_size-1:0] reg_data;
assign reg_out = reg_data[0]; always @(posedge clk, negedge rst) if(!rst) reg_data <= {word_size{1'b0}}; //nonblock assignment else reg_data <= {reg_in, reg_data[word_size-1:1]}; endmodule
桶形移位寄存器
作用
module barrel_reg #(parameter word_size = 8)( output reg [word_size-1:0] data_out, input [word_size-1:0] data_in, input load, clk, rst );
always @(posedge clk, posedge rst) begin if(rst) data_out <= {word_size{1'b0}}; else if(load) data_out <= {data_in[word_size-2:0], data_in[word_size-1]}; end endmodule
算術移位寄存器
// 移一位和八位的算數寄存器 module top_module( input clk, input load, input ena, input [1:0] amount, input [63:0] data, output reg [63:0] q); always @(posedge clk) if(load) q <= data; else if(ena) begin case(amount) 2'b00: q <= {q[62:0], 1'b0}; 2'b01: q <= {q[55:0], 8'b0}; 2'b10: q <= {q[63], q[63:1]}; 2'b11: q <= {{8{q[63]}}, q[63:8]}; endcase end else q <= q; endmodule
掃描鏈(scan chain)
作用:通過掃描鏈技術,移位寄存器經常用於測試時序電路。
原因:由於時序電路中存在狀態,測試相對困難。從一個已知的初始裝填開始,可能需要許多周期的測試向量才能使電路進入期望狀態。為解決這一問題,希望可以通過增加測試模式來實現直接觀察和控制有限狀態機的所有狀態。。然而由於系統中觸發器太多以至於無法為每個觸發器分配一個管腳進行讀寫。但是,系統中所有觸發器都連接在掃描鏈的以為寄存器中。
測試模式:允許自由地向所有觸發器的內容讀出或者加載所需要的值。在測試模式中,掃描鏈通過Sin和Sout串行地移出內容或寫入新的內容。