目录
一、前言
二、SRL_STYLE
2.1 移位寄存器实现方式
2.2 工程代码
2.3 参考资料
一、前言
移位寄存器SRL在工程中属于使用频率较高个模块,可用于存储数据,实现串并转换;
根据数据移动方向可分为左移寄存器,右移寄存器,左移是向数据高位移动,右移是向数据低位移动。
二、SRL_STYLE
2.1 移位寄存器实现方式
移位寄存器的实现方式多样,可以用寄存器,LUT,以及寄存器+LUT组合来实现,以及块状RAM来实现,对于采用哪种方式,Vivado提供了属性SRL_STYLE来控制生成方式,SRL_STYLE的可选值有6个,register,srl,srl_reg,reg_srl,reg_srl_reg,block,含义如下
register: 只使用寄存器来实现,不使用LUT资源
srl:不使用寄存器资源,只使用LUT来实现
srl_reg:同时使用LUT和寄存器来实现,并将寄存器放在最后一级
reg_srl: 同时使用寄存器和LUT资源来实现,寄存器放在第一级
reg_srl_reg:同时使用寄存器和LUT资源来实现,第一级和最后一级都为寄存器
block:使用块状RAM来实现
不同的实现方式主要是对资源和时序的影响不同,通常,如果要时序性能佳,尽量避免最后一级用LUT来实现,如果是移位的深度较大,建议使用Block ram实现,可节省寄存器和LUT资源。
2.2 工程代码
此处为一个12位右移寄存器的代码,设置实现方式为register
`timescale 1ns / 1ps
module srl_style( d,ce,clk,out );
parameter len=12;
input d,ce,clk;
output out;
(* SRL_STYLE="block"*) reg [len-1:0] srl; //使用寄存器来实现移位寄存器
always@(posedge clk)
begin
if(ce==1'b1)
srl[len-1:1]<=srl[len-2:0];
srl[0]<=d;
end
assign out=srl[len-1];
endmodule
综合结果如下图,通过网表图可布局布线结果可知,使用了12个FDRE来实现
将属性SRL_STYLE改为SRL,实现使用了SRL16E,无寄存器
将属性SRL_STYLE改为BLOCK,此时实现采用了RAMB 18E1
2.3 参考资料
用户手册:ug901-vivado-synthesis.pdf