一般來講,如果要實現(xiàn)移位寄存器的話,通常都是寫RTL用reg來構(gòu)造,比如1bit變量移位一個時鐘周期就用1個reg,也就是一個寄存器FF資源,而移位16個時鐘周期就需要16個FF,這種方法無疑非常浪費資源。
Xilinx FPGA的SLICEM中的一個查找表LUT可以配置為最多移位32個時鐘周期的移位寄存器,這比直接用FF來搭省了31個FF資源。
這種方法可以通過調(diào)用原語SRL16E(最多16個周期)和SRLC32E(最多32個周期)來實現(xiàn)。
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
如果需要實現(xiàn)更多時鐘周期的移位寄存器,則可以使用多個SRLC32E或者SRL16E來級聯(lián)實現(xiàn)。
IP核的定制
除了用原語實現(xiàn)外,還可以調(diào)用RAM-Based Shift Register這個IP核來實現(xiàn)。IP核實現(xiàn)方法使用不如原語方便,但是其對實現(xiàn)方式做了一些優(yōu)化,具有比原語更好的時序性能。
第一頁內(nèi)容

Shift Register Type:fixed length為固定長度;variable length lossless為可變長度
optimization:只有選擇可變長度時才可選,可以選擇優(yōu)化面積還是優(yōu)化時序。如果優(yōu)化時序,則可能會多幾個延遲latency。
clocking options:Register last bit只有選擇可變長度時才可選,會把輸出寄存一拍以改善時序,同時增加一個時鐘的延遲。clock enable(CE)時鐘使能功能。
dimensions:width移位寄存器寬度,depth移位寄存器深度。
latency information:延遲信息,根據(jù)各個選項的不同,輸出延遲可能會增加1~3個時鐘周期。
第二頁內(nèi)容

initialization options:初始化選項,選擇初始化的進(jìn)制radix和默認(rèn)值default data。
COE file:初始化的值還可以選擇從COE文件來載入。
第三頁

power-on reset settings:上電復(fù)位設(shè)置選項,選擇上電復(fù)位的進(jìn)制radix和初始值init data。
synchronous settings:同步設(shè)置,可以設(shè)置同步復(fù)位SCLR和同步置位SSET,二者的優(yōu)先級可選,默認(rèn)復(fù)位優(yōu)先級高于置位,如果選擇置位優(yōu)先級更高,則會消耗多余的資源。復(fù)位/置位與初始化SINT二者之間互斥。這三個選項一般都沒必要用。
synchronous controls(sync) and clock enable(CE) priority:選擇同步控制信號和CE信號的優(yōu)先級。默認(rèn)同步控制信號的優(yōu)先級高于CE,反之則會消耗多余的資源。
IP核的仿真使用
定制一個深度為64,位寬為16的IP核,然后編寫RTL代碼:
//固定的深度64個時鐘周期,位寬16的移位寄存器IP核設(shè)計 module shift_w16_d64( inputclk,//時鐘信號 input[15:0]in,//移位前的輸入數(shù)據(jù),位寬為16 inputce,//時鐘使能信號 output[15:0]out//移位后的輸出,位寬為16 ); //移位寄存器IP;固定移位64個時鐘周期,位寬16 c_shift_ram_1 your_instance_name ( .D(in),//移位前的輸入數(shù)據(jù),位寬為16 .CLK(clk),//時鐘信號 .CE(ce),//時鐘使能信號 .Q(out)//移位后的輸出,位寬為16 ); endmodule
綜合后的資源使用情況:32個LUT + 32個FF。

看下綜合后的電路圖:

因為1個SRLC32E可以實現(xiàn)32個周期的移位,所以16×64的移位操作實際上只需要32個SRLC32E就可以實現(xiàn)了,為了改善時序性能,IP核在輸入端口和輸出端口一共用了2×16 = 32個FF來打拍寄存。
接下來編寫TB:時鐘使能信號一直拉高,輸入數(shù)據(jù)從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
//生成復(fù)位信號
initial begin
rst = 1'b1;//復(fù)位
#45 rst = 1'b0; //取消復(fù)位
end
//生成輸入數(shù)據(jù)與時鐘使能信號
always @(posedge clk or posedge rst)begin
if(rst)begin
in <= 16'd0;
ce <= 1'b0;
end
else begin
in <= in + 1'b1;//輸入數(shù)據(jù)累加1
ce <= 1'b1;//時鐘使能信號一直拉高
end
end
//仿真過程
initial begin
#1000 $stop;//關(guān)閉仿真
end
endmodule
仿真結(jié)果如下:

原文鏈接:
https://gitcode.csdn.net/65e6e9d51a836825ed787cef.html
-
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129943 -
Xilinx
+關(guān)注
關(guān)注
73文章
2200瀏覽量
131107 -
IP核
+關(guān)注
關(guān)注
4文章
344瀏覽量
51943
原文標(biāo)題:RAM-Based Shift Register Xilinx IP核的使用
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
想要仿真下Quartus中的Shift Register(RAM-based),但是modelsim仿...
移位寄存器Shift Register(RAM-based)的如何實現(xiàn)延時
xilinx FPGA的FFT IP核的調(diào)用
RAM—based shift register如何設(shè)置
RAM—based shift register如何設(shè)置
移位寄存器的輸出與時鐘不對齊
Gowin RAM Based Shift Register IP用戶指南
Gowin RAM Based Shift Register IP參考設(shè)計
Gowin RAM Based Shift Register IP用戶指南及參考設(shè)計
英創(chuàng)信息技術(shù)WinCE RAM-Based與Hive-Based注冊表介紹
Gowin RAM Based Shift Register用戶指南
Gowin RAM Based Shift Register參考設(shè)計
RAM-Based Shift Register Xilinx IP核的使用
評論