一般來講,如果要實現移位寄存器的話,通常都是寫RTL用reg來構造,比如1bit變量移位一個時鐘周期就用1個reg,也就是一個寄存器FF資源,而移位16個時鐘周期就需要16個FF,這種方法無疑非常浪費資源。
Xilinx FPGA的SLICEM中的一個查找表LUT可以配置為最多移位32個時鐘周期的移位寄存器,這比直接用FF來搭省了31個FF資源。
這種方法可以通過調用原語SRL16E(最多16個周期)和SRLC32E(最多32個周期)來實現。
SRL16E #( .INIT(16'h0000), // Initial contents of shift register .IS_CLK_INVERTED(1'b0) // Optional inversion for CLK ) SRL16E_inst ( .Q(Q), // 1-bit output: SRL Data .CE(CE), // 1-bit input: Clock enable .CLK(CLK), // 1-bit input: Clock .D(D), // 1-bit input: SRL Data // Depth Selection inputs: A0-A3 select SRL depth .A0(A0), .A1(A1), .A2(A2), .A3(A3) ); // End of SRL16E_inst instantiation
// SRLC32E: 32-bit variable length cascadable shift register LUT (Mapped to a SliceM LUT6) // with clock enable SRLC32E #( .INIT(32'h00000000) // Initial Value of Shift Register ) SRLC32E_inst ( .Q(Q), // SRL data output .Q31(Q31), // SRL cascade output pin .A(A), // 5-bit shift depth select input .CE(CE), // Clock enable input .CLK(CLK), // Clock input .D(D) // SRL data input ); // End of SRLC32E_inst instantiation
如果需要實現更多時鐘周期的移位寄存器,則可以使用多個SRLC32E或者SRL16E來級聯實現。
IP核的定制
除了用原語實現外,還可以調用RAM-Based Shift Register這個IP核來實現。IP核實現方法使用不如原語方便,但是其對實現方式做了一些優化,具有比原語更好的時序性能。
第一頁內容
Shift Register Type:fixed length為固定長度;variable length lossless為可變長度
optimization:只有選擇可變長度時才可選,可以選擇優化面積還是優化時序。如果優化時序,則可能會多幾個延遲latency。
clocking options:Register last bit只有選擇可變長度時才可選,會把輸出寄存一拍以改善時序,同時增加一個時鐘的延遲。clock enable(CE)時鐘使能功能。
dimensions:width移位寄存器寬度,depth移位寄存器深度。
latency information:延遲信息,根據各個選項的不同,輸出延遲可能會增加1~3個時鐘周期。
第二頁內容
initialization options:初始化選項,選擇初始化的進制radix和默認值default data。
COE file:初始化的值還可以選擇從COE文件來載入。
第三頁
power-on reset settings:上電復位設置選項,選擇上電復位的進制radix和初始值init data。
synchronous settings:同步設置,可以設置同步復位SCLR和同步置位SSET,二者的優先級可選,默認復位優先級高于置位,如果選擇置位優先級更高,則會消耗多余的資源。復位/置位與初始化SINT二者之間互斥。這三個選項一般都沒必要用。
synchronous controls(sync) and clock enable(CE) priority:選擇同步控制信號和CE信號的優先級。默認同步控制信號的優先級高于CE,反之則會消耗多余的資源。
IP核的仿真使用
定制一個深度為64,位寬為16的IP核,然后編寫RTL代碼:
//固定的深度64個時鐘周期,位寬16的移位寄存器IP核設計 module shift_w16_d64( inputclk,//時鐘信號 input[15:0]in,//移位前的輸入數據,位寬為16 inputce,//時鐘使能信號 output[15:0]out//移位后的輸出,位寬為16 ); //移位寄存器IP;固定移位64個時鐘周期,位寬16 c_shift_ram_1 your_instance_name ( .D(in),//移位前的輸入數據,位寬為16 .CLK(clk),//時鐘信號 .CE(ce),//時鐘使能信號 .Q(out)//移位后的輸出,位寬為16 ); endmodule
綜合后的資源使用情況:32個LUT + 32個FF。
看下綜合后的電路圖:
因為1個SRLC32E可以實現32個周期的移位,所以16×64的移位操作實際上只需要32個SRLC32E就可以實現了,為了改善時序性能,IP核在輸入端口和輸出端口一共用了2×16 = 32個FF來打拍寄存。
接下來編寫TB:時鐘使能信號一直拉高,輸入數據從1開始累加。
`timescale 1ns/1ns module tb_shift_w16_d64(); //信號聲明 regclk; regrst; reg[15:0]in; regce; wire[15:0]out; //被測模塊實例化 shift_w16_d64inst_shift_w16_d64( .clk(clk), .in(in), .ce(ce), .out(out) ); //生成時鐘信號 initial begin clk= 1'b0; forever #5 clk = ~clk; end //生成復位信號 initial begin rst = 1'b1;//復位 #45 rst = 1'b0; //取消復位 end //生成輸入數據與時鐘使能信號 always @(posedge clk or posedge rst)begin if(rst)begin in <= 16'd0; ce <= 1'b0; end else begin in <= in + 1'b1;//輸入數據累加1 ce <= 1'b1;//時鐘使能信號一直拉高 end end //仿真過程 initial begin #1000 $stop;//關閉仿真 end endmodule
仿真結果如下:
原文鏈接:
https://gitcode.csdn.net/65e6e9d51a836825ed787cef.html
-
寄存器
+關注
關注
31文章
5362瀏覽量
120900 -
Xilinx
+關注
關注
71文章
2170瀏覽量
121875 -
IP核
+關注
關注
4文章
331瀏覽量
49575
原文標題:RAM-Based Shift Register Xilinx IP核的使用
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論