FPGA开发过程中经常会使用到移位寄存器,使用移位寄存器一般是为了将某个信号进行打拍,使得时序符合我们的需求。最常见的一种打拍方法就是在process过程语句中对信号进行移位(在verilog中是在always过程中进行移位)。XilinxFPGA中提供的一个原语SRL6E,可以最大实现16位移位寄存的移位寄存器。 需要注意的是,SRL16E原语在不同的器件中表现形式可能稍有区别,下面是在Artix-7系列器件中的SRL16E原语:
代码语言:c复制 // SRL16E: 16-bit shift register LUT with clock enable operating
// on posedge of clock (Mapped to a SliceM LUT6)
// Artix-7
// Xilinx HDL Language Template, version 2020.1
SRL16E #(
.INIT(16'h0000) // Initial Value of Shift Register 对寄存器进行初始化
) SRL16E_inst (
.Q(Q), // SRL data output 寄存器输出端口
.A0(A0), // Select[0] input四位输出位选择控制地址
.A1(A1), // Select[1] input
.A2(A2), // Select[2] input
.A3(A3), // Select[3] input
.CE(CE), // Clock enable input寄存器使能端口
.CLK(CLK), // Clock input 时钟端口
.D(D) // SRL data input 寄存器输入端口
);
example:
代码语言:javascript复制`timescale 1ns / 1ps
module SRL16E_Test(
input clk_in,
output wResetQ,
output wEnableN
);
wire wResetQ;
wire wEnableN;
SRL16E #( .INIT( 16'hFF00 ) ) mReset
( .CLK ( clk_in ),
.CE ( 1'b1 ),
.A0 ( 1'b1 ), .A1( 1'b1 ), .A2( 1'b1 ), .A3( 1'b1 ), //选择第16位输出
.D ( 1'b0 ),
.Q ( wResetQ ) );
SRL16E #( .INIT( 16'h000F ) ) mEnable
( .CLK ( clk_in ),
.CE ( 1'b1 ),
.A0 ( 1'b1 ), .A1( 1'b1 ), .A2( 1'b1 ), .A3( 1'b1 ), //选择第16位输出
.D ( 1'b1 ),
.Q ( wEnableN ) );
endmodule
Testbench:
代码语言:javascript复制`timescale 1ns / 1ps
module tb_SRL16E;
reg clk_in;
wire wResetQ;
wire wEnableN;
always #10 clk_in <= ~clk_in; //时钟信号50M
initial begin
clk_in = 1'b1;
end
SRL16E_Test u_SRL16E(
.clk_in (clk_in ),
.wResetQ (wResetQ ),
.wEnableN (wEnableN )
);
endmodule
Waveform